diff --git a/jaas-client/dist/bundle.js b/jaas-client/dist/bundle.js
deleted file mode 100644
index fbef4df..0000000
--- a/jaas-client/dist/bundle.js
+++ /dev/null
@@ -1,4216 +0,0 @@
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = "./jaas-client/src/index.js");
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayLikeToArray; });\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayWithHoles; });\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayWithoutHoles; });\n/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js":
-/*!**************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***!
-  \**************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _assertThisInitialized; });\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _classCallCheck; });\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createClass; });\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _extends; });\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _inheritsLoose; });\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _iterableToArray; });\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***!
-  \*************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _iterableToArrayLimit; });\nfunction _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _nonIterableRest; });\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _nonIterableSpread; });\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js ***!
-  \****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _objectWithoutProperties; });\n/* harmony import */ var _objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = Object(_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(source, excluded);\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***!
-  \*********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _objectWithoutPropertiesLoose; });\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _slicedToArray; });\n/* harmony import */ var _arrayWithHoles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\");\n/* harmony import */ var _iterableToArrayLimit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\");\n/* harmony import */ var _unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableRest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\");\n\n\n\n\nfunction _slicedToArray(arr, i) {\n  return Object(_arrayWithHoles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || Object(_iterableToArrayLimit__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr, i) || Object(_unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr, i) || Object(_nonIterableRest__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _toConsumableArray; });\n/* harmony import */ var _arrayWithoutHoles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\");\n/* harmony import */ var _iterableToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js\");\n/* harmony import */ var _unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableSpread__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableSpread */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\");\n\n\n\n\nfunction _toConsumableArray(arr) {\n  return Object(_arrayWithoutHoles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || Object(_iterableToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr) || Object(_unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr) || Object(_nonIterableSpread__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _typeof; });\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***!
-  \*******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _unsupportedIterableToArray; });\n/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/extends.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/extends.js ***!
-  \********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("function _extends() {\n  module.exports = _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/extends.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js ***!
-  \**********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _internal_svg_icons_Person__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/svg-icons/Person */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexShrink: 0,\n      width: 40,\n      height: 40,\n      fontFamily: theme.typography.fontFamily,\n      fontSize: theme.typography.pxToRem(20),\n      lineHeight: 1,\n      borderRadius: '50%',\n      overflow: 'hidden',\n      userSelect: 'none'\n    },\n\n    /* Styles applied to the root element if not `src` or `srcSet`. */\n    colorDefault: {\n      color: theme.palette.background.default,\n      backgroundColor: theme.palette.type === 'light' ? theme.palette.grey[400] : theme.palette.grey[600]\n    },\n\n    /* Styles applied to the root element if `variant=\"circle\"`. */\n    circle: {},\n\n    /* Styles applied to the root element if `variant=\"rounded\"`. */\n    rounded: {\n      borderRadius: theme.shape.borderRadius\n    },\n\n    /* Styles applied to the root element if `variant=\"square\"`. */\n    square: {\n      borderRadius: 0\n    },\n\n    /* Styles applied to the img element if either `src` or `srcSet` is defined. */\n    img: {\n      width: '100%',\n      height: '100%',\n      textAlign: 'center',\n      // Handle non-square image. The property isn't supported by IE 11.\n      objectFit: 'cover',\n      // Hide alt text.\n      color: 'transparent',\n      // Hide the image broken icon, only works on Chrome.\n      textIndent: 10000\n    },\n\n    /* Styles applied to the fallback icon */\n    fallback: {\n      width: '75%',\n      height: '75%'\n    }\n  };\n};\n\nfunction useLoaded(_ref) {\n  var src = _ref.src,\n      srcSet = _ref.srcSet;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      loaded = _React$useState[0],\n      setLoaded = _React$useState[1];\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (!src && !srcSet) {\n      return undefined;\n    }\n\n    setLoaded(false);\n    var active = true;\n    var image = new Image();\n    image.src = src;\n    image.srcSet = srcSet;\n\n    image.onload = function () {\n      if (!active) {\n        return;\n      }\n\n      setLoaded('loaded');\n    };\n\n    image.onerror = function () {\n      if (!active) {\n        return;\n      }\n\n      setLoaded('error');\n    };\n\n    return function () {\n      active = false;\n    };\n  }, [src, srcSet]);\n  return loaded;\n}\n\nvar Avatar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Avatar(props, ref) {\n  var alt = props.alt,\n      childrenProp = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      imgProps = props.imgProps,\n      sizes = props.sizes,\n      src = props.src,\n      srcSet = props.srcSet,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'circle' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"alt\", \"children\", \"classes\", \"className\", \"component\", \"imgProps\", \"sizes\", \"src\", \"srcSet\", \"variant\"]);\n\n  var children = null; // Use a hook instead of onError on the img element to support server-side rendering.\n\n  var loaded = useLoaded({\n    src: src,\n    srcSet: srcSet\n  });\n  var hasImg = src || srcSet;\n  var hasImgNotFailing = hasImg && loaded !== 'error';\n\n  if (hasImgNotFailing) {\n    children = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"img\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      alt: alt,\n      src: src,\n      srcSet: srcSet,\n      sizes: sizes,\n      className: classes.img\n    }, imgProps));\n  } else if (childrenProp != null) {\n    children = childrenProp;\n  } else if (hasImg && alt) {\n    children = alt[0];\n  } else {\n    children = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_Person__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n      className: classes.fallback\n    });\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes.system, classes[variant], className, !hasImgNotFailing && classes.colorDefault),\n    ref: ref\n  }, other), children);\n});\n true ? Avatar.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Used in combination with `src` or `srcSet` to\n   * provide an alt attribute for the rendered `img` element.\n   */\n  alt: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Used to render icon or text elements inside the Avatar if `src` is not set.\n   * This can be an element, or just a string.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Attributes applied to the `img` element if the component is used to display an image.\n   * It can be used to listen for the loading error event.\n   */\n  imgProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The `sizes` attribute for the `img` element.\n   */\n  sizes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The `src` attribute for the `img` element.\n   */\n  src: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The `srcSet` attribute for the `img` element.\n   * Use this attribute for responsive image display.\n   */\n  srcSet: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The shape of the avatar.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['circle', 'rounded', 'square'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiAvatar'\n})(Avatar));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Avatar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Avatar */ \"./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Avatar__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    // Improve scrollable dialog support.\n    zIndex: -1,\n    position: 'fixed',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    right: 0,\n    bottom: 0,\n    top: 0,\n    left: 0,\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    WebkitTapHighlightColor: 'transparent'\n  },\n\n  /* Styles applied to the root element if `invisible={true}`. */\n  invisible: {\n    backgroundColor: 'transparent'\n  }\n};\nvar Backdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Backdrop(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$invisible = props.invisible,\n      invisible = _props$invisible === void 0 ? false : _props$invisible,\n      open = props.open,\n      transitionDuration = props.transitionDuration,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Fade__WEBPACK_IMPORTED_MODULE_6__[\"default\"] : _props$TransitionComp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"invisible\", \"open\", \"transitionDuration\", \"TransitionComponent\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    in: open,\n    timeout: transitionDuration\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, invisible && classes.invisible),\n    \"aria-hidden\": true,\n    ref: ref\n  }, children));\n});\n true ? Backdrop.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the backdrop is invisible.\n   * It can be used when rendering a popover or a custom select component.\n   */\n  invisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number\n  })])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiBackdrop'\n})(Backdrop));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Backdrop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Backdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Backdrop__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js ***!
-  \*******************************************************************/
-/*! exports provided: styleFunction, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styleFunction\", function() { return styleFunction; });\n/* harmony import */ var _material_ui_system__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/system */ \"./jaas-client/node_modules/@material-ui/system/esm/index.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles/styled */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js\");\n\n\nvar styleFunction = Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"css\"])(Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"compose\"])(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"borders\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"display\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"flexbox\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"grid\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"positions\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"palette\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"shadows\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"sizing\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"spacing\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"typography\"]));\n/**\n * @ignore - do not document.\n */\n\nvar Box = Object(_styles_styled__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('div')(styleFunction, {\n  name: 'MuiBox'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Box);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Box/index.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Box/index.js ***!
-  \*********************************************************************/
-/*! exports provided: default, styleFunction */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Box__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Box */ \"./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Box__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"styleFunction\", function() { return _Box__WEBPACK_IMPORTED_MODULE_0__[\"styleFunction\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Box/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.button, {\n      boxSizing: 'border-box',\n      minWidth: 64,\n      padding: '6px 16px',\n      borderRadius: theme.shape.borderRadius,\n      color: theme.palette.text.primary,\n      transition: theme.transitions.create(['background-color', 'box-shadow', 'border'], {\n        duration: theme.transitions.duration.short\n      }),\n      '&:hover': {\n        textDecoration: 'none',\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.text.primary, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        },\n        '&$disabled': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    }),\n\n    /* Styles applied to the span element that wraps the children. */\n    label: {\n      width: '100%',\n      // Ensure the correct width for iOS Safari\n      display: 'inherit',\n      alignItems: 'inherit',\n      justifyContent: 'inherit'\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"`. */\n    text: {\n      padding: '6px 8px'\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"` and `color=\"primary\"`. */\n    textPrimary: {\n      color: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"` and `color=\"secondary\"`. */\n    textSecondary: {\n      color: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      padding: '5px 15px',\n      border: \"1px solid \".concat(theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'),\n      '&$disabled': {\n        border: \"1px solid \".concat(theme.palette.action.disabledBackground)\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"primary\"`. */\n    outlinedPrimary: {\n      color: theme.palette.primary.main,\n      border: \"1px solid \".concat(Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, 0.5)),\n      '&:hover': {\n        border: \"1px solid \".concat(theme.palette.primary.main),\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"secondary\"`. */\n    outlinedSecondary: {\n      color: theme.palette.secondary.main,\n      border: \"1px solid \".concat(Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, 0.5)),\n      '&:hover': {\n        border: \"1px solid \".concat(theme.palette.secondary.main),\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        border: \"1px solid \".concat(theme.palette.action.disabled)\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"`. */\n    contained: {\n      color: theme.palette.getContrastText(theme.palette.grey[300]),\n      backgroundColor: theme.palette.grey[300],\n      boxShadow: theme.shadows[2],\n      '&:hover': {\n        backgroundColor: theme.palette.grey.A100,\n        boxShadow: theme.shadows[4],\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          boxShadow: theme.shadows[2],\n          backgroundColor: theme.palette.grey[300]\n        },\n        '&$disabled': {\n          backgroundColor: theme.palette.action.disabledBackground\n        }\n      },\n      '&$focusVisible': {\n        boxShadow: theme.shadows[6]\n      },\n      '&:active': {\n        boxShadow: theme.shadows[8]\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled,\n        boxShadow: theme.shadows[0],\n        backgroundColor: theme.palette.action.disabledBackground\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"` and `color=\"primary\"`. */\n    containedPrimary: {\n      color: theme.palette.primary.contrastText,\n      backgroundColor: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: theme.palette.primary.dark,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: theme.palette.primary.main\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"` and `color=\"secondary\"`. */\n    containedSecondary: {\n      color: theme.palette.secondary.contrastText,\n      backgroundColor: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: theme.palette.secondary.dark,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: theme.palette.secondary.main\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `disableElevation={true}`. */\n    disableElevation: {\n      boxShadow: 'none',\n      '&:hover': {\n        boxShadow: 'none'\n      },\n      '&$focusVisible': {\n        boxShadow: 'none'\n      },\n      '&:active': {\n        boxShadow: 'none'\n      },\n      '&$disabled': {\n        boxShadow: 'none'\n      }\n    },\n\n    /* Pseudo-class applied to the ButtonBase root element if the button is keyboard focused. */\n    focusVisible: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit',\n      borderColor: 'currentColor'\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"text\"`. */\n    textSizeSmall: {\n      padding: '4px 5px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"text\"`. */\n    textSizeLarge: {\n      padding: '8px 11px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"outlined\"`. */\n    outlinedSizeSmall: {\n      padding: '3px 9px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"outlined\"`. */\n    outlinedSizeLarge: {\n      padding: '7px 21px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"contained\"`. */\n    containedSizeSmall: {\n      padding: '4px 10px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"contained\"`. */\n    containedSizeLarge: {\n      padding: '8px 22px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"`. */\n    sizeSmall: {},\n\n    /* Styles applied to the root element if `size=\"large\"`. */\n    sizeLarge: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {\n      width: '100%'\n    },\n\n    /* Styles applied to the startIcon element if supplied. */\n    startIcon: {\n      display: 'inherit',\n      marginRight: 8,\n      marginLeft: -4,\n      '&$iconSizeSmall': {\n        marginLeft: -2\n      }\n    },\n\n    /* Styles applied to the endIcon element if supplied. */\n    endIcon: {\n      display: 'inherit',\n      marginRight: -4,\n      marginLeft: 8,\n      '&$iconSizeSmall': {\n        marginRight: -2\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"small\"`. */\n    iconSizeSmall: {\n      '& > *:first-child': {\n        fontSize: 18\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"medium\"`. */\n    iconSizeMedium: {\n      '& > *:first-child': {\n        fontSize: 20\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"large\"`. */\n    iconSizeLarge: {\n      '& > *:first-child': {\n        fontSize: 22\n      }\n    }\n  };\n};\nvar Button = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Button(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'default' : _props$color,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'button' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableElevati = props.disableElevation,\n      disableElevation = _props$disableElevati === void 0 ? false : _props$disableElevati,\n      _props$disableFocusRi = props.disableFocusRipple,\n      disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n      endIconProp = props.endIcon,\n      focusVisibleClassName = props.focusVisibleClassName,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      startIconProp = props.startIcon,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'button' : _props$type,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'text' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"disableElevation\", \"disableFocusRipple\", \"endIcon\", \"focusVisibleClassName\", \"fullWidth\", \"size\", \"startIcon\", \"type\", \"variant\"]);\n\n  var startIcon = startIconProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.startIcon, classes[\"iconSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))])\n  }, startIconProp);\n  var endIcon = endIconProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.endIcon, classes[\"iconSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))])\n  }, endIconProp);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ButtonBase__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[variant], className, color === 'inherit' ? classes.colorInherit : color !== 'default' && classes[\"\".concat(variant).concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(color))], size !== 'medium' && [classes[\"\".concat(variant, \"Size\").concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))], classes[\"size\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))]], disableElevation && classes.disableElevation, disabled && classes.disabled, fullWidth && classes.fullWidth),\n    component: component,\n    disabled: disabled,\n    focusRipple: !disableFocusRipple,\n    focusVisibleClassName: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.focusVisible, focusVisibleClassName),\n    ref: ref,\n    type: type\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: classes.label\n  }, startIcon, children, endIcon));\n});\n true ? Button.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the button.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, no elevation is used.\n   */\n  disableElevation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the  keyboard focus ripple will be disabled.\n   */\n  disableFocusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   *\n   * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n   * to highlight the element by applying separate styles with the `focusVisibleClassName`.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Element placed after the children.\n   */\n  endIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the button will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The URL to link to when the button is clicked.\n   * If defined, an `a` element will be used as the root node.\n   */\n  href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The size of the button.\n   * `small` is equivalent to the dense button styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['large', 'medium', 'small']),\n\n  /**\n   * Element placed before the children.\n   */\n  startIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['button', 'reset', 'submit']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['contained', 'outlined', 'text'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiButton'\n})(Button));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Button/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Button/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Button__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Button/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useIsFocusVisible */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js\");\n/* harmony import */ var _TouchRipple__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TouchRipple */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    position: 'relative',\n    WebkitTapHighlightColor: 'transparent',\n    backgroundColor: 'transparent',\n    // Reset default value\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0,\n    border: 0,\n    margin: 0,\n    // Remove the margin in Safari\n    borderRadius: 0,\n    padding: 0,\n    // Remove the padding in Firefox\n    cursor: 'pointer',\n    userSelect: 'none',\n    verticalAlign: 'middle',\n    '-moz-appearance': 'none',\n    // Reset\n    '-webkit-appearance': 'none',\n    // Reset\n    textDecoration: 'none',\n    // So we take precedent over the style of a native <a /> element.\n    color: 'inherit',\n    '&::-moz-focus-inner': {\n      borderStyle: 'none' // Remove Firefox dotted outline.\n\n    },\n    '&$disabled': {\n      pointerEvents: 'none',\n      // Disable link interactions\n      cursor: 'default'\n    },\n    '@media print': {\n      colorAdjust: 'exact'\n    }\n  },\n\n  /* Pseudo-class applied to the root element if `disabled={true}`. */\n  disabled: {},\n\n  /* Pseudo-class applied to the root element if keyboard focused. */\n  focusVisible: {}\n};\n/**\n * `ButtonBase` contains as few styles as possible.\n * It aims to be a simple building block for creating a button.\n * It contains a load of style reset and some focus/ripple logic.\n */\n\nvar ButtonBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function ButtonBase(props, ref) {\n  var action = props.action,\n      buttonRefProp = props.buttonRef,\n      _props$centerRipple = props.centerRipple,\n      centerRipple = _props$centerRipple === void 0 ? false : _props$centerRipple,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'button' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableRipple = props.disableRipple,\n      disableRipple = _props$disableRipple === void 0 ? false : _props$disableRipple,\n      _props$disableTouchRi = props.disableTouchRipple,\n      disableTouchRipple = _props$disableTouchRi === void 0 ? false : _props$disableTouchRi,\n      _props$focusRipple = props.focusRipple,\n      focusRipple = _props$focusRipple === void 0 ? false : _props$focusRipple,\n      focusVisibleClassName = props.focusVisibleClassName,\n      onBlur = props.onBlur,\n      onClick = props.onClick,\n      onFocus = props.onFocus,\n      onFocusVisible = props.onFocusVisible,\n      onKeyDown = props.onKeyDown,\n      onKeyUp = props.onKeyUp,\n      onMouseDown = props.onMouseDown,\n      onMouseLeave = props.onMouseLeave,\n      onMouseUp = props.onMouseUp,\n      onTouchEnd = props.onTouchEnd,\n      onTouchMove = props.onTouchMove,\n      onTouchStart = props.onTouchStart,\n      onDragLeave = props.onDragLeave,\n      _props$tabIndex = props.tabIndex,\n      tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,\n      TouchRippleProps = props.TouchRippleProps,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'button' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onClick\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"onDragLeave\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n\n  var buttonRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  function getButtonNode() {\n    // #StrictMode ready\n    return react_dom__WEBPACK_IMPORTED_MODULE_4__[\"findDOMNode\"](buttonRef.current);\n  }\n\n  var rippleRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      focusVisible = _React$useState[0],\n      setFocusVisible = _React$useState[1];\n\n  if (disabled && focusVisible) {\n    setFocusVisible(false);\n  }\n\n  var _useIsFocusVisible = Object(_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(),\n      isFocusVisible = _useIsFocusVisible.isFocusVisible,\n      onBlurVisible = _useIsFocusVisible.onBlurVisible,\n      focusVisibleRef = _useIsFocusVisible.ref;\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](action, function () {\n    return {\n      focusVisible: function focusVisible() {\n        setFocusVisible(true);\n        buttonRef.current.focus();\n      }\n    };\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (focusVisible && focusRipple && !disableRipple) {\n      rippleRef.current.pulsate();\n    }\n  }, [disableRipple, focusRipple, focusVisible]);\n\n  function useRippleHandler(rippleAction, eventCallback) {\n    var skipRippleAction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : disableTouchRipple;\n    return Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n      if (eventCallback) {\n        eventCallback(event);\n      }\n\n      var ignore = skipRippleAction;\n\n      if (!ignore && rippleRef.current) {\n        rippleRef.current[rippleAction](event);\n      }\n\n      return true;\n    });\n  }\n\n  var handleMouseDown = useRippleHandler('start', onMouseDown);\n  var handleDragLeave = useRippleHandler('stop', onDragLeave);\n  var handleMouseUp = useRippleHandler('stop', onMouseUp);\n  var handleMouseLeave = useRippleHandler('stop', function (event) {\n    if (focusVisible) {\n      event.preventDefault();\n    }\n\n    if (onMouseLeave) {\n      onMouseLeave(event);\n    }\n  });\n  var handleTouchStart = useRippleHandler('start', onTouchStart);\n  var handleTouchEnd = useRippleHandler('stop', onTouchEnd);\n  var handleTouchMove = useRippleHandler('stop', onTouchMove);\n  var handleBlur = useRippleHandler('stop', function (event) {\n    if (focusVisible) {\n      onBlurVisible(event);\n      setFocusVisible(false);\n    }\n\n    if (onBlur) {\n      onBlur(event);\n    }\n  }, false);\n  var handleFocus = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // Fix for https://github.com/facebook/react/issues/7769\n    if (!buttonRef.current) {\n      buttonRef.current = event.currentTarget;\n    }\n\n    if (isFocusVisible(event)) {\n      setFocusVisible(true);\n\n      if (onFocusVisible) {\n        onFocusVisible(event);\n      }\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n  });\n\n  var isNonNativeButton = function isNonNativeButton() {\n    var button = getButtonNode();\n    return component && component !== 'button' && !(button.tagName === 'A' && button.href);\n  };\n  /**\n   * IE 11 shim for https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat\n   */\n\n\n  var keydownRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](false);\n  var handleKeyDown = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // Check if key is already down to avoid repeats being counted as multiple activations\n    if (focusRipple && !keydownRef.current && focusVisible && rippleRef.current && event.key === ' ') {\n      keydownRef.current = true;\n      event.persist();\n      rippleRef.current.stop(event, function () {\n        rippleRef.current.start(event);\n      });\n    }\n\n    if (event.target === event.currentTarget && isNonNativeButton() && event.key === ' ') {\n      event.preventDefault();\n    }\n\n    if (onKeyDown) {\n      onKeyDown(event);\n    } // Keyboard accessibility for non interactive elements\n\n\n    if (event.target === event.currentTarget && isNonNativeButton() && event.key === 'Enter' && !disabled) {\n      event.preventDefault();\n\n      if (onClick) {\n        onClick(event);\n      }\n    }\n  });\n  var handleKeyUp = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // calling preventDefault in keyUp on a <button> will not dispatch a click event if Space is pressed\n    // https://codesandbox.io/s/button-keyup-preventdefault-dn7f0\n    if (focusRipple && event.key === ' ' && rippleRef.current && focusVisible && !event.defaultPrevented) {\n      keydownRef.current = false;\n      event.persist();\n      rippleRef.current.stop(event, function () {\n        rippleRef.current.pulsate(event);\n      });\n    }\n\n    if (onKeyUp) {\n      onKeyUp(event);\n    } // Keyboard accessibility for non interactive elements\n\n\n    if (onClick && event.target === event.currentTarget && isNonNativeButton() && event.key === ' ' && !event.defaultPrevented) {\n      onClick(event);\n    }\n  });\n  var ComponentProp = component;\n\n  if (ComponentProp === 'button' && other.href) {\n    ComponentProp = 'a';\n  }\n\n  var buttonProps = {};\n\n  if (ComponentProp === 'button') {\n    buttonProps.type = type;\n    buttonProps.disabled = disabled;\n  } else {\n    if (ComponentProp !== 'a' || !other.href) {\n      buttonProps.role = 'button';\n    }\n\n    buttonProps['aria-disabled'] = disabled;\n  }\n\n  var handleUserRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(buttonRefProp, ref);\n  var handleOwnRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(focusVisibleRef, buttonRef);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(handleUserRef, handleOwnRef);\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      mountedState = _React$useState2[0],\n      setMountedState = _React$useState2[1];\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    setMountedState(true);\n  }, []);\n  var enableTouchRipple = mountedState && !disableRipple && !disabled;\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n      if (enableTouchRipple && !rippleRef.current) {\n        console.error(['Material-UI: The `component` prop provided to ButtonBase is invalid.', 'Please make sure the children prop is rendered in this custom component.'].join('\\n'));\n      }\n    }, [enableTouchRipple]);\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](ComponentProp, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, focusVisible && [classes.focusVisible, focusVisibleClassName], disabled && classes.disabled),\n    onBlur: handleBlur,\n    onClick: onClick,\n    onFocus: handleFocus,\n    onKeyDown: handleKeyDown,\n    onKeyUp: handleKeyUp,\n    onMouseDown: handleMouseDown,\n    onMouseLeave: handleMouseLeave,\n    onMouseUp: handleMouseUp,\n    onDragLeave: handleDragLeave,\n    onTouchEnd: handleTouchEnd,\n    onTouchMove: handleTouchMove,\n    onTouchStart: handleTouchStart,\n    ref: handleRef,\n    tabIndex: disabled ? -1 : tabIndex\n  }, buttonProps, other), children, enableTouchRipple ?\n  /*#__PURE__*/\n\n  /* TouchRipple is only needed client-side, x2 boost on the server. */\n  react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_TouchRipple__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    ref: rippleRef,\n    center: centerRipple\n  }, TouchRippleProps)) : null);\n});\n true ? ButtonBase.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A ref for imperative actions.\n   * It currently only supports `focusVisible()` action.\n   */\n  action: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /**\n   * @ignore\n   *\n   * Use that prop to pass a ref to the native button component.\n   * @deprecated Use `ref` instead.\n   */\n  buttonRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /**\n   * If `true`, the ripples will be centered.\n   * They won't start at the cursor interaction position.\n   */\n  centerRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"elementTypeAcceptingRef\"],\n\n  /**\n   * If `true`, the base button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   *\n   * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n   * to highlight the element by applying separate styles with the `focusVisibleClassName`.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the touch ripple effect will be disabled.\n   */\n  disableTouchRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the base button will have a keyboard focus ripple.\n   */\n  focusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * This prop can help a person know which element has the keyboard focus.\n   * The class name will be applied when the element gain the focus through a keyboard interaction.\n   * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\n   * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/master/explainer.md).\n   * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components\n   * if needed.\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onDragLeave: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is focused with a keyboard.\n   * We trigger a `onFocus` callback too.\n   */\n  onFocusVisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseUp: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchEnd: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchMove: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchStart: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Props applied to the `TouchRipple` element.\n   */\n  TouchRippleProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['button', 'reset', 'submit']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(styles, {\n  name: 'MuiButtonBase'\n})(ButtonBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n\n\n\n\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"];\n/**\n * @ignore - internal component.\n */\n\nfunction Ripple(props) {\n  var classes = props.classes,\n      _props$pulsate = props.pulsate,\n      pulsate = _props$pulsate === void 0 ? false : _props$pulsate,\n      rippleX = props.rippleX,\n      rippleY = props.rippleY,\n      rippleSize = props.rippleSize,\n      inProp = props.in,\n      _props$onExited = props.onExited,\n      onExited = _props$onExited === void 0 ? function () {} : _props$onExited,\n      timeout = props.timeout;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](false),\n      leaving = _React$useState[0],\n      setLeaving = _React$useState[1];\n\n  var rippleClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.ripple, classes.rippleVisible, pulsate && classes.ripplePulsate);\n  var rippleStyles = {\n    width: rippleSize,\n    height: rippleSize,\n    top: -(rippleSize / 2) + rippleY,\n    left: -(rippleSize / 2) + rippleX\n  };\n  var childClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.child, leaving && classes.childLeaving, pulsate && classes.childPulsate);\n  var handleExited = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(onExited); // Ripple is used for user feedback (e.g. click or press) so we want to apply styles with the highest priority\n\n  useEnhancedEffect(function () {\n    if (!inProp) {\n      // react-transition-group#onExit\n      setLeaving(true); // react-transition-group#onExited\n\n      var timeoutId = setTimeout(handleExited, timeout);\n      return function () {\n        clearTimeout(timeoutId);\n      };\n    }\n\n    return undefined;\n  }, [handleExited, inProp, timeout]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n    className: rippleClassName,\n    style: rippleStyles\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n    className: childClassName\n  }));\n}\n\n true ? Ripple.propTypes = {\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n\n  /**\n   * @ignore - injected from TransitionGroup\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n  /**\n   * @ignore - injected from TransitionGroup\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n\n  /**\n   * If `true`, the ripple pulsates, typically indicating the keyboard focus state of an element.\n   */\n  pulsate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n  /**\n   * Diameter of the ripple.\n   */\n  rippleSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * Horizontal position of the ripple center.\n   */\n  rippleX: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * Vertical position of the ripple center.\n   */\n  rippleY: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * exit delay\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Ripple);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js ***!
-  \**********************************************************************************/
-/*! exports provided: DELAY_RIPPLE, styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DELAY_RIPPLE\", function() { return DELAY_RIPPLE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Ripple__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Ripple */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js\");\n\n\n\n\n\n\n\n\n\nvar DURATION = 550;\nvar DELAY_RIPPLE = 80;\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      overflow: 'hidden',\n      pointerEvents: 'none',\n      position: 'absolute',\n      zIndex: 0,\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      borderRadius: 'inherit'\n    },\n\n    /* Styles applied to the internal `Ripple` components `ripple` class. */\n    ripple: {\n      opacity: 0,\n      position: 'absolute'\n    },\n\n    /* Styles applied to the internal `Ripple` components `rippleVisible` class. */\n    rippleVisible: {\n      opacity: 0.3,\n      transform: 'scale(1)',\n      animation: \"$enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n    },\n\n    /* Styles applied to the internal `Ripple` components `ripplePulsate` class. */\n    ripplePulsate: {\n      animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n    },\n\n    /* Styles applied to the internal `Ripple` components `child` class. */\n    child: {\n      opacity: 1,\n      display: 'block',\n      width: '100%',\n      height: '100%',\n      borderRadius: '50%',\n      backgroundColor: 'currentColor'\n    },\n\n    /* Styles applied to the internal `Ripple` components `childLeaving` class. */\n    childLeaving: {\n      opacity: 0,\n      animation: \"$exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n    },\n\n    /* Styles applied to the internal `Ripple` components `childPulsate` class. */\n    childPulsate: {\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      animation: \"$pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\")\n    },\n    '@keyframes enter': {\n      '0%': {\n        transform: 'scale(0)',\n        opacity: 0.1\n      },\n      '100%': {\n        transform: 'scale(1)',\n        opacity: 0.3\n      }\n    },\n    '@keyframes exit': {\n      '0%': {\n        opacity: 1\n      },\n      '100%': {\n        opacity: 0\n      }\n    },\n    '@keyframes pulsate': {\n      '0%': {\n        transform: 'scale(1)'\n      },\n      '50%': {\n        transform: 'scale(0.92)'\n      },\n      '100%': {\n        transform: 'scale(1)'\n      }\n    }\n  };\n};\n/**\n * @ignore - internal component.\n *\n * TODO v5: Make private\n */\n\nvar TouchRipple = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function TouchRipple(props, ref) {\n  var _props$center = props.center,\n      centerProp = _props$center === void 0 ? false : _props$center,\n      classes = props.classes,\n      className = props.className,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"center\", \"classes\", \"className\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__[\"useState\"]([]),\n      ripples = _React$useState[0],\n      setRipples = _React$useState[1];\n\n  var nextKey = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](0);\n  var rippleCallback = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (rippleCallback.current) {\n      rippleCallback.current();\n      rippleCallback.current = null;\n    }\n  }, [ripples]); // Used to filter out mouse emulated events on mobile.\n\n  var ignoringMouseDown = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](false); // We use a timer in order to only show the ripples for touch \"click\" like events.\n  // We don't want to display the ripple for touch scroll events.\n\n  var startTimer = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null); // This is the hook called once the previous timeout is ready.\n\n  var startTimerCommit = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var container = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    return function () {\n      clearTimeout(startTimer.current);\n    };\n  }, []);\n  var startCommit = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (params) {\n    var pulsate = params.pulsate,\n        rippleX = params.rippleX,\n        rippleY = params.rippleY,\n        rippleSize = params.rippleSize,\n        cb = params.cb;\n    setRipples(function (oldRipples) {\n      return [].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(oldRipples), [/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_Ripple__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n        key: nextKey.current,\n        classes: classes,\n        timeout: DURATION,\n        pulsate: pulsate,\n        rippleX: rippleX,\n        rippleY: rippleY,\n        rippleSize: rippleSize\n      })]);\n    });\n    nextKey.current += 1;\n    rippleCallback.current = cb;\n  }, [classes]);\n  var start = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function () {\n    var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var cb = arguments.length > 2 ? arguments[2] : undefined;\n    var _options$pulsate = options.pulsate,\n        pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n        _options$center = options.center,\n        center = _options$center === void 0 ? centerProp || options.pulsate : _options$center,\n        _options$fakeElement = options.fakeElement,\n        fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n\n    if (event.type === 'mousedown' && ignoringMouseDown.current) {\n      ignoringMouseDown.current = false;\n      return;\n    }\n\n    if (event.type === 'touchstart') {\n      ignoringMouseDown.current = true;\n    }\n\n    var element = fakeElement ? null : container.current;\n    var rect = element ? element.getBoundingClientRect() : {\n      width: 0,\n      height: 0,\n      left: 0,\n      top: 0\n    }; // Get the size of the ripple\n\n    var rippleX;\n    var rippleY;\n    var rippleSize;\n\n    if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n      rippleX = Math.round(rect.width / 2);\n      rippleY = Math.round(rect.height / 2);\n    } else {\n      var _ref = event.touches ? event.touches[0] : event,\n          clientX = _ref.clientX,\n          clientY = _ref.clientY;\n\n      rippleX = Math.round(clientX - rect.left);\n      rippleY = Math.round(clientY - rect.top);\n    }\n\n    if (center) {\n      rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n      if (rippleSize % 2 === 0) {\n        rippleSize += 1;\n      }\n    } else {\n      var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n      var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n      rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n    } // Touche devices\n\n\n    if (event.touches) {\n      // check that this isn't another touchstart due to multitouch\n      // otherwise we will only clear a single timer when unmounting while two\n      // are running\n      if (startTimerCommit.current === null) {\n        // Prepare the ripple effect.\n        startTimerCommit.current = function () {\n          startCommit({\n            pulsate: pulsate,\n            rippleX: rippleX,\n            rippleY: rippleY,\n            rippleSize: rippleSize,\n            cb: cb\n          });\n        }; // Delay the execution of the ripple effect.\n\n\n        startTimer.current = setTimeout(function () {\n          if (startTimerCommit.current) {\n            startTimerCommit.current();\n            startTimerCommit.current = null;\n          }\n        }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n      }\n    } else {\n      startCommit({\n        pulsate: pulsate,\n        rippleX: rippleX,\n        rippleY: rippleY,\n        rippleSize: rippleSize,\n        cb: cb\n      });\n    }\n  }, [centerProp, startCommit]);\n  var pulsate = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function () {\n    start({}, {\n      pulsate: true\n    });\n  }, [start]);\n  var stop = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (event, cb) {\n    clearTimeout(startTimer.current); // The touch interaction occurs too quickly.\n    // We still want to show ripple effect.\n\n    if (event.type === 'touchend' && startTimerCommit.current) {\n      event.persist();\n      startTimerCommit.current();\n      startTimerCommit.current = null;\n      startTimer.current = setTimeout(function () {\n        stop(event, cb);\n      });\n      return;\n    }\n\n    startTimerCommit.current = null;\n    setRipples(function (oldRipples) {\n      if (oldRipples.length > 0) {\n        return oldRipples.slice(1);\n      }\n\n      return oldRipples;\n    });\n    rippleCallback.current = cb;\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useImperativeHandle\"](ref, function () {\n    return {\n      pulsate: pulsate,\n      start: start,\n      stop: stop\n    };\n  }, [pulsate, start, stop]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(classes.root, className),\n    ref: container\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"TransitionGroup\"], {\n    component: null,\n    exit: true\n  }, ripples));\n});\n true ? TouchRipple.propTypes = {\n  /**\n   * If `true`, the ripple starts at the center of the component\n   * rather than at the point of interaction.\n   */\n  center: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  flip: false,\n  name: 'MuiTouchRipple'\n})( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"memo\"](TouchRipple)));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ButtonBase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _internal_SwitchBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/SwitchBase */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js\");\n/* harmony import */ var _internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../internal/svg-icons/CheckBoxOutlineBlank */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js\");\n/* harmony import */ var _internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/svg-icons/CheckBox */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../internal/svg-icons/IndeterminateCheckBox */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      color: theme.palette.text.secondary\n    },\n\n    /* Pseudo-class applied to the root element if `checked={true}`. */\n    checked: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `indeterminate={true}`. */\n    indeterminate: {},\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      '&$checked': {\n        color: theme.palette.primary.main,\n        '&:hover': {\n          backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n          // Reset on touch devices, it doesn't add specificity\n          '@media (hover: none)': {\n            backgroundColor: 'transparent'\n          }\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      '&$checked': {\n        color: theme.palette.secondary.main,\n        '&:hover': {\n          backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n          // Reset on touch devices, it doesn't add specificity\n          '@media (hover: none)': {\n            backgroundColor: 'transparent'\n          }\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    }\n  };\n};\nvar defaultCheckedIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null);\nvar defaultIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null);\nvar defaultIndeterminateIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null);\nvar Checkbox = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Checkbox(props, ref) {\n  var _props$checkedIcon = props.checkedIcon,\n      checkedIcon = _props$checkedIcon === void 0 ? defaultCheckedIcon : _props$checkedIcon,\n      classes = props.classes,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'secondary' : _props$color,\n      _props$icon = props.icon,\n      iconProp = _props$icon === void 0 ? defaultIcon : _props$icon,\n      _props$indeterminate = props.indeterminate,\n      indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate,\n      _props$indeterminateI = props.indeterminateIcon,\n      indeterminateIconProp = _props$indeterminateI === void 0 ? defaultIndeterminateIcon : _props$indeterminateI,\n      inputProps = props.inputProps,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"checkedIcon\", \"classes\", \"color\", \"icon\", \"indeterminate\", \"indeterminateIcon\", \"inputProps\", \"size\"]);\n\n  var icon = indeterminate ? indeterminateIconProp : iconProp;\n  var indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_SwitchBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    type: \"checkbox\",\n    classes: {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(color))], indeterminate && classes.indeterminate),\n      checked: classes.checked,\n      disabled: classes.disabled\n    },\n    color: color,\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      'data-indeterminate': indeterminate\n    }, inputProps),\n    icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](icon, {\n      fontSize: icon.props.fontSize === undefined && size === \"small\" ? size : icon.props.fontSize\n    }),\n    checkedIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](indeterminateIcon, {\n      fontSize: indeterminateIcon.props.fontSize === undefined && size === \"small\" ? size : indeterminateIcon.props.fontSize\n    }),\n    ref: ref\n  }, other));\n});\n true ? Checkbox.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the component is checked.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is checked.\n   */\n  checkedIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the checkbox will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is unchecked.\n   */\n  icon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the component appears indeterminate.\n   * This does not set the native input element to indeterminate due\n   * to inconsistent behavior across browsers.\n   * However, we set a `data-indeterminate` attribute on the input.\n   */\n  indeterminate: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is indeterminate.\n   */\n  indeterminateIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The size of the checkbox.\n   * `small` is equivalent to the dense checkbox styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * The value of the component. The DOM API casts this to a string.\n   * The browser uses \"on\" as the default value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_12__[\"default\"])(styles, {\n  name: 'MuiCheckbox'\n})(Checkbox));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Checkbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Checkbox */ \"./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Checkbox__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js ***!
-  \*********************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\nvar SIZE = 44;\n\nfunction getRelativeValue(value, min, max) {\n  return (Math.min(Math.max(min, value), max) - min) / (max - min);\n}\n\nfunction easeOut(t) {\n  t = getRelativeValue(t, 0, 1); // https://gist.github.com/gre/1650294\n\n  t = (t -= 1) * t * t + 1;\n  return t;\n}\n\nfunction easeIn(t) {\n  return t * t;\n}\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'inline-block'\n    },\n\n    /* Styles applied to the root element if `variant=\"static\"`. */\n    static: {\n      transition: theme.transitions.create('transform')\n    },\n\n    /* Styles applied to the root element if `variant=\"indeterminate\"`. */\n    indeterminate: {\n      animation: '$circular-rotate 1.4s linear infinite'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the `svg` element. */\n    svg: {\n      display: 'block' // Keeps the progress centered\n\n    },\n\n    /* Styles applied to the `circle` svg path. */\n    circle: {\n      stroke: 'currentColor' // Use butt to follow the specification, by chance, it's already the default CSS value.\n      // strokeLinecap: 'butt',\n\n    },\n\n    /* Styles applied to the `circle` svg path if `variant=\"static\"`. */\n    circleStatic: {\n      transition: theme.transitions.create('stroke-dashoffset')\n    },\n\n    /* Styles applied to the `circle` svg path if `variant=\"indeterminate\"`. */\n    circleIndeterminate: {\n      animation: '$circular-dash 1.4s ease-in-out infinite',\n      // Some default value that looks fine waiting for the animation to kicks in.\n      strokeDasharray: '80px, 200px',\n      strokeDashoffset: '0px' // Add the unit to fix a Edge 16 and below bug.\n\n    },\n    '@keyframes circular-rotate': {\n      '0%': {\n        // Fix IE 11 wobbly\n        transformOrigin: '50% 50%'\n      },\n      '100%': {\n        transform: 'rotate(360deg)'\n      }\n    },\n    '@keyframes circular-dash': {\n      '0%': {\n        strokeDasharray: '1px, 200px',\n        strokeDashoffset: '0px'\n      },\n      '50%': {\n        strokeDasharray: '100px, 200px',\n        strokeDashoffset: '-15px'\n      },\n      '100%': {\n        strokeDasharray: '100px, 200px',\n        strokeDashoffset: '-125px'\n      }\n    },\n\n    /* Styles applied to the `circle` svg path if `disableShrink={true}`. */\n    circleDisableShrink: {\n      animation: 'none'\n    }\n  };\n};\n/**\n * ## ARIA\n *\n * If the progress bar is describing the loading progress of a particular region of a page,\n * you should use `aria-describedby` to point to the progress bar, and set the `aria-busy`\n * attribute to `true` on that region until it has finished loading.\n */\n\nvar CircularProgress = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function CircularProgress(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$disableShrink = props.disableShrink,\n      disableShrink = _props$disableShrink === void 0 ? false : _props$disableShrink,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 40 : _props$size,\n      style = props.style,\n      _props$thickness = props.thickness,\n      thickness = _props$thickness === void 0 ? 3.6 : _props$thickness,\n      _props$value = props.value,\n      value = _props$value === void 0 ? 0 : _props$value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'indeterminate' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"color\", \"disableShrink\", \"size\", \"style\", \"thickness\", \"value\", \"variant\"]);\n\n  var circleStyle = {};\n  var rootStyle = {};\n  var rootProps = {};\n\n  if (variant === 'determinate' || variant === 'static') {\n    var circumference = 2 * Math.PI * ((SIZE - thickness) / 2);\n    circleStyle.strokeDasharray = circumference.toFixed(3);\n    rootProps['aria-valuenow'] = Math.round(value);\n\n    if (variant === 'static') {\n      circleStyle.strokeDashoffset = \"\".concat(((100 - value) / 100 * circumference).toFixed(3), \"px\");\n      rootStyle.transform = 'rotate(-90deg)';\n    } else {\n      circleStyle.strokeDashoffset = \"\".concat((easeIn((100 - value) / 100) * circumference).toFixed(3), \"px\");\n      rootStyle.transform = \"rotate(\".concat((easeOut(value / 70) * 270).toFixed(3), \"deg)\");\n    }\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'inherit' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(color))], {\n      'indeterminate': classes.indeterminate,\n      'static': classes.static\n    }[variant]),\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      width: size,\n      height: size\n    }, rootStyle, style),\n    ref: ref,\n    role: \"progressbar\"\n  }, rootProps, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"svg\", {\n    className: classes.svg,\n    viewBox: \"\".concat(SIZE / 2, \" \").concat(SIZE / 2, \" \").concat(SIZE, \" \").concat(SIZE)\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"circle\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.circle, disableShrink && classes.circleDisableShrink, {\n      'indeterminate': classes.circleIndeterminate,\n      'static': classes.circleStatic\n    }[variant]),\n    style: circleStyle,\n    cx: SIZE,\n    cy: SIZE,\n    r: (SIZE - thickness) / 2,\n    fill: \"none\",\n    strokeWidth: thickness\n  })));\n});\n true ? CircularProgress.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['inherit', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the shrink animation is disabled.\n   * This only works if variant is `indeterminate`.\n   */\n  disableShrink: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, function (props) {\n    if (props.disableShrink && props.variant && props.variant !== 'indeterminate') {\n      return new Error('Material-UI: You have provided the `disableShrink` prop ' + 'with a variant other than `indeterminate`. This will have no effect.');\n    }\n\n    return null;\n  }),\n\n  /**\n   * The size of the circle.\n   * If using a number, the pixel unit is assumed.\n   * If using a string, you need to provide the CSS unit, e.g '3rem'.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The thickness of the circle.\n   */\n  thickness: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * The value of the progress indicator for the determinate and static variants.\n   * Value between 0 and 100.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * The variant to use.\n   * Use indeterminate when there is no progress value.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['determinate', 'indeterminate', 'static'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiCircularProgress',\n  flip: false\n})(CircularProgress));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CircularProgress__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CircularProgress */ \"./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _CircularProgress__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      width: '100%',\n      marginLeft: 'auto',\n      boxSizing: 'border-box',\n      marginRight: 'auto',\n      paddingLeft: theme.spacing(2),\n      paddingRight: theme.spacing(2),\n      display: 'block'\n    }, theme.breakpoints.up('sm'), {\n      paddingLeft: theme.spacing(3),\n      paddingRight: theme.spacing(3)\n    }),\n\n    /* Styles applied to the root element if `disableGutters={true}`. */\n    disableGutters: {\n      paddingLeft: 0,\n      paddingRight: 0\n    },\n\n    /* Styles applied to the root element if `fixed={true}`. */\n    fixed: Object.keys(theme.breakpoints.values).reduce(function (acc, breakpoint) {\n      var value = theme.breakpoints.values[breakpoint];\n\n      if (value !== 0) {\n        acc[theme.breakpoints.up(breakpoint)] = {\n          maxWidth: value\n        };\n      }\n\n      return acc;\n    }, {}),\n\n    /* Styles applied to the root element if `maxWidth=\"xs\"`. */\n    maxWidthXs: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('xs'), {\n      maxWidth: Math.max(theme.breakpoints.values.xs, 444)\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"sm\"`. */\n    maxWidthSm: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('sm'), {\n      maxWidth: theme.breakpoints.values.sm\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"md\"`. */\n    maxWidthMd: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('md'), {\n      maxWidth: theme.breakpoints.values.md\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"lg\"`. */\n    maxWidthLg: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('lg'), {\n      maxWidth: theme.breakpoints.values.lg\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"xl\"`. */\n    maxWidthXl: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('xl'), {\n      maxWidth: theme.breakpoints.values.xl\n    })\n  };\n};\nvar Container = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Container(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      _props$fixed = props.fixed,\n      fixed = _props$fixed === void 0 ? false : _props$fixed,\n      _props$maxWidth = props.maxWidth,\n      maxWidth = _props$maxWidth === void 0 ? 'lg' : _props$maxWidth,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"disableGutters\", \"fixed\", \"maxWidth\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, fixed && classes.fixed, disableGutters && classes.disableGutters, maxWidth !== false && classes[\"maxWidth\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(String(maxWidth)))]),\n    ref: ref\n  }, other));\n});\n true ? Container.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Set the max-width to match the min-width of the current breakpoint.\n   * This is useful if you'd prefer to design for a fixed set of sizes\n   * instead of trying to accommodate a fully fluid viewport.\n   * It's fluid by default.\n   */\n  fixed: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Determine the max-width of the container.\n   * The container width grows with the size of the screen.\n   * Set to `false` to disable `maxWidth`.\n   */\n  maxWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['lg', 'md', 'sm', 'xl', 'xs', false])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiContainer'\n})(Container));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Container/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Container/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Container */ \"./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Container__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Container/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js ***!
-  \***********************************************************************************/
-/*! exports provided: html, body, styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"html\", function() { return html; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"body\", function() { return body; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n\n\n\nvar html = {\n  WebkitFontSmoothing: 'antialiased',\n  // Antialiasing.\n  MozOsxFontSmoothing: 'grayscale',\n  // Antialiasing.\n  // Change from `box-sizing: content-box` so that `width`\n  // is not affected by `padding` or `border`.\n  boxSizing: 'border-box'\n};\nvar body = function body(theme) {\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    color: theme.palette.text.primary\n  }, theme.typography.body2, {\n    backgroundColor: theme.palette.background.default,\n    '@media print': {\n      // Save printer ink.\n      backgroundColor: theme.palette.common.white\n    }\n  });\n};\nvar styles = function styles(theme) {\n  return {\n    '@global': {\n      html: html,\n      '*, *::before, *::after': {\n        boxSizing: 'inherit'\n      },\n      'strong, b': {\n        fontWeight: theme.typography.fontWeightBold\n      },\n      body: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        margin: 0\n      }, body(theme), {\n        // Add support for document.body.requestFullScreen().\n        // Other elements, if background transparent, are not supported.\n        '&::backdrop': {\n          backgroundColor: theme.palette.background.default\n        }\n      })\n    }\n  };\n};\n/**\n * Kickstart an elegant, consistent, and simple baseline to build upon.\n */\n\nfunction CssBaseline(props) {\n  /* eslint-disable no-unused-vars */\n  var _props$children = props.children,\n      children = _props$children === void 0 ? null : _props$children,\n      classes = props.classes;\n  /* eslint-enable no-unused-vars */\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_1__[\"Fragment\"], null, children);\n}\n\n true ? CssBaseline.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * You can wrap a node.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  CssBaseline['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"exactProp\"])(CssBaseline.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(styles, {\n  name: 'MuiCssBaseline'\n})(CssBaseline));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CssBaseline__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CssBaseline */ \"./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _CssBaseline__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js\");\n/* harmony import */ var _Backdrop__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Backdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js\");\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js\");\n/* harmony import */ var _styles_transitions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      '@media print': {\n        // Use !important to override the Modal inline-style.\n        position: 'absolute !important'\n      }\n    },\n\n    /* Styles applied to the container element if `scroll=\"paper\"`. */\n    scrollPaper: {\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n\n    /* Styles applied to the container element if `scroll=\"body\"`. */\n    scrollBody: {\n      overflowY: 'auto',\n      overflowX: 'hidden',\n      textAlign: 'center',\n      '&:after': {\n        content: '\"\"',\n        display: 'inline-block',\n        verticalAlign: 'middle',\n        height: '100%',\n        width: '0'\n      }\n    },\n\n    /* Styles applied to the container element. */\n    container: {\n      height: '100%',\n      '@media print': {\n        height: 'auto'\n      },\n      // We disable the focus ring for mouse, touch and keyboard users.\n      outline: 0\n    },\n\n    /* Styles applied to the `Paper` component. */\n    paper: {\n      margin: 32,\n      position: 'relative',\n      overflowY: 'auto',\n      // Fix IE 11 issue, to remove at some point.\n      '@media print': {\n        overflowY: 'visible',\n        boxShadow: 'none'\n      }\n    },\n\n    /* Styles applied to the `Paper` component if `scroll=\"paper\"`. */\n    paperScrollPaper: {\n      display: 'flex',\n      flexDirection: 'column',\n      maxHeight: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `scroll=\"body\"`. */\n    paperScrollBody: {\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      textAlign: 'left' // 'initial' doesn't work on IE 11\n\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=false`. */\n    paperWidthFalse: {\n      maxWidth: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"xs\"`. */\n    paperWidthXs: {\n      maxWidth: Math.max(theme.breakpoints.values.xs, 444),\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(Math.max(theme.breakpoints.values.xs, 444) + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"sm\"`. */\n    paperWidthSm: {\n      maxWidth: theme.breakpoints.values.sm,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.sm + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"md\"`. */\n    paperWidthMd: {\n      maxWidth: theme.breakpoints.values.md,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.md + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"lg\"`. */\n    paperWidthLg: {\n      maxWidth: theme.breakpoints.values.lg,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.lg + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"xl\"`. */\n    paperWidthXl: {\n      maxWidth: theme.breakpoints.values.xl,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.xl + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `fullWidth={true}`. */\n    paperFullWidth: {\n      width: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `fullScreen={true}`. */\n    paperFullScreen: {\n      margin: 0,\n      width: '100%',\n      maxWidth: '100%',\n      height: '100%',\n      maxHeight: 'none',\n      borderRadius: 0,\n      '&$paperScrollBody': {\n        margin: 0,\n        maxWidth: '100%'\n      }\n    }\n  };\n};\nvar defaultTransitionDuration = {\n  enter: _styles_transitions__WEBPACK_IMPORTED_MODULE_11__[\"duration\"].enteringScreen,\n  exit: _styles_transitions__WEBPACK_IMPORTED_MODULE_11__[\"duration\"].leavingScreen\n};\n/**\n * Dialogs are overlaid modal paper based components with a backdrop.\n */\n\nvar Dialog = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Dialog(props, ref) {\n  var BackdropProps = props.BackdropProps,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$disableBackdro = props.disableBackdropClick,\n      disableBackdropClick = _props$disableBackdro === void 0 ? false : _props$disableBackdro,\n      _props$disableEscapeK = props.disableEscapeKeyDown,\n      disableEscapeKeyDown = _props$disableEscapeK === void 0 ? false : _props$disableEscapeK,\n      _props$fullScreen = props.fullScreen,\n      fullScreen = _props$fullScreen === void 0 ? false : _props$fullScreen,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$maxWidth = props.maxWidth,\n      maxWidth = _props$maxWidth === void 0 ? 'sm' : _props$maxWidth,\n      onBackdropClick = props.onBackdropClick,\n      onClose = props.onClose,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onEscapeKeyDown = props.onEscapeKeyDown,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      open = props.open,\n      _props$PaperComponent = props.PaperComponent,\n      PaperComponent = _props$PaperComponent === void 0 ? _Paper__WEBPACK_IMPORTED_MODULE_12__[\"default\"] : _props$PaperComponent,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      _props$scroll = props.scroll,\n      scroll = _props$scroll === void 0 ? 'paper' : _props$scroll,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Fade__WEBPACK_IMPORTED_MODULE_10__[\"default\"] : _props$TransitionComp,\n      _props$transitionDura = props.transitionDuration,\n      transitionDuration = _props$transitionDura === void 0 ? defaultTransitionDuration : _props$transitionDura,\n      TransitionProps = props.TransitionProps,\n      ariaDescribedby = props['aria-describedby'],\n      ariaLabelledby = props['aria-labelledby'],\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"BackdropProps\", \"children\", \"classes\", \"className\", \"disableBackdropClick\", \"disableEscapeKeyDown\", \"fullScreen\", \"fullWidth\", \"maxWidth\", \"onBackdropClick\", \"onClose\", \"onEnter\", \"onEntered\", \"onEntering\", \"onEscapeKeyDown\", \"onExit\", \"onExited\", \"onExiting\", \"open\", \"PaperComponent\", \"PaperProps\", \"scroll\", \"TransitionComponent\", \"transitionDuration\", \"TransitionProps\", \"aria-describedby\", \"aria-labelledby\"]);\n\n  var mouseDownTarget = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n\n  var handleMouseDown = function handleMouseDown(event) {\n    mouseDownTarget.current = event.target;\n  };\n\n  var handleBackdropClick = function handleBackdropClick(event) {\n    // Ignore the events not coming from the \"backdrop\"\n    // We don't want to close the dialog when clicking the dialog content.\n    if (event.target !== event.currentTarget) {\n      return;\n    } // Make sure the event starts and ends on the same DOM element.\n\n\n    if (event.target !== mouseDownTarget.current) {\n      return;\n    }\n\n    mouseDownTarget.current = null;\n\n    if (onBackdropClick) {\n      onBackdropClick(event);\n    }\n\n    if (!disableBackdropClick && onClose) {\n      onClose(event, 'backdropClick');\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_Modal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n    BackdropComponent: _Backdrop__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n    BackdropProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      transitionDuration: transitionDuration\n    }, BackdropProps),\n    closeAfterTransition: true,\n    disableBackdropClick: disableBackdropClick,\n    disableEscapeKeyDown: disableEscapeKeyDown,\n    onEscapeKeyDown: onEscapeKeyDown,\n    onClose: onClose,\n    open: open,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: open,\n    timeout: transitionDuration,\n    onEnter: onEnter,\n    onEntering: onEntering,\n    onEntered: onEntered,\n    onExit: onExit,\n    onExiting: onExiting,\n    onExited: onExited,\n    role: \"none presentation\"\n  }, TransitionProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"div\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.container, classes[\"scroll\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(scroll))]),\n    onMouseUp: handleBackdropClick,\n    onMouseDown: handleMouseDown\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](PaperComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    elevation: 24,\n    role: \"dialog\",\n    \"aria-describedby\": ariaDescribedby,\n    \"aria-labelledby\": ariaLabelledby\n  }, PaperProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.paper, classes[\"paperScroll\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(scroll))], classes[\"paperWidth\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(String(maxWidth)))], PaperProps.className, fullScreen && classes.paperFullScreen, fullWidth && classes.paperFullWidth)\n  }), children))));\n});\n true ? Dialog.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The id(s) of the element(s) that describe the dialog.\n   */\n  'aria-describedby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The id(s) of the element(s) that label the dialog.\n   */\n  'aria-labelledby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  BackdropProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Dialog children, usually the included sub-components.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, clicking the backdrop will not fire the `onClose` callback.\n   */\n  disableBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, hitting escape will not fire the `onClose` callback.\n   */\n  disableEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the dialog will be full-screen\n   */\n  fullScreen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the dialog stretches to `maxWidth`.\n   *\n   * Notice that the dialog width grow is limited by the default margin.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Determine the max-width of the dialog.\n   * The dialog width grows with the size of the screen.\n   * Set to `false` to disable `maxWidth`.\n   */\n  maxWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['lg', 'md', 'sm', 'xl', 'xs', false]),\n\n  /**\n   * Callback fired when the backdrop is clicked.\n   */\n  onBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the dialog enters.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the escape key is pressed,\n   * `disableKeyboard` is false and the modal is in focus.\n   */\n  onEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the dialog exits.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the Dialog is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * The component used to render the body of the dialog.\n   */\n  PaperComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * Props applied to the [`Paper`](/api/paper/) element.\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Determine the container for scrolling the dialog.\n   */\n  scroll: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['body', 'paper']),\n\n  /**\n   * The component used for the transition.\n   * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n   */\n  TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })]),\n\n  /**\n   * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.\n   */\n  TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiDialog'\n})(Dialog));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Dialog */ \"./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Dialog__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js ***!
-  \***********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    margin: 0,\n    padding: '16px 24px',\n    flex: '0 0 auto'\n  }\n};\nvar DialogTitle = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function DialogTitle(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$disableTypogra = props.disableTypography,\n      disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"disableTypography\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n    ref: ref\n  }, other), disableTypography ? children : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n    component: \"h2\",\n    variant: \"h6\"\n  }, children));\n});\n true ? DialogTitle.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the children won't be wrapped by a typography component.\n   * For instance, this can be useful to render an h4 instead of the default h2.\n   */\n  disableTypography: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiDialogTitle'\n})(DialogTitle));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _DialogTitle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DialogTitle */ \"./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _DialogTitle__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var _styles_transitions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _transitions_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../transitions/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  entering: {\n    opacity: 1\n  },\n  entered: {\n    opacity: 1\n  }\n};\nvar defaultTimeout = {\n  enter: _styles_transitions__WEBPACK_IMPORTED_MODULE_6__[\"duration\"].enteringScreen,\n  exit: _styles_transitions__WEBPACK_IMPORTED_MODULE_6__[\"duration\"].leavingScreen\n};\n/**\n * The Fade transition is used by the [Modal](/components/modal/) component.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nvar Fade = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Fade(props, ref) {\n  var children = props.children,\n      _props$disableStrictM = props.disableStrictModeCompat,\n      disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,\n      inProp = props.in,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      style = props.style,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"Transition\"] : _props$TransitionComp,\n      _props$timeout = props.timeout,\n      timeout = _props$timeout === void 0 ? defaultTimeout : _props$timeout,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"disableStrictModeCompat\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"TransitionComponent\", \"timeout\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;\n  var nodeRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var foreignRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(children.ref, ref);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(enableStrictModeCompat ? nodeRef : undefined, foreignRef);\n\n  var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {\n    return function (nodeOrAppearing, maybeAppearing) {\n      if (callback) {\n        var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],\n            _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, 2),\n            node = _ref2[0],\n            isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n\n        if (isAppearing === undefined) {\n          callback(node);\n        } else {\n          callback(node, isAppearing);\n        }\n      }\n    };\n  };\n\n  var handleEntering = normalizedTransitionCallback(onEntering);\n  var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {\n    Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"reflow\"])(node); // So the animation always start from the start.\n\n    var transitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'enter'\n    });\n    node.style.webkitTransition = theme.transitions.create('opacity', transitionProps);\n    node.style.transition = theme.transitions.create('opacity', transitionProps);\n\n    if (onEnter) {\n      onEnter(node, isAppearing);\n    }\n  });\n  var handleEntered = normalizedTransitionCallback(onEntered);\n  var handleExiting = normalizedTransitionCallback(onExiting);\n  var handleExit = normalizedTransitionCallback(function (node) {\n    var transitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'exit'\n    });\n    node.style.webkitTransition = theme.transitions.create('opacity', transitionProps);\n    node.style.transition = theme.transitions.create('opacity', transitionProps);\n\n    if (onExit) {\n      onExit(node);\n    }\n  });\n  var handleExited = normalizedTransitionCallback(onExited);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: inProp,\n    nodeRef: enableStrictModeCompat ? nodeRef : undefined,\n    onEnter: handleEnter,\n    onEntered: handleEntered,\n    onEntering: handleEntering,\n    onExit: handleExit,\n    onExited: handleExited,\n    onExiting: handleExiting,\n    timeout: timeout\n  }, other), function (state, childProps) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"cloneElement\"](children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        opacity: 0,\n        visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n      }, styles[state], style, children.props.style),\n      ref: handleRef\n    }, childProps));\n  });\n});\n true ? Fade.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.element,\n\n  /**\n   * Enable this prop if you encounter 'Function components cannot be given refs',\n   * use `unstable_createStrictModeTheme`,\n   * and can't forward the ref in the child component.\n   */\n  disableStrictModeCompat: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the component will transition in.\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Fade);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Fade__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js ***!
-  \***********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';\n  var backgroundColor = light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      backgroundColor: backgroundColor,\n      borderTopLeftRadius: theme.shape.borderRadius,\n      borderTopRightRadius: theme.shape.borderRadius,\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shorter,\n        easing: theme.transitions.easing.easeOut\n      }),\n      '&:hover': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.13)' : 'rgba(255, 255, 255, 0.13)',\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: backgroundColor\n        }\n      },\n      '&$focused': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)'\n      },\n      '&$disabled': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.12)' : 'rgba(255, 255, 255, 0.12)'\n      }\n    },\n\n    /* Styles applied to the root element if color secondary. */\n    colorSecondary: {\n      '&$underline:after': {\n        borderBottomColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if `disableUnderline={false}`. */\n    underline: {\n      '&:after': {\n        borderBottom: \"2px solid \".concat(theme.palette.primary.main),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\"',\n        position: 'absolute',\n        right: 0,\n        transform: 'scaleX(0)',\n        transition: theme.transitions.create('transform', {\n          duration: theme.transitions.duration.shorter,\n          easing: theme.transitions.easing.easeOut\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&$focused:after': {\n        transform: 'scaleX(1)'\n      },\n      '&$error:after': {\n        borderBottomColor: theme.palette.error.main,\n        transform: 'scaleX(1)' // error is always underlined in red\n\n      },\n      '&:before': {\n        borderBottom: \"1px solid \".concat(bottomLineColor),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\\\\00a0\"',\n        position: 'absolute',\n        right: 0,\n        transition: theme.transitions.create('border-bottom-color', {\n          duration: theme.transitions.duration.shorter\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&:hover:before': {\n        borderBottom: \"1px solid \".concat(theme.palette.text.primary)\n      },\n      '&$disabled:before': {\n        borderBottomStyle: 'dotted'\n      }\n    },\n\n    /* Pseudo-class applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {\n      paddingLeft: 12\n    },\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {\n      paddingRight: 12\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: '27px 12px 10px',\n      '&$marginDense': {\n        paddingTop: 23,\n        paddingBottom: 6\n      }\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      padding: '27px 12px 10px',\n      '&:-webkit-autofill': {\n        WebkitBoxShadow: theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\n        WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\n        caretColor: theme.palette.type === 'light' ? null : '#fff',\n        borderTopLeftRadius: 'inherit',\n        borderTopRightRadius: 'inherit'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 23,\n      paddingBottom: 6\n    },\n\n    /* Styles applied to the `input` if in `<FormControl hiddenLabel />`. */\n    inputHiddenLabel: {\n      paddingTop: 18,\n      paddingBottom: 19,\n      '&$inputMarginDense': {\n        paddingTop: 10,\n        paddingBottom: 11\n      }\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {\n      paddingLeft: 0\n    },\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {\n      paddingRight: 0\n    }\n  };\n};\nvar FilledInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FilledInput(props, ref) {\n  var disableUnderline = props.disableUnderline,\n      classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"disableUnderline\", \"classes\", \"fullWidth\", \"inputComponent\", \"multiline\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, !disableUnderline && classes.underline),\n      underline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? FilledInput.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will not have an underline.\n   */\n  disableUnderline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nFilledInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFilledInput'\n})(FilledInput));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FilledInput__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js ***!
-  \***********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _InputBase_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../InputBase/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js\");\n/* harmony import */ var _FormControlContext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    display: 'inline-flex',\n    flexDirection: 'column',\n    position: 'relative',\n    // Reset fieldset default style.\n    minWidth: 0,\n    padding: 0,\n    margin: 0,\n    border: 0,\n    verticalAlign: 'top' // Fix alignment issue on Safari.\n\n  },\n\n  /* Styles applied to the root element if `margin=\"normal\"`. */\n  marginNormal: {\n    marginTop: 16,\n    marginBottom: 8\n  },\n\n  /* Styles applied to the root element if `margin=\"dense\"`. */\n  marginDense: {\n    marginTop: 8,\n    marginBottom: 4\n  },\n\n  /* Styles applied to the root element if `fullWidth={true}`. */\n  fullWidth: {\n    width: '100%'\n  }\n};\n/**\n * Provides context such as filled/focused/error/required for form inputs.\n * Relying on the context provides high flexibility and ensures that the state always stays\n * consistent across the children of the `FormControl`.\n * This context is used by the following components:\n *\n *  - FormLabel\n *  - FormHelperText\n *  - Input\n *  - InputLabel\n *\n * You can find one composition example below and more going to [the demos](/components/text-fields/#components).\n *\n * ```jsx\n * <FormControl>\n *   <InputLabel htmlFor=\"my-input\">Email address</InputLabel>\n *   <Input id=\"my-input\" aria-describedby=\"my-helper-text\" />\n *   <FormHelperText id=\"my-helper-text\">We'll never share your email.</FormHelperText>\n * </FormControl>\n * ```\n *\n * ⚠️Only one input can be used within a FormControl.\n */\n\nvar FormControl = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormControl(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$error = props.error,\n      error = _props$error === void 0 ? false : _props$error,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      visuallyFocused = props.focused,\n      _props$hiddenLabel = props.hiddenLabel,\n      hiddenLabel = _props$hiddenLabel === void 0 ? false : _props$hiddenLabel,\n      _props$margin = props.margin,\n      margin = _props$margin === void 0 ? 'none' : _props$margin,\n      _props$required = props.required,\n      required = _props$required === void 0 ? false : _props$required,\n      size = props.size,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"error\", \"fullWidth\", \"focused\", \"hiddenLabel\", \"margin\", \"required\", \"size\", \"variant\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](function () {\n    // We need to iterate through the children and find the Input in order\n    // to fully support server-side rendering.\n    var initialAdornedStart = false;\n\n    if (children) {\n      react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child) {\n        if (!Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Input', 'Select'])) {\n          return;\n        }\n\n        var input = Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Select']) ? child.props.input : child;\n\n        if (input && Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_5__[\"isAdornedStart\"])(input.props)) {\n          initialAdornedStart = true;\n        }\n      });\n    }\n\n    return initialAdornedStart;\n  }),\n      adornedStart = _React$useState[0],\n      setAdornedStart = _React$useState[1];\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](function () {\n    // We need to iterate through the children and find the Input in order\n    // to fully support server-side rendering.\n    var initialFilled = false;\n\n    if (children) {\n      react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child) {\n        if (!Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Input', 'Select'])) {\n          return;\n        }\n\n        if (Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_5__[\"isFilled\"])(child.props, true)) {\n          initialFilled = true;\n        }\n      });\n    }\n\n    return initialFilled;\n  }),\n      filled = _React$useState2[0],\n      setFilled = _React$useState2[1];\n\n  var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      _focused = _React$useState3[0],\n      setFocused = _React$useState3[1];\n\n  var focused = visuallyFocused !== undefined ? visuallyFocused : _focused;\n\n  if (disabled && focused) {\n    setFocused(false);\n  }\n\n  var registerEffect;\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    var registeredInput = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](false);\n\n    registerEffect = function registerEffect() {\n      if (registeredInput.current) {\n        console.error(['Material-UI: There are multiple InputBase components inside a FormControl.', 'This is not supported. It might cause infinite rendering loops.', 'Only use one InputBase.'].join('\\n'));\n      }\n\n      registeredInput.current = true;\n      return function () {\n        registeredInput.current = false;\n      };\n    };\n  }\n\n  var onFilled = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    setFilled(true);\n  }, []);\n  var onEmpty = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    setFilled(false);\n  }, []);\n  var childContext = {\n    adornedStart: adornedStart,\n    setAdornedStart: setAdornedStart,\n    color: color,\n    disabled: disabled,\n    error: error,\n    filled: filled,\n    focused: focused,\n    fullWidth: fullWidth,\n    hiddenLabel: hiddenLabel,\n    margin: (size === 'small' ? 'dense' : undefined) || margin,\n    onBlur: function onBlur() {\n      setFocused(false);\n    },\n    onEmpty: onEmpty,\n    onFilled: onFilled,\n    onFocus: function onFocus() {\n      setFocused(true);\n    },\n    registerEffect: registerEffect,\n    required: required,\n    variant: variant\n  };\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormControlContext__WEBPACK_IMPORTED_MODULE_9__[\"default\"].Provider, {\n    value: childContext\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, margin !== 'none' && classes[\"margin\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(margin))], fullWidth && classes.fullWidth),\n    ref: ref\n  }, other), children));\n});\n true ? FormControl.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The contents of the form control.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the label, input and helper text should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will be displayed in focused state.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be hidden.\n   * This is used to increase density for a `FilledInput`.\n   * Be sure to add `aria-label` to the `input` element.\n   */\n  hiddenLabel: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense` or `normal`, will adjust vertical spacing of this and contained components.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none', 'normal']),\n\n  /**\n   * If `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The size of the text field.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiFormControl'\n})(FormControl));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js ***!
-  \******************************************************************************************/
-/*! exports provided: useFormControl, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useFormControl\", function() { return useFormControl; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * @ignore - internal component.\n */\n\nvar FormControlContext = react__WEBPACK_IMPORTED_MODULE_0__[\"createContext\"]();\n\nif (true) {\n  FormControlContext.displayName = 'FormControlContext';\n}\n\nfunction useFormControl() {\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"](FormControlContext);\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (FormControlContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js ***!
-  \****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return formControlState; });\nfunction formControlState(_ref) {\n  var props = _ref.props,\n      states = _ref.states,\n      muiFormControl = _ref.muiFormControl;\n  return states.reduce(function (acc, state) {\n    acc[state] = props[state];\n\n    if (muiFormControl) {\n      if (typeof props[state] === 'undefined') {\n        acc[state] = muiFormControl[state];\n      }\n    }\n\n    return acc;\n  }, {});\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default, useFormControl */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormControl__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _useFormControl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useFormControl\", function() { return _useFormControl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js":
-/*!**************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js ***!
-  \**************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useFormControl; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _FormControlContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n\n\nfunction useFormControl() {\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"](_FormControlContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js ***!
-  \*********************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'inline-flex',\n      alignItems: 'center',\n      cursor: 'pointer',\n      // For correct alignment with the text.\n      verticalAlign: 'middle',\n      WebkitTapHighlightColor: 'transparent',\n      marginLeft: -11,\n      marginRight: 16,\n      // used for row presentation of radio/checkbox\n      '&$disabled': {\n        cursor: 'default'\n      }\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"start\"`. */\n    labelPlacementStart: {\n      flexDirection: 'row-reverse',\n      marginLeft: 16,\n      // used for row presentation of radio/checkbox\n      marginRight: -11\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"top\"`. */\n    labelPlacementTop: {\n      flexDirection: 'column-reverse',\n      marginLeft: 16\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"bottom\"`. */\n    labelPlacementBottom: {\n      flexDirection: 'column',\n      marginLeft: 16\n    },\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the label's Typography component. */\n    label: {\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      }\n    }\n  };\n};\n/**\n * Drop in replacement of the `Radio`, `Switch` and `Checkbox` component.\n * Use this component if you want to display an extra label.\n */\n\nvar FormControlLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormControlLabel(props, ref) {\n  var checked = props.checked,\n      classes = props.classes,\n      className = props.className,\n      control = props.control,\n      disabledProp = props.disabled,\n      inputRef = props.inputRef,\n      label = props.label,\n      _props$labelPlacement = props.labelPlacement,\n      labelPlacement = _props$labelPlacement === void 0 ? 'end' : _props$labelPlacement,\n      name = props.name,\n      onChange = props.onChange,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"checked\", \"classes\", \"className\", \"control\", \"disabled\", \"inputRef\", \"label\", \"labelPlacement\", \"name\", \"onChange\", \"value\"]);\n\n  var muiFormControl = Object(_FormControl__WEBPACK_IMPORTED_MODULE_6__[\"useFormControl\"])();\n  var disabled = disabledProp;\n\n  if (typeof disabled === 'undefined' && typeof control.props.disabled !== 'undefined') {\n    disabled = control.props.disabled;\n  }\n\n  if (typeof disabled === 'undefined' && muiFormControl) {\n    disabled = muiFormControl.disabled;\n  }\n\n  var controlProps = {\n    disabled: disabled\n  };\n  ['checked', 'name', 'onChange', 'value', 'inputRef'].forEach(function (key) {\n    if (typeof control.props[key] === 'undefined' && typeof props[key] !== 'undefined') {\n      controlProps[key] = props[key];\n    }\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"label\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, labelPlacement !== 'end' && classes[\"labelPlacement\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(labelPlacement))], disabled && classes.disabled),\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](control, controlProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n    component: \"span\",\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.label, disabled && classes.disabled)\n  }, label));\n});\n true ? FormControlLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the component appears selected.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * A control element. For instance, it can be be a `Radio`, a `Switch` or a `Checkbox`.\n   */\n  control: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element.isRequired,\n\n  /**\n   * If `true`, the control will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The text to be used in an enclosing label element.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The position of the label.\n   */\n  labelPlacement: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'end', 'start', 'top']),\n\n  /**\n   * @ignore\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The value of the component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFormControlLabel'\n})(FormControlLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormControlLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormControlLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormControlLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js":
-/*!*****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js ***!
-  \*****************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      color: theme.palette.text.secondary\n    }, theme.typography.caption, {\n      textAlign: 'left',\n      marginTop: 3,\n      margin: 0,\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      },\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }),\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `margin=\"dense\"`. */\n    marginDense: {\n      marginTop: 4\n    },\n\n    /* Styles applied to the root element if `variant=\"filled\"` or `variant=\"outlined\"`. */\n    contained: {\n      marginLeft: 14,\n      marginRight: 14\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `filled={true}`. */\n    filled: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {}\n  };\n};\nvar FormHelperText = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormHelperText(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'p' : _props$component,\n      disabled = props.disabled,\n      error = props.error,\n      filled = props.filled,\n      focused = props.focused,\n      margin = props.margin,\n      required = props.required,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"component\", \"disabled\", \"error\", \"filled\", \"focused\", \"margin\", \"required\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant', 'margin', 'disabled', 'error', 'filled', 'focused', 'required']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, (fcs.variant === 'filled' || fcs.variant === 'outlined') && classes.contained, className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required, fcs.margin === 'dense' && classes.marginDense),\n    ref: ref\n  }, other), children === ' ' ?\n  /*#__PURE__*/\n  // eslint-disable-next-line react/no-danger\n  react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  }) : children);\n});\n true ? FormHelperText.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   *\n   * If `' '` is provided, the component reserves one line height for displaying a future message.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the helper text should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, helper text should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the helper text should use filled classes key.\n   */\n  filled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the helper text should use focused classes key.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense']),\n\n  /**\n   * If `true`, the helper text should use required classes key.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFormHelperText'\n})(FormHelperText));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormHelperText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormHelperText */ \"./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormHelperText__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      color: theme.palette.text.secondary\n    }, theme.typography.body1, {\n      lineHeight: 1,\n      padding: 0,\n      '&$focused': {\n        color: theme.palette.primary.main\n      },\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      },\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }),\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {\n      '&$focused': {\n        color: theme.palette.secondary.main\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `filled={true}`. */\n    filled: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {},\n\n    /* Styles applied to the asterisk element. */\n    asterisk: {\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }\n  };\n};\nvar FormLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormLabel(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      color = props.color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'label' : _props$component,\n      disabled = props.disabled,\n      error = props.error,\n      filled = props.filled,\n      focused = props.focused,\n      required = props.required,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"error\", \"filled\", \"focused\", \"required\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['color', 'required', 'focused', 'disabled', 'error', 'filled']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(fcs.color || 'primary'))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required),\n    ref: ref\n  }, other), children, fcs.required && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    \"aria-hidden\": true,\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.asterisk, fcs.error && classes.error)\n  }, \"\\u2009\", '*'));\n});\n true ? FormLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the label should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should use filled classes key.\n   */\n  filled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input of this label is focused (used by `FormGroup` components).\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiFormLabel'\n})(FormLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_requirePropFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/requirePropFactory */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js\");\n\n\n// A grid component using the following libs as inspiration.\n//\n// For the implementation:\n// - https://getbootstrap.com/docs/4.3/layout/grid/\n// - https://github.com/kristoferjoseph/flexboxgrid/blob/master/src/css/flexboxgrid.css\n// - https://github.com/roylee0704/react-flexbox-grid\n// - https://material.angularjs.org/latest/layout/introduction\n//\n// Follow this flexbox Guide to better understand the underlying model:\n// - https://css-tricks.com/snippets/css/a-guide-to-flexbox/\n\n\n\n\n\nvar SPACINGS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar GRID_SIZES = ['auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n\nfunction generateGrid(globalStyles, theme, breakpoint) {\n  var styles = {};\n  GRID_SIZES.forEach(function (size) {\n    var key = \"grid-\".concat(breakpoint, \"-\").concat(size);\n\n    if (size === true) {\n      // For the auto layouting\n      styles[key] = {\n        flexBasis: 0,\n        flexGrow: 1,\n        maxWidth: '100%'\n      };\n      return;\n    }\n\n    if (size === 'auto') {\n      styles[key] = {\n        flexBasis: 'auto',\n        flexGrow: 0,\n        maxWidth: 'none'\n      };\n      return;\n    } // Keep 7 significant numbers.\n\n\n    var width = \"\".concat(Math.round(size / 12 * 10e7) / 10e5, \"%\"); // Close to the bootstrap implementation:\n    // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41\n\n    styles[key] = {\n      flexBasis: width,\n      flexGrow: 0,\n      maxWidth: width\n    };\n  }); // No need for a media query for the first size.\n\n  if (breakpoint === 'xs') {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(globalStyles, styles);\n  } else {\n    globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n  }\n}\n\nfunction getOffset(val) {\n  var div = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var parse = parseFloat(val);\n  return \"\".concat(parse / div).concat(String(val).replace(String(parse), '') || 'px');\n}\n\nfunction generateGutter(theme, breakpoint) {\n  var styles = {};\n  SPACINGS.forEach(function (spacing) {\n    var themeSpacing = theme.spacing(spacing);\n\n    if (themeSpacing === 0) {\n      return;\n    }\n\n    styles[\"spacing-\".concat(breakpoint, \"-\").concat(spacing)] = {\n      margin: \"-\".concat(getOffset(themeSpacing, 2)),\n      width: \"calc(100% + \".concat(getOffset(themeSpacing), \")\"),\n      '& > $item': {\n        padding: getOffset(themeSpacing, 2)\n      }\n    };\n  });\n  return styles;\n} // Default CSS values\n// flex: '0 1 auto',\n// flexDirection: 'row',\n// alignItems: 'flex-start',\n// flexWrap: 'nowrap',\n// justifyContent: 'flex-start',\n\n\nvar styles = function styles(theme) {\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    /* Styles applied to the root element. */\n    root: {},\n\n    /* Styles applied to the root element if `container={true}`. */\n    container: {\n      boxSizing: 'border-box',\n      display: 'flex',\n      flexWrap: 'wrap',\n      width: '100%'\n    },\n\n    /* Styles applied to the root element if `item={true}`. */\n    item: {\n      boxSizing: 'border-box',\n      margin: '0' // For instance, it's useful when used with a `figure` element.\n\n    },\n\n    /* Styles applied to the root element if `zeroMinWidth={true}`. */\n    zeroMinWidth: {\n      minWidth: 0\n    },\n\n    /* Styles applied to the root element if `direction=\"column\"`. */\n    'direction-xs-column': {\n      flexDirection: 'column'\n    },\n\n    /* Styles applied to the root element if `direction=\"column-reverse\"`. */\n    'direction-xs-column-reverse': {\n      flexDirection: 'column-reverse'\n    },\n\n    /* Styles applied to the root element if `direction=\"row-reverse\"`. */\n    'direction-xs-row-reverse': {\n      flexDirection: 'row-reverse'\n    },\n\n    /* Styles applied to the root element if `wrap=\"nowrap\"`. */\n    'wrap-xs-nowrap': {\n      flexWrap: 'nowrap'\n    },\n\n    /* Styles applied to the root element if `wrap=\"reverse\"`. */\n    'wrap-xs-wrap-reverse': {\n      flexWrap: 'wrap-reverse'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"center\"`. */\n    'align-items-xs-center': {\n      alignItems: 'center'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"flex-start\"`. */\n    'align-items-xs-flex-start': {\n      alignItems: 'flex-start'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"flex-end\"`. */\n    'align-items-xs-flex-end': {\n      alignItems: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"baseline\"`. */\n    'align-items-xs-baseline': {\n      alignItems: 'baseline'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"center\"`. */\n    'align-content-xs-center': {\n      alignContent: 'center'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"flex-start\"`. */\n    'align-content-xs-flex-start': {\n      alignContent: 'flex-start'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"flex-end\"`. */\n    'align-content-xs-flex-end': {\n      alignContent: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"space-between\"`. */\n    'align-content-xs-space-between': {\n      alignContent: 'space-between'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"space-around\"`. */\n    'align-content-xs-space-around': {\n      alignContent: 'space-around'\n    },\n\n    /* Styles applied to the root element if `justify=\"center\"`. */\n    'justify-xs-center': {\n      justifyContent: 'center'\n    },\n\n    /* Styles applied to the root element if `justify=\"flex-end\"`. */\n    'justify-xs-flex-end': {\n      justifyContent: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-between\"`. */\n    'justify-xs-space-between': {\n      justifyContent: 'space-between'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-around\"`. */\n    'justify-xs-space-around': {\n      justifyContent: 'space-around'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-evenly\"`. */\n    'justify-xs-space-evenly': {\n      justifyContent: 'space-evenly'\n    }\n  }, generateGutter(theme, 'xs'), theme.breakpoints.keys.reduce(function (accumulator, key) {\n    // Use side effect over immutability for better performance.\n    generateGrid(accumulator, theme, key);\n    return accumulator;\n  }, {}));\n};\nvar Grid = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Grid(props, ref) {\n  var _props$alignContent = props.alignContent,\n      alignContent = _props$alignContent === void 0 ? 'stretch' : _props$alignContent,\n      _props$alignItems = props.alignItems,\n      alignItems = _props$alignItems === void 0 ? 'stretch' : _props$alignItems,\n      classes = props.classes,\n      classNameProp = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$container = props.container,\n      container = _props$container === void 0 ? false : _props$container,\n      _props$direction = props.direction,\n      direction = _props$direction === void 0 ? 'row' : _props$direction,\n      _props$item = props.item,\n      item = _props$item === void 0 ? false : _props$item,\n      _props$justify = props.justify,\n      justify = _props$justify === void 0 ? 'flex-start' : _props$justify,\n      _props$lg = props.lg,\n      lg = _props$lg === void 0 ? false : _props$lg,\n      _props$md = props.md,\n      md = _props$md === void 0 ? false : _props$md,\n      _props$sm = props.sm,\n      sm = _props$sm === void 0 ? false : _props$sm,\n      _props$spacing = props.spacing,\n      spacing = _props$spacing === void 0 ? 0 : _props$spacing,\n      _props$wrap = props.wrap,\n      wrap = _props$wrap === void 0 ? 'wrap' : _props$wrap,\n      _props$xl = props.xl,\n      xl = _props$xl === void 0 ? false : _props$xl,\n      _props$xs = props.xs,\n      xs = _props$xs === void 0 ? false : _props$xs,\n      _props$zeroMinWidth = props.zeroMinWidth,\n      zeroMinWidth = _props$zeroMinWidth === void 0 ? false : _props$zeroMinWidth,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"item\", \"justify\", \"lg\", \"md\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\", \"zeroMinWidth\"]);\n\n  var className = Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classNameProp, container && [classes.container, spacing !== 0 && classes[\"spacing-xs-\".concat(String(spacing))]], item && classes.item, zeroMinWidth && classes.zeroMinWidth, direction !== 'row' && classes[\"direction-xs-\".concat(String(direction))], wrap !== 'wrap' && classes[\"wrap-xs-\".concat(String(wrap))], alignItems !== 'stretch' && classes[\"align-items-xs-\".concat(String(alignItems))], alignContent !== 'stretch' && classes[\"align-content-xs-\".concat(String(alignContent))], justify !== 'flex-start' && classes[\"justify-xs-\".concat(String(justify))], xs !== false && classes[\"grid-xs-\".concat(String(xs))], sm !== false && classes[\"grid-sm-\".concat(String(sm))], md !== false && classes[\"grid-md-\".concat(String(md))], lg !== false && classes[\"grid-lg-\".concat(String(lg))], xl !== false && classes[\"grid-xl-\".concat(String(xl))]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: className,\n    ref: ref\n  }, other));\n});\n true ? Grid.propTypes = {\n  /**\n   * Defines the `align-content` style property.\n   * It's applied for all screen sizes.\n   */\n  alignContent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['stretch', 'center', 'flex-start', 'flex-end', 'space-between', 'space-around']),\n\n  /**\n   * Defines the `align-items` style property.\n   * It's applied for all screen sizes.\n   */\n  alignItems: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center', 'flex-end', 'stretch', 'baseline']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the component will have the flex *container* behavior.\n   * You should be wrapping *items* with a *container*.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Defines the `flex-direction` style property.\n   * It is applied for all screen sizes.\n   */\n  direction: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n\n  /**\n   * If `true`, the component will have the flex *item* behavior.\n   * You should be wrapping *items* with a *container*.\n   */\n  item: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Defines the `justify-content` style property.\n   * It is applied for all screen sizes.\n   */\n  justify: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around', 'space-evenly']),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `lg` breakpoint and wider screens if not overridden.\n   */\n  lg: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `md` breakpoint and wider screens if not overridden.\n   */\n  md: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `sm` breakpoint and wider screens if not overridden.\n   */\n  sm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the space between the type `item` component.\n   * It can only be used on a type `container` component.\n   */\n  spacing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(SPACINGS),\n\n  /**\n   * Defines the `flex-wrap` style property.\n   * It's applied for all screen sizes.\n   */\n  wrap: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['nowrap', 'wrap', 'wrap-reverse']),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `xl` breakpoint and wider screens.\n   */\n  xl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for all the screen sizes with the lowest priority.\n   */\n  xs: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * If `true`, it sets `min-width: 0` on the item.\n   * Refer to the limitations section of the documentation to better understand the use case.\n   */\n  zeroMinWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\nvar StyledGrid = Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiGrid'\n})(Grid);\n\nif (true) {\n  var requireProp = Object(_utils_requirePropFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"])('Grid');\n  StyledGrid.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, StyledGrid.propTypes, {\n    alignContent: requireProp('container'),\n    alignItems: requireProp('container'),\n    direction: requireProp('container'),\n    justify: requireProp('container'),\n    lg: requireProp('item'),\n    md: requireProp('item'),\n    sm: requireProp('item'),\n    spacing: requireProp('container'),\n    wrap: requireProp('container'),\n    xs: requireProp('item'),\n    zeroMinWidth: requireProp('item')\n  });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (StyledGrid);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Grid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grid */ \"./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Grid__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _transitions_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../transitions/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\nfunction getScale(value) {\n  return \"scale(\".concat(value, \", \").concat(Math.pow(value, 2), \")\");\n}\n\nvar styles = {\n  entering: {\n    opacity: 1,\n    transform: getScale(1)\n  },\n  entered: {\n    opacity: 1,\n    transform: 'none'\n  }\n};\n/**\n * The Grow transition is used by the [Tooltip](/components/tooltips/) and\n * [Popover](/components/popover/) components.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nvar Grow = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Grow(props, ref) {\n  var children = props.children,\n      _props$disableStrictM = props.disableStrictModeCompat,\n      disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,\n      inProp = props.in,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      style = props.style,\n      _props$timeout = props.timeout,\n      timeout = _props$timeout === void 0 ? 'auto' : _props$timeout,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"Transition\"] : _props$TransitionComp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"disableStrictModeCompat\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"timeout\", \"TransitionComponent\"]);\n\n  var timer = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var autoTimeout = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;\n  var nodeRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var foreignRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(children.ref, ref);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(enableStrictModeCompat ? nodeRef : undefined, foreignRef);\n\n  var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {\n    return function (nodeOrAppearing, maybeAppearing) {\n      if (callback) {\n        var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],\n            _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, 2),\n            node = _ref2[0],\n            isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n\n        if (isAppearing === undefined) {\n          callback(node);\n        } else {\n          callback(node, isAppearing);\n        }\n      }\n    };\n  };\n\n  var handleEntering = normalizedTransitionCallback(onEntering);\n  var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {\n    Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"reflow\"])(node); // So the animation always start from the start.\n\n    var _getTransitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'enter'\n    }),\n        transitionDuration = _getTransitionProps.duration,\n        delay = _getTransitionProps.delay;\n\n    var duration;\n\n    if (timeout === 'auto') {\n      duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n      autoTimeout.current = duration;\n    } else {\n      duration = transitionDuration;\n    }\n\n    node.style.transition = [theme.transitions.create('opacity', {\n      duration: duration,\n      delay: delay\n    }), theme.transitions.create('transform', {\n      duration: duration * 0.666,\n      delay: delay\n    })].join(',');\n\n    if (onEnter) {\n      onEnter(node, isAppearing);\n    }\n  });\n  var handleEntered = normalizedTransitionCallback(onEntered);\n  var handleExiting = normalizedTransitionCallback(onExiting);\n  var handleExit = normalizedTransitionCallback(function (node) {\n    var _getTransitionProps2 = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'exit'\n    }),\n        transitionDuration = _getTransitionProps2.duration,\n        delay = _getTransitionProps2.delay;\n\n    var duration;\n\n    if (timeout === 'auto') {\n      duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n      autoTimeout.current = duration;\n    } else {\n      duration = transitionDuration;\n    }\n\n    node.style.transition = [theme.transitions.create('opacity', {\n      duration: duration,\n      delay: delay\n    }), theme.transitions.create('transform', {\n      duration: duration * 0.666,\n      delay: delay || duration * 0.333\n    })].join(',');\n    node.style.opacity = '0';\n    node.style.transform = getScale(0.75);\n\n    if (onExit) {\n      onExit(node);\n    }\n  });\n  var handleExited = normalizedTransitionCallback(onExited);\n\n  var addEndListener = function addEndListener(nodeOrNext, maybeNext) {\n    var next = enableStrictModeCompat ? nodeOrNext : maybeNext;\n\n    if (timeout === 'auto') {\n      timer.current = setTimeout(next, autoTimeout.current || 0);\n    }\n  };\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    return function () {\n      clearTimeout(timer.current);\n    };\n  }, []);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: inProp,\n    nodeRef: enableStrictModeCompat ? nodeRef : undefined,\n    onEnter: handleEnter,\n    onEntered: handleEntered,\n    onEntering: handleEntering,\n    onExit: handleExit,\n    onExited: handleExited,\n    onExiting: handleExiting,\n    addEndListener: addEndListener,\n    timeout: timeout === 'auto' ? null : timeout\n  }, other), function (state, childProps) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"cloneElement\"](children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        opacity: 0,\n        transform: getScale(0.75),\n        visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n      }, styles[state], style, children.props.style),\n      ref: handleRef\n    }, childProps));\n  });\n});\n true ? Grow.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.element,\n\n  /**\n   * Enable this prop if you encounter 'Function components cannot be given refs',\n   * use `unstable_createStrictModeTheme`,\n   * and can't forward the ref in the child component.\n   */\n  disableStrictModeCompat: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, show the component; triggers the enter or exit animation.\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   *\n   * Set to 'auto' to automatically calculate transition time based on height.\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })])\n} : undefined;\nGrow.muiSupportAuto = true;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Grow);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Grow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grow */ \"./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Grow__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      textAlign: 'center',\n      flex: '0 0 auto',\n      fontSize: theme.typography.pxToRem(24),\n      padding: 12,\n      borderRadius: '50%',\n      overflow: 'visible',\n      // Explicitly set the default value to solve a bug on IE 11.\n      color: theme.palette.action.active,\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shortest\n      }),\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.action.active, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        backgroundColor: 'transparent',\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if `edge=\"start\"`. */\n    edgeStart: {\n      marginLeft: -12,\n      '$sizeSmall&': {\n        marginLeft: -3\n      }\n    },\n\n    /* Styles applied to the root element if `edge=\"end\"`. */\n    edgeEnd: {\n      marginRight: -12,\n      '$sizeSmall&': {\n        marginRight: -3\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `size=\"small\"`. */\n    sizeSmall: {\n      padding: 3,\n      fontSize: theme.typography.pxToRem(18)\n    },\n\n    /* Styles applied to the children container element. */\n    label: {\n      width: '100%',\n      display: 'flex',\n      alignItems: 'inherit',\n      justifyContent: 'inherit'\n    }\n  };\n};\n/**\n * Refer to the [Icons](/components/icons/) section of the documentation\n * regarding the available icon options.\n */\n\nvar IconButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function IconButton(props, ref) {\n  var _props$edge = props.edge,\n      edge = _props$edge === void 0 ? false : _props$edge,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'default' : _props$color,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableFocusRi = props.disableFocusRipple,\n      disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"edge\", \"children\", \"classes\", \"className\", \"color\", \"disabled\", \"disableFocusRipple\", \"size\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ButtonBase__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'default' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(color))], disabled && classes.disabled, size === \"small\" && classes[\"size\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(size))], {\n      'start': classes.edgeStart,\n      'end': classes.edgeEnd\n    }[edge]),\n    centerRipple: true,\n    focusRipple: !disableFocusRipple,\n    disabled: disabled,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: classes.label\n  }, children));\n});\n true ? IconButton.propTypes = {\n  /**\n   * The icon element.\n   */\n  children: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, function (props) {\n    var found = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(props.children).some(function (child) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child) && child.props.onClick;\n    });\n\n    if (found) {\n      return new Error(['Material-UI: You are providing an onClick event listener ' + 'to a child of a button element.', 'Firefox will never trigger the event.', 'You should move the onClick listener to the parent button element.', 'https://github.com/mui-org/material-ui/issues/13957'].join('\\n'));\n    }\n\n    return null;\n  }),\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the  keyboard focus ripple will be disabled.\n   */\n  disableFocusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If given, uses a negative margin to counteract the padding on one\n   * side (this is often helpful for aligning the left or right\n   * side of the icon with content above or below, without ruining the border\n   * size and shape).\n   */\n  edge: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['start', 'end', false]),\n\n  /**\n   * The size of the button.\n   * `small` is equivalent to the dense button styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['small', 'medium'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiIconButton'\n})(IconButton));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IconButton */ \"./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _IconButton__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js ***!
-  \***********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative'\n    },\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {\n      'label + &': {\n        marginTop: 16\n      }\n    },\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if color secondary. */\n    colorSecondary: {\n      '&$underline:after': {\n        borderBottomColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if `disableUnderline={false}`. */\n    underline: {\n      '&:after': {\n        borderBottom: \"2px solid \".concat(theme.palette.primary.main),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\"',\n        position: 'absolute',\n        right: 0,\n        transform: 'scaleX(0)',\n        transition: theme.transitions.create('transform', {\n          duration: theme.transitions.duration.shorter,\n          easing: theme.transitions.easing.easeOut\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&$focused:after': {\n        transform: 'scaleX(1)'\n      },\n      '&$error:after': {\n        borderBottomColor: theme.palette.error.main,\n        transform: 'scaleX(1)' // error is always underlined in red\n\n      },\n      '&:before': {\n        borderBottom: \"1px solid \".concat(bottomLineColor),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\\\\00a0\"',\n        position: 'absolute',\n        right: 0,\n        transition: theme.transitions.create('border-bottom-color', {\n          duration: theme.transitions.duration.shorter\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&:hover:not($disabled):before': {\n        borderBottom: \"2px solid \".concat(theme.palette.text.primary),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          borderBottom: \"1px solid \".concat(bottomLineColor)\n        }\n      },\n      '&$disabled:before': {\n        borderBottomStyle: 'dotted'\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {},\n\n    /* Styles applied to the `input` element. */\n    input: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {},\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {},\n\n    /* Styles applied to the `input` element if `type=\"search\"`. */\n    inputTypeSearch: {}\n  };\n};\nvar Input = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Input(props, ref) {\n  var disableUnderline = props.disableUnderline,\n      classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"disableUnderline\", \"classes\", \"fullWidth\", \"inputComponent\", \"multiline\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, !disableUnderline && classes.underline),\n      underline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? Input.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will not have an underline.\n   */\n  disableUnderline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiInput'\n})(Input));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Input/index.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Input/index.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Input__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Input/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _TextareaAutosize__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../TextareaAutosize */ \"./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n\n\n\n\n/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var placeholder = {\n    color: 'currentColor',\n    opacity: light ? 0.42 : 0.5,\n    transition: theme.transitions.create('opacity', {\n      duration: theme.transitions.duration.shorter\n    })\n  };\n  var placeholderHidden = {\n    opacity: '0 !important'\n  };\n  var placeholderVisible = {\n    opacity: light ? 0.42 : 0.5\n  };\n  return {\n    '@global': {\n      '@keyframes mui-auto-fill': {},\n      '@keyframes mui-auto-fill-cancel': {}\n    },\n\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.body1, {\n      color: theme.palette.text.primary,\n      lineHeight: '1.1876em',\n      // Reset (19px), match the native input line-height\n      boxSizing: 'border-box',\n      // Prevent padding issue with fullWidth.\n      position: 'relative',\n      cursor: 'text',\n      display: 'inline-flex',\n      alignItems: 'center',\n      '&$disabled': {\n        color: theme.palette.text.disabled,\n        cursor: 'default'\n      }\n    }),\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {},\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {},\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: \"\".concat(8 - 2, \"px 0 \").concat(8 - 1, \"px\"),\n      '&$marginDense': {\n        paddingTop: 4 - 1\n      }\n    },\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {\n      width: '100%'\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      font: 'inherit',\n      letterSpacing: 'inherit',\n      color: 'currentColor',\n      padding: \"\".concat(8 - 2, \"px 0 \").concat(8 - 1, \"px\"),\n      border: 0,\n      boxSizing: 'content-box',\n      background: 'none',\n      height: '1.1876em',\n      // Reset (19px), match the native input line-height\n      margin: 0,\n      // Reset for Safari\n      WebkitTapHighlightColor: 'transparent',\n      display: 'block',\n      // Make the flex item shrink with Firefox\n      minWidth: 0,\n      width: '100%',\n      // Fix IE 11 width issue\n      animationName: 'mui-auto-fill-cancel',\n      animationDuration: '10ms',\n      '&::-webkit-input-placeholder': placeholder,\n      '&::-moz-placeholder': placeholder,\n      // Firefox 19+\n      '&:-ms-input-placeholder': placeholder,\n      // IE 11\n      '&::-ms-input-placeholder': placeholder,\n      // Edge\n      '&:focus': {\n        outline: 0\n      },\n      // Reset Firefox invalid required input style\n      '&:invalid': {\n        boxShadow: 'none'\n      },\n      '&::-webkit-search-decoration': {\n        // Remove the padding when type=search.\n        '-webkit-appearance': 'none'\n      },\n      // Show and hide the placeholder logic\n      'label[data-shrink=false] + $formControl &': {\n        '&::-webkit-input-placeholder': placeholderHidden,\n        '&::-moz-placeholder': placeholderHidden,\n        // Firefox 19+\n        '&:-ms-input-placeholder': placeholderHidden,\n        // IE 11\n        '&::-ms-input-placeholder': placeholderHidden,\n        // Edge\n        '&:focus::-webkit-input-placeholder': placeholderVisible,\n        '&:focus::-moz-placeholder': placeholderVisible,\n        // Firefox 19+\n        '&:focus:-ms-input-placeholder': placeholderVisible,\n        // IE 11\n        '&:focus::-ms-input-placeholder': placeholderVisible // Edge\n\n      },\n      '&$disabled': {\n        opacity: 1 // Reset iOS opacity\n\n      },\n      '&:-webkit-autofill': {\n        animationDuration: '5000s',\n        animationName: 'mui-auto-fill'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 4 - 1\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      height: 'auto',\n      resize: 'none',\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `type=\"search\"`. */\n    inputTypeSearch: {\n      // Improve type search style.\n      '-moz-appearance': 'textfield',\n      '-webkit-appearance': 'textfield'\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {},\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {},\n\n    /* Styles applied to the `input` element if `hiddenLabel={true}`. */\n    inputHiddenLabel: {}\n  };\n};\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_3__[\"useLayoutEffect\"];\n/**\n * `InputBase` contains as few styles as possible.\n * It aims to be a simple building block for creating an input.\n * It contains a load of style reset and some state logic.\n */\n\nvar InputBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function InputBase(props, ref) {\n  var ariaDescribedby = props['aria-describedby'],\n      autoComplete = props.autoComplete,\n      autoFocus = props.autoFocus,\n      classes = props.classes,\n      className = props.className,\n      color = props.color,\n      defaultValue = props.defaultValue,\n      disabled = props.disabled,\n      endAdornment = props.endAdornment,\n      error = props.error,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      id = props.id,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$inputProps = props.inputProps,\n      inputPropsProp = _props$inputProps === void 0 ? {} : _props$inputProps,\n      inputRefProp = props.inputRef,\n      margin = props.margin,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onClick = props.onClick,\n      onFocus = props.onFocus,\n      onKeyDown = props.onKeyDown,\n      onKeyUp = props.onKeyUp,\n      placeholder = props.placeholder,\n      readOnly = props.readOnly,\n      renderSuffix = props.renderSuffix,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      rowsMin = props.rowsMin,\n      startAdornment = props.startAdornment,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      valueProp = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"aria-describedby\", \"autoComplete\", \"autoFocus\", \"classes\", \"className\", \"color\", \"defaultValue\", \"disabled\", \"endAdornment\", \"error\", \"fullWidth\", \"id\", \"inputComponent\", \"inputProps\", \"inputRef\", \"margin\", \"multiline\", \"name\", \"onBlur\", \"onChange\", \"onClick\", \"onFocus\", \"onKeyDown\", \"onKeyUp\", \"placeholder\", \"readOnly\", \"renderSuffix\", \"rows\", \"rowsMax\", \"rowsMin\", \"startAdornment\", \"type\", \"value\"]);\n\n  var value = inputPropsProp.value != null ? inputPropsProp.value : valueProp;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](value != null),\n      isControlled = _React$useRef.current;\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var handleInputRefWarning = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (instance) {\n    if (true) {\n      if (instance && instance.nodeName !== 'INPUT' && !instance.focus) {\n        console.error(['Material-UI: You have provided a `inputComponent` to the input component', 'that does not correctly handle the `inputRef` prop.', 'Make sure the `inputRef` prop is called with a HTMLInputElement.'].join('\\n'));\n      }\n    }\n  }, []);\n  var handleInputPropsRefProp = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputPropsProp.ref, handleInputRefWarning);\n  var handleInputRefProp = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputRefProp, handleInputPropsRefProp);\n  var handleInputRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputRef, handleInputRefProp);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__[\"useState\"](false),\n      focused = _React$useState[0],\n      setFocused = _React$useState[1];\n\n  var muiFormControl = Object(_FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__[\"useFormControl\"])();\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n      if (muiFormControl) {\n        return muiFormControl.registerEffect();\n      }\n\n      return undefined;\n    }, [muiFormControl]);\n  }\n\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['color', 'disabled', 'error', 'hiddenLabel', 'margin', 'required', 'filled']\n  });\n  fcs.focused = muiFormControl ? muiFormControl.focused : focused; // The blur won't fire when the disabled state is set on a focused input.\n  // We need to book keep the focused state manually.\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (!muiFormControl && disabled && focused) {\n      setFocused(false);\n\n      if (onBlur) {\n        onBlur();\n      }\n    }\n  }, [muiFormControl, disabled, focused, onBlur]);\n  var onFilled = muiFormControl && muiFormControl.onFilled;\n  var onEmpty = muiFormControl && muiFormControl.onEmpty;\n  var checkDirty = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (obj) {\n    if (Object(_utils__WEBPACK_IMPORTED_MODULE_12__[\"isFilled\"])(obj)) {\n      if (onFilled) {\n        onFilled();\n      }\n    } else if (onEmpty) {\n      onEmpty();\n    }\n  }, [onFilled, onEmpty]);\n  useEnhancedEffect(function () {\n    if (isControlled) {\n      checkDirty({\n        value: value\n      });\n    }\n  }, [value, checkDirty, isControlled]);\n\n  var handleFocus = function handleFocus(event) {\n    // Fix a bug with IE 11 where the focus/blur events are triggered\n    // while the input is disabled.\n    if (fcs.disabled) {\n      event.stopPropagation();\n      return;\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n\n    if (inputPropsProp.onFocus) {\n      inputPropsProp.onFocus(event);\n    }\n\n    if (muiFormControl && muiFormControl.onFocus) {\n      muiFormControl.onFocus(event);\n    } else {\n      setFocused(true);\n    }\n  };\n\n  var handleBlur = function handleBlur(event) {\n    if (onBlur) {\n      onBlur(event);\n    }\n\n    if (inputPropsProp.onBlur) {\n      inputPropsProp.onBlur(event);\n    }\n\n    if (muiFormControl && muiFormControl.onBlur) {\n      muiFormControl.onBlur(event);\n    } else {\n      setFocused(false);\n    }\n  };\n\n  var handleChange = function handleChange(event) {\n    if (!isControlled) {\n      var element = event.target || inputRef.current;\n\n      if (element == null) {\n        throw new Error( true ? \"Material-UI: Expected valid input target. Did you use a custom `inputComponent` and forget to forward refs? See https://material-ui.com/r/input-component-ref-interface for more info.\" : undefined);\n      }\n\n      checkDirty({\n        value: element.value\n      });\n    }\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    if (inputPropsProp.onChange) {\n      inputPropsProp.onChange.apply(inputPropsProp, [event].concat(args));\n    } // Perform in the willUpdate\n\n\n    if (onChange) {\n      onChange.apply(void 0, [event].concat(args));\n    }\n  }; // Check the input state on mount, in case it was filled by the user\n  // or auto filled by the browser before the hydration (for SSR).\n\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    checkDirty(inputRef.current);\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  var handleClick = function handleClick(event) {\n    if (inputRef.current && event.currentTarget === event.target) {\n      inputRef.current.focus();\n    }\n\n    if (onClick) {\n      onClick(event);\n    }\n  };\n\n  var InputComponent = inputComponent;\n\n  var inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inputPropsProp, {\n    ref: handleInputRef\n  });\n\n  if (typeof InputComponent !== 'string') {\n    inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      // Rename ref to inputRef as we don't know the\n      // provided `inputComponent` structure.\n      inputRef: handleInputRef,\n      type: type\n    }, inputProps, {\n      ref: null\n    });\n  } else if (multiline) {\n    if (rows && !rowsMax && !rowsMin) {\n      InputComponent = 'textarea';\n    } else {\n      inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        rows: rows,\n        rowsMax: rowsMax\n      }, inputProps);\n      InputComponent = _TextareaAutosize__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\n    }\n  } else {\n    inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      type: type\n    }, inputProps);\n  }\n\n  var handleAutoFill = function handleAutoFill(event) {\n    // Provide a fake value as Chrome might not let you access it for security reasons.\n    checkDirty(event.animationName === 'mui-auto-fill-cancel' ? inputRef.current : {\n      value: 'x'\n    });\n  };\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (muiFormControl) {\n      muiFormControl.setAdornedStart(Boolean(startAdornment));\n    }\n  }, [muiFormControl, startAdornment]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(fcs.color || 'primary'))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fullWidth && classes.fullWidth, fcs.focused && classes.focused, muiFormControl && classes.formControl, multiline && classes.multiline, startAdornment && classes.adornedStart, endAdornment && classes.adornedEnd, fcs.margin === 'dense' && classes.marginDense),\n    onClick: handleClick,\n    ref: ref\n  }, other), startAdornment, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n    value: null\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    \"aria-invalid\": fcs.error,\n    \"aria-describedby\": ariaDescribedby,\n    autoComplete: autoComplete,\n    autoFocus: autoFocus,\n    defaultValue: defaultValue,\n    disabled: fcs.disabled,\n    id: id,\n    onAnimationStart: handleAutoFill,\n    name: name,\n    placeholder: placeholder,\n    readOnly: readOnly,\n    required: fcs.required,\n    rows: rows,\n    value: value,\n    onKeyDown: onKeyDown,\n    onKeyUp: onKeyUp\n  }, inputProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.input, inputPropsProp.className, fcs.disabled && classes.disabled, multiline && classes.inputMultiline, fcs.hiddenLabel && classes.inputHiddenLabel, startAdornment && classes.inputAdornedStart, endAdornment && classes.inputAdornedEnd, type === 'search' && classes.inputTypeSearch, fcs.margin === 'dense' && classes.inputMarginDense),\n    onBlur: handleBlur,\n    onChange: handleChange,\n    onFocus: handleFocus\n  }))), endAdornment, renderSuffix ? renderSuffix(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, fcs, {\n    startAdornment: startAdornment\n  })) : null);\n});\n true ? InputBase.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  'aria-describedby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * Callback fired when the input is blurred.\n   *\n   * Notice that the first argument (event) might be undefined.\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  renderSuffix: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Minimum number of rows to display when multiline option is set to true.\n   */\n  rowsMin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiInputBase'\n})(InputBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _InputBase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js ***!
-  \***************************************************************************/
-/*! exports provided: hasValue, isFilled, isAdornedStart */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasValue\", function() { return hasValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFilled\", function() { return isFilled; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isAdornedStart\", function() { return isAdornedStart; });\n// Supports determination of isControlled().\n// Controlled input accepts its current value as a prop.\n//\n// @see https://facebook.github.io/react/docs/forms.html#controlled-components\n// @param value\n// @returns {boolean} true if string (including '') or number (including zero)\nfunction hasValue(value) {\n  return value != null && !(Array.isArray(value) && value.length === 0);\n} // Determine if field is empty or filled.\n// Response determines if label is presented above field or as placeholder.\n//\n// @param obj\n// @param SSR\n// @returns {boolean} False when not present or empty string.\n//                    True when any number or string with length.\n\nfunction isFilled(obj) {\n  var SSR = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  return obj && (hasValue(obj.value) && obj.value !== '' || SSR && hasValue(obj.defaultValue) && obj.defaultValue !== '');\n} // Determine if an Input is adorned on start.\n// It's corresponding to the left with LTR.\n//\n// @param obj\n// @returns {boolean} False when no adornments.\n//                    True when adorned at the start.\n\nfunction isAdornedStart(obj) {\n  return obj.startAdornment;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _FormLabel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'block',\n      transformOrigin: 'top left'\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {},\n\n    /* Pseudo-class applied to the asterisk element. */\n    asterisk: {},\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      // slight alteration to spec spacing to match visual spec result\n      transform: 'translate(0, 24px) scale(1)'\n    },\n\n    /* Styles applied to the root element if `margin=\"dense\"`. */\n    marginDense: {\n      // Compensation for the `Input.inputDense` style.\n      transform: 'translate(0, 21px) scale(1)'\n    },\n\n    /* Styles applied to the `input` element if `shrink={true}`. */\n    shrink: {\n      transform: 'translate(0, 1.5px) scale(0.75)',\n      transformOrigin: 'top left'\n    },\n\n    /* Styles applied to the `input` element if `disableAnimation={false}`. */\n    animated: {\n      transition: theme.transitions.create(['color', 'transform'], {\n        duration: theme.transitions.duration.shorter,\n        easing: theme.transitions.easing.easeOut\n      })\n    },\n\n    /* Styles applied to the root element if `variant=\"filled\"`. */\n    filled: {\n      // Chrome's autofill feature gives the input field a yellow background.\n      // Since the input field is behind the label in the HTML tree,\n      // the input field is drawn last and hides the label with an opaque background color.\n      // zIndex: 1 will raise the label above opaque background-colors of input.\n      zIndex: 1,\n      pointerEvents: 'none',\n      transform: 'translate(12px, 20px) scale(1)',\n      '&$marginDense': {\n        transform: 'translate(12px, 17px) scale(1)'\n      },\n      '&$shrink': {\n        transform: 'translate(12px, 10px) scale(0.75)',\n        '&$marginDense': {\n          transform: 'translate(12px, 7px) scale(0.75)'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      // see comment above on filled.zIndex\n      zIndex: 1,\n      pointerEvents: 'none',\n      transform: 'translate(14px, 20px) scale(1)',\n      '&$marginDense': {\n        transform: 'translate(14px, 12px) scale(1)'\n      },\n      '&$shrink': {\n        transform: 'translate(14px, -6px) scale(0.75)'\n      }\n    }\n  };\n};\nvar InputLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function InputLabel(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$disableAnimati = props.disableAnimation,\n      disableAnimation = _props$disableAnimati === void 0 ? false : _props$disableAnimati,\n      margin = props.margin,\n      shrinkProp = props.shrink,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"disableAnimation\", \"margin\", \"shrink\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var shrink = shrinkProp;\n\n  if (typeof shrink === 'undefined' && muiFormControl) {\n    shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;\n  }\n\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['margin', 'variant']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormLabel__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"data-shrink\": shrink,\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, muiFormControl && classes.formControl, !disableAnimation && classes.animated, shrink && classes.shrink, fcs.margin === 'dense' && classes.marginDense, {\n      'filled': classes.filled,\n      'outlined': classes.outlined\n    }[fcs.variant]),\n    classes: {\n      focused: classes.focused,\n      disabled: classes.disabled,\n      error: classes.error,\n      required: classes.required,\n      asterisk: classes.asterisk\n    },\n    ref: ref\n  }, other));\n});\n true ? InputLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The contents of the `InputLabel`.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * If `true`, the transition animation is disabled.\n   */\n  disableAnimation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, apply disabled class.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input of this label is focused.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense']),\n\n  /**\n   * if `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label is shrunk.\n   */\n  shrink: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiInputLabel'\n})(InputLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _InputLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./InputLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _InputLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useIsFocusVisible */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {},\n\n  /* Styles applied to the root element if `underline=\"none\"`. */\n  underlineNone: {\n    textDecoration: 'none'\n  },\n\n  /* Styles applied to the root element if `underline=\"hover\"`. */\n  underlineHover: {\n    textDecoration: 'none',\n    '&:hover': {\n      textDecoration: 'underline'\n    }\n  },\n\n  /* Styles applied to the root element if `underline=\"always\"`. */\n  underlineAlways: {\n    textDecoration: 'underline'\n  },\n  // Same reset as ButtonBase.root\n\n  /* Styles applied to the root element if `component=\"button\"`. */\n  button: {\n    position: 'relative',\n    WebkitTapHighlightColor: 'transparent',\n    backgroundColor: 'transparent',\n    // Reset default value\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0,\n    border: 0,\n    margin: 0,\n    // Remove the margin in Safari\n    borderRadius: 0,\n    padding: 0,\n    // Remove the padding in Firefox\n    cursor: 'pointer',\n    userSelect: 'none',\n    verticalAlign: 'middle',\n    '-moz-appearance': 'none',\n    // Reset\n    '-webkit-appearance': 'none',\n    // Reset\n    '&::-moz-focus-inner': {\n      borderStyle: 'none' // Remove Firefox dotted outline.\n\n    },\n    '&$focusVisible': {\n      outline: 'auto'\n    }\n  },\n\n  /* Pseudo-class applied to the root element if the link is keyboard focused. */\n  focusVisible: {}\n};\nvar Link = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Link(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'a' : _props$component,\n      onBlur = props.onBlur,\n      onFocus = props.onFocus,\n      TypographyClasses = props.TypographyClasses,\n      _props$underline = props.underline,\n      underline = _props$underline === void 0 ? 'hover' : _props$underline,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'inherit' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"color\", \"component\", \"onBlur\", \"onFocus\", \"TypographyClasses\", \"underline\", \"variant\"]);\n\n  var _useIsFocusVisible = Object(_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(),\n      isFocusVisible = _useIsFocusVisible.isFocusVisible,\n      onBlurVisible = _useIsFocusVisible.onBlurVisible,\n      focusVisibleRef = _useIsFocusVisible.ref;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      focusVisible = _React$useState[0],\n      setFocusVisible = _React$useState[1];\n\n  var handlerRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(ref, focusVisibleRef);\n\n  var handleBlur = function handleBlur(event) {\n    if (focusVisible) {\n      onBlurVisible();\n      setFocusVisible(false);\n    }\n\n    if (onBlur) {\n      onBlur(event);\n    }\n  };\n\n  var handleFocus = function handleFocus(event) {\n    if (isFocusVisible(event)) {\n      setFocusVisible(true);\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"underline\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(underline))], className, focusVisible && classes.focusVisible, component === 'button' && classes.button),\n    classes: TypographyClasses,\n    color: color,\n    component: component,\n    onBlur: handleBlur,\n    onFocus: handleFocus,\n    ref: handlerRef,\n    variant: variant\n  }, other));\n});\n true ? Link.propTypes = {\n  /**\n   * The content of the link.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the link.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_7__[\"elementTypeAcceptingRef\"],\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * `classes` prop applied to the [`Typography`](/api/typography/) element.\n   */\n  TypographyClasses: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Controls when the link should have an underline.\n   */\n  underline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['none', 'hover', 'always']),\n\n  /**\n   * Applies the theme typography styles.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiLink'\n})(Link));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Link/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Link/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Link__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Link */ \"./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Link__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Link/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/List.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/List.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ListContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ListContext */ \"./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    listStyle: 'none',\n    margin: 0,\n    padding: 0,\n    position: 'relative'\n  },\n\n  /* Styles applied to the root element if `disablePadding={false}`. */\n  padding: {\n    paddingTop: 8,\n    paddingBottom: 8\n  },\n\n  /* Styles applied to the root element if dense. */\n  dense: {},\n\n  /* Styles applied to the root element if a `subheader` is provided. */\n  subheader: {\n    paddingTop: 0\n  }\n};\nvar List = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function List(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'ul' : _props$component,\n      _props$dense = props.dense,\n      dense = _props$dense === void 0 ? false : _props$dense,\n      _props$disablePadding = props.disablePadding,\n      disablePadding = _props$disablePadding === void 0 ? false : _props$disablePadding,\n      subheader = props.subheader,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\"]);\n\n  var context = react__WEBPACK_IMPORTED_MODULE_2__[\"useMemo\"](function () {\n    return {\n      dense: dense\n    };\n  }, [dense]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ListContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n    value: context\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, dense && classes.dense, !disablePadding && classes.padding, subheader && classes.subheader),\n    ref: ref\n  }, other), subheader, children));\n});\n true ? List.propTypes = {\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used for\n   * the list and list items.\n   * The prop is available to descendant components as the `dense` context.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, vertical padding will be removed from the list.\n   */\n  disablePadding: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the subheader, normally `ListSubheader`.\n   */\n  subheader: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiList'\n})(List));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/List.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * @ignore - internal component.\n */\n\nvar ListContext = react__WEBPACK_IMPORTED_MODULE_0__[\"createContext\"]({});\n\nif (true) {\n  ListContext.displayName = 'ListContext';\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ListContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./List */ \"./jaas-client/node_modules/@material-ui/core/esm/List/List.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _List__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _List_ListContext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../List/ListContext */ \"./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the (normally root) `component` element. May be wrapped by a `container`. */\n    root: {\n      display: 'flex',\n      justifyContent: 'flex-start',\n      alignItems: 'center',\n      position: 'relative',\n      textDecoration: 'none',\n      width: '100%',\n      boxSizing: 'border-box',\n      textAlign: 'left',\n      paddingTop: 8,\n      paddingBottom: 8,\n      '&$focusVisible': {\n        backgroundColor: theme.palette.action.selected\n      },\n      '&$selected, &$selected:hover': {\n        backgroundColor: theme.palette.action.selected\n      },\n      '&$disabled': {\n        opacity: 0.5\n      }\n    },\n\n    /* Styles applied to the `container` element if `children` includes `ListItemSecondaryAction`. */\n    container: {\n      position: 'relative'\n    },\n\n    /* Pseudo-class applied to the `component`'s `focusVisibleClassName` prop if `button={true}`. */\n    focusVisible: {},\n\n    /* Styles applied to the `component` element if dense. */\n    dense: {\n      paddingTop: 4,\n      paddingBottom: 4\n    },\n\n    /* Styles applied to the `component` element if `alignItems=\"flex-start\"`. */\n    alignItemsFlexStart: {\n      alignItems: 'flex-start'\n    },\n\n    /* Pseudo-class applied to the inner `component` element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the inner `component` element if `divider={true}`. */\n    divider: {\n      borderBottom: \"1px solid \".concat(theme.palette.divider),\n      backgroundClip: 'padding-box'\n    },\n\n    /* Styles applied to the inner `component` element if `disableGutters={false}`. */\n    gutters: {\n      paddingLeft: 16,\n      paddingRight: 16\n    },\n\n    /* Styles applied to the inner `component` element if `button={true}`. */\n    button: {\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shortest\n      }),\n      '&:hover': {\n        textDecoration: 'none',\n        backgroundColor: theme.palette.action.hover,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the `component` element if `children` includes `ListItemSecondaryAction`. */\n    secondaryAction: {\n      // Add some space to avoid collision as `ListItemSecondaryAction`\n      // is absolutely positioned.\n      paddingRight: 48\n    },\n\n    /* Pseudo-class applied to the root element if `selected={true}`. */\n    selected: {}\n  };\n};\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"];\n/**\n * Uses an additional container component if `ListItemSecondaryAction` is the last child.\n */\n\nvar ListItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function ListItem(props, ref) {\n  var _props$alignItems = props.alignItems,\n      alignItems = _props$alignItems === void 0 ? 'center' : _props$alignItems,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      _props$button = props.button,\n      button = _props$button === void 0 ? false : _props$button,\n      childrenProp = props.children,\n      classes = props.classes,\n      className = props.className,\n      componentProp = props.component,\n      _props$ContainerCompo = props.ContainerComponent,\n      ContainerComponent = _props$ContainerCompo === void 0 ? 'li' : _props$ContainerCompo,\n      _props$ContainerProps = props.ContainerProps;\n  _props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;\n\n  var ContainerClassName = _props$ContainerProps.className,\n      ContainerProps = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_props$ContainerProps, [\"className\"]),\n      _props$dense = props.dense,\n      dense = _props$dense === void 0 ? false : _props$dense,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      _props$divider = props.divider,\n      divider = _props$divider === void 0 ? false : _props$divider,\n      focusVisibleClassName = props.focusVisibleClassName,\n      _props$selected = props.selected,\n      selected = _props$selected === void 0 ? false : _props$selected,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"alignItems\", \"autoFocus\", \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\"]);\n\n  var context = react__WEBPACK_IMPORTED_MODULE_2__[\"useContext\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\n  var childContext = {\n    dense: dense || context.dense || false,\n    alignItems: alignItems\n  };\n  var listItemRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  useEnhancedEffect(function () {\n    if (autoFocus) {\n      if (listItemRef.current) {\n        listItemRef.current.focus();\n      } else if (true) {\n        console.error('Material-UI: Unable to set focus to a ListItem whose component has not been rendered.');\n      }\n    }\n  }, [autoFocus]);\n  var children = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(childrenProp);\n  var hasSecondaryAction = children.length && Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(children[children.length - 1], ['ListItemSecondaryAction']);\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    listItemRef.current = react_dom__WEBPACK_IMPORTED_MODULE_11__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleOwnRef, ref);\n\n  var componentProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, childContext.dense && classes.dense, !disableGutters && classes.gutters, divider && classes.divider, disabled && classes.disabled, button && classes.button, alignItems !== \"center\" && classes.alignItemsFlexStart, hasSecondaryAction && classes.secondaryAction, selected && classes.selected),\n    disabled: disabled\n  }, other);\n\n  var Component = componentProp || 'li';\n\n  if (button) {\n    componentProps.component = componentProp || 'div';\n    componentProps.focusVisibleClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.focusVisible, focusVisibleClassName);\n    Component = _ButtonBase__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\n  }\n\n  if (hasSecondaryAction) {\n    // Use div by default.\n    Component = !componentProps.component && !componentProp ? 'div' : Component; // Avoid nesting of li > li.\n\n    if (ContainerComponent === 'li') {\n      if (Component === 'li') {\n        Component = 'div';\n      } else if (componentProps.component === 'li') {\n        componentProps.component = 'div';\n      }\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Provider, {\n      value: childContext\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](ContainerComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.container, ContainerClassName),\n      ref: handleRef\n    }, ContainerProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, componentProps, children), children.pop()));\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Provider, {\n    value: childContext\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    ref: handleRef\n  }, componentProps), children));\n});\n true ? ListItem.propTypes = {\n  /**\n   * Defines the `align-items` style property.\n   */\n  alignItems: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center']),\n\n  /**\n   * If `true`, the list item will be focused during the first mount.\n   * Focus will also be triggered if the value changes from false to true.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the list item will be a button (using `ButtonBase`). Props intended\n   * for `ButtonBase` can then be applied to `ListItem`.\n   */\n  button: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the component. If a `ListItemSecondaryAction` is used it must\n   * be the last child.\n   */\n  children: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, function (props) {\n    var children = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(props.children); // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)\n\n    var secondaryActionIndex = -1;\n\n    for (var i = children.length - 1; i >= 0; i -= 1) {\n      var child = children[i];\n\n      if (Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['ListItemSecondaryAction'])) {\n        secondaryActionIndex = i;\n        break;\n      }\n    } //  is ListItemSecondaryAction the last child of ListItem\n\n\n    if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {\n      return new Error('Material-UI: You used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + 'you must pass it as the last child to ListItem.');\n    }\n\n    return null;\n  }),\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   * By default, it's a `li` when `button` is `false` and a `div` when `button` is `true`.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * The container component used when a `ListItemSecondaryAction` is the last child.\n   */\n  ContainerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * Props applied to the container component if used.\n   */\n  ContainerProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the list item will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, a 1px light border is added to the bottom of the list item.\n   */\n  divider: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Use to apply selected styling.\n   */\n  selected: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiListItem'\n})(ListItem));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ListItem */ \"./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ListItem__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Popover */ \"./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js\");\n/* harmony import */ var _MenuList__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../MenuList */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _utils_setRef__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar RTL_ORIGIN = {\n  vertical: 'top',\n  horizontal: 'right'\n};\nvar LTR_ORIGIN = {\n  vertical: 'top',\n  horizontal: 'left'\n};\nvar styles = {\n  /* Styles applied to the `Paper` component. */\n  paper: {\n    // specZ: The maximum height of a simple menu should be one or more rows less than the view\n    // height. This ensures a tapable area outside of the simple menu with which to dismiss\n    // the menu.\n    maxHeight: 'calc(100% - 96px)',\n    // Add iOS momentum scrolling.\n    WebkitOverflowScrolling: 'touch'\n  },\n\n  /* Styles applied to the `List` component via `MenuList`. */\n  list: {\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0\n  }\n};\nvar Menu = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Menu(props, ref) {\n  var _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus,\n      children = props.children,\n      classes = props.classes,\n      _props$disableAutoFoc = props.disableAutoFocusItem,\n      disableAutoFocusItem = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$MenuListProps = props.MenuListProps,\n      MenuListProps = _props$MenuListProps === void 0 ? {} : _props$MenuListProps,\n      onClose = props.onClose,\n      onEntering = props.onEntering,\n      open = props.open,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      PopoverClasses = props.PopoverClasses,\n      _props$transitionDura = props.transitionDuration,\n      transitionDuration = _props$transitionDura === void 0 ? 'auto' : _props$transitionDura,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'selectedMenu' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoFocus\", \"children\", \"classes\", \"disableAutoFocusItem\", \"MenuListProps\", \"onClose\", \"onEntering\", \"open\", \"PaperProps\", \"PopoverClasses\", \"transitionDuration\", \"variant\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_12__[\"default\"])();\n  var autoFocusItem = autoFocus && !disableAutoFocusItem && open;\n  var menuListActionsRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var contentAnchorRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  var getContentAnchorEl = function getContentAnchorEl() {\n    return contentAnchorRef.current;\n  };\n\n  var handleEntering = function handleEntering(element, isAppearing) {\n    if (menuListActionsRef.current) {\n      menuListActionsRef.current.adjustStyleForScrollbar(element, theme);\n    }\n\n    if (onEntering) {\n      onEntering(element, isAppearing);\n    }\n  };\n\n  var handleListKeyDown = function handleListKeyDown(event) {\n    if (event.key === 'Tab') {\n      event.preventDefault();\n\n      if (onClose) {\n        onClose(event, 'tabKeyDown');\n      }\n    }\n  };\n  /**\n   * the index of the item should receive focus\n   * in a `variant=\"selectedMenu\"` it's the first `selected` item\n   * otherwise it's the very first item.\n   */\n\n\n  var activeItemIndex = -1; // since we inject focus related props into children we have to do a lookahead\n  // to check if there is a `selected` item. We're looking for the last `selected`\n  // item and use the first valid item as a fallback\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child)) {\n      return;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_3__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Menu component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    if (!child.props.disabled) {\n      if (variant !== \"menu\" && child.props.selected) {\n        activeItemIndex = index;\n      } else if (activeItemIndex === -1) {\n        activeItemIndex = index;\n      }\n    }\n  });\n  var items = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (index === activeItemIndex) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](child, {\n        ref: function ref(instance) {\n          // #StrictMode ready\n          contentAnchorRef.current = react_dom__WEBPACK_IMPORTED_MODULE_10__[\"findDOMNode\"](instance);\n          Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(child.ref, instance);\n        }\n      });\n    }\n\n    return child;\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Popover__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    getContentAnchorEl: getContentAnchorEl,\n    classes: PopoverClasses,\n    onClose: onClose,\n    onEntering: handleEntering,\n    anchorOrigin: theme.direction === 'rtl' ? RTL_ORIGIN : LTR_ORIGIN,\n    transformOrigin: theme.direction === 'rtl' ? RTL_ORIGIN : LTR_ORIGIN,\n    PaperProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, PaperProps, {\n      classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, PaperProps.classes, {\n        root: classes.paper\n      })\n    }),\n    open: open,\n    ref: ref,\n    transitionDuration: transitionDuration\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_MenuList__WEBPACK_IMPORTED_MODULE_9__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    onKeyDown: handleListKeyDown,\n    actions: menuListActionsRef,\n    autoFocus: autoFocus && (activeItemIndex === -1 || disableAutoFocusItem),\n    autoFocusItem: autoFocusItem,\n    variant: variant\n  }, MenuListProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.list, MenuListProps.className)\n  }), items));\n});\n true ? Menu.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A HTML element, or a function that returns it.\n   * It's used to set the position of the menu.\n   */\n  anchorEl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n  /**\n   * If `true` (Default) will focus the `[role=\"menu\"]` if no focusable child is found. Disabled\n   * children are not focusable. If you set this prop to `false` focus will be placed\n   * on the parent modal container. This has severe accessibility implications\n   * and should only be considered if you manage focus otherwise.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Menu contents, normally `MenuItem`s.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * When opening the menu will not focus the active item but the `[role=\"menu\"]`\n   * unless `autoFocus` is also set to `false`. Not using the default means not\n   * following WAI-ARIA authoring practices. Please be considerate about possible\n   * accessibility implications.\n   */\n  disableAutoFocusItem: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Props applied to the [`MenuList`](/api/menu-list/) element.\n   */\n  MenuListProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`, `\"tabKeyDown\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the Menu enters.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the Menu exits.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the menu is visible.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * @ignore\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * `classes` prop applied to the [`Popover`](/api/popover/) element.\n   */\n  PopoverClasses: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The length of the transition in `ms`, or 'auto'\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })]),\n\n  /**\n   * The variant to use. Use `menu` to prevent selected items from impacting the initial focus\n   * and the vertical alignment relative to the anchor element.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['menu', 'selectedMenu'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiMenu'\n})(Menu));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Menu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Menu__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ListItem */ \"./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.typography.body1, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      minHeight: 48,\n      paddingTop: 6,\n      paddingBottom: 6,\n      boxSizing: 'border-box',\n      width: 'auto',\n      overflow: 'hidden',\n      whiteSpace: 'nowrap'\n    }, theme.breakpoints.up('sm'), {\n      minHeight: 'auto'\n    })),\n    // TODO v5: remove\n\n    /* Styles applied to the root element if `disableGutters={false}`. */\n    gutters: {},\n\n    /* Styles applied to the root element if `selected={true}`. */\n    selected: {},\n\n    /* Styles applied to the root element if dense. */\n    dense: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.typography.body2, {\n      minHeight: 'auto'\n    })\n  };\n};\nvar MenuItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function MenuItem(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'li' : _props$component,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      ListItemClasses = props.ListItemClasses,\n      _props$role = props.role,\n      role = _props$role === void 0 ? 'menuitem' : _props$role,\n      selected = props.selected,\n      tabIndexProp = props.tabIndex,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"disableGutters\", \"ListItemClasses\", \"role\", \"selected\", \"tabIndex\"]);\n\n  var tabIndex;\n\n  if (!props.disabled) {\n    tabIndex = tabIndexProp !== undefined ? tabIndexProp : -1;\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_ListItem__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n    button: true,\n    role: role,\n    tabIndex: tabIndex,\n    component: component,\n    selected: selected,\n    disableGutters: disableGutters,\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      dense: classes.dense\n    }, ListItemClasses),\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, selected && classes.selected, !disableGutters && classes.gutters),\n    ref: ref\n  }, other));\n});\n true ? MenuItem.propTypes = {\n  /**\n   * Menu item contents.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * `classes` prop applied to the [`ListItem`](/api/list-item/) element.\n   */\n  ListItemClasses: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  role: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  selected: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiMenuItem'\n})(MenuItem));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MenuItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MenuItem */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _MenuItem__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../List */ \"./jaas-client/node_modules/@material-ui/core/esm/List/index.js\");\n/* harmony import */ var _utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/getScrollbarSize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\n\nfunction nextItem(list, item, disableListWrap) {\n  if (list === item) {\n    return list.firstChild;\n  }\n\n  if (item && item.nextElementSibling) {\n    return item.nextElementSibling;\n  }\n\n  return disableListWrap ? null : list.firstChild;\n}\n\nfunction previousItem(list, item, disableListWrap) {\n  if (list === item) {\n    return disableListWrap ? list.firstChild : list.lastChild;\n  }\n\n  if (item && item.previousElementSibling) {\n    return item.previousElementSibling;\n  }\n\n  return disableListWrap ? null : list.lastChild;\n}\n\nfunction textCriteriaMatches(nextFocus, textCriteria) {\n  if (textCriteria === undefined) {\n    return true;\n  }\n\n  var text = nextFocus.innerText;\n\n  if (text === undefined) {\n    // jsdom doesn't support innerText\n    text = nextFocus.textContent;\n  }\n\n  text = text.trim().toLowerCase();\n\n  if (text.length === 0) {\n    return false;\n  }\n\n  if (textCriteria.repeating) {\n    return text[0] === textCriteria.keys[0];\n  }\n\n  return text.indexOf(textCriteria.keys.join('')) === 0;\n}\n\nfunction moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, traversalFunction, textCriteria) {\n  var wrappedOnce = false;\n  var nextFocus = traversalFunction(list, currentFocus, currentFocus ? disableListWrap : false);\n\n  while (nextFocus) {\n    // Prevent infinite loop.\n    if (nextFocus === list.firstChild) {\n      if (wrappedOnce) {\n        return;\n      }\n\n      wrappedOnce = true;\n    } // Same logic as useAutocomplete.js\n\n\n    var nextFocusDisabled = disabledItemsFocusable ? false : nextFocus.disabled || nextFocus.getAttribute('aria-disabled') === 'true';\n\n    if (!nextFocus.hasAttribute('tabindex') || !textCriteriaMatches(nextFocus, textCriteria) || nextFocusDisabled) {\n      // Move to the next element.\n      nextFocus = traversalFunction(list, nextFocus, disableListWrap);\n    } else {\n      nextFocus.focus();\n      return;\n    }\n  }\n}\n\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"];\n/**\n * A permanently displayed menu following https://www.w3.org/TR/wai-aria-practices/#menubutton.\n * It's exposed to help customization of the [`Menu`](/api/menu/) component. If you\n * use it separately you need to move focus into the component manually. Once\n * the focus is placed inside the component it is fully keyboard accessible.\n */\n\nvar MenuList = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function MenuList(props, ref) {\n  var actions = props.actions,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      _props$autoFocusItem = props.autoFocusItem,\n      autoFocusItem = _props$autoFocusItem === void 0 ? false : _props$autoFocusItem,\n      children = props.children,\n      className = props.className,\n      _props$disabledItemsF = props.disabledItemsFocusable,\n      disabledItemsFocusable = _props$disabledItemsF === void 0 ? false : _props$disabledItemsF,\n      _props$disableListWra = props.disableListWrap,\n      disableListWrap = _props$disableListWra === void 0 ? false : _props$disableListWra,\n      onKeyDown = props.onKeyDown,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'selectedMenu' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"actions\", \"autoFocus\", \"autoFocusItem\", \"children\", \"className\", \"disabledItemsFocusable\", \"disableListWrap\", \"onKeyDown\", \"variant\"]);\n\n  var listRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var textCriteriaRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"]({\n    keys: [],\n    repeating: true,\n    previousKeyMatched: true,\n    lastTime: null\n  });\n  useEnhancedEffect(function () {\n    if (autoFocus) {\n      listRef.current.focus();\n    }\n  }, [autoFocus]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](actions, function () {\n    return {\n      adjustStyleForScrollbar: function adjustStyleForScrollbar(containerElement, theme) {\n        // Let's ignore that piece of logic if users are already overriding the width\n        // of the menu.\n        var noExplicitWidth = !listRef.current.style.width;\n\n        if (containerElement.clientHeight < listRef.current.clientHeight && noExplicitWidth) {\n          var scrollbarSize = \"\".concat(Object(_utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(true), \"px\");\n          listRef.current.style[theme.direction === 'rtl' ? 'paddingLeft' : 'paddingRight'] = scrollbarSize;\n          listRef.current.style.width = \"calc(100% + \".concat(scrollbarSize, \")\");\n        }\n\n        return listRef.current;\n      }\n    };\n  }, []);\n\n  var handleKeyDown = function handleKeyDown(event) {\n    var list = listRef.current;\n    var key = event.key;\n    /**\n     * @type {Element} - will always be defined since we are in a keydown handler\n     * attached to an element. A keydown event is either dispatched to the activeElement\n     * or document.body or document.documentElement. Only the first case will\n     * trigger this specific handler.\n     */\n\n    var currentFocus = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(list).activeElement;\n\n    if (key === 'ArrowDown') {\n      // Prevent scroll of the page\n      event.preventDefault();\n      moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, nextItem);\n    } else if (key === 'ArrowUp') {\n      event.preventDefault();\n      moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, previousItem);\n    } else if (key === 'Home') {\n      event.preventDefault();\n      moveFocus(list, null, disableListWrap, disabledItemsFocusable, nextItem);\n    } else if (key === 'End') {\n      event.preventDefault();\n      moveFocus(list, null, disableListWrap, disabledItemsFocusable, previousItem);\n    } else if (key.length === 1) {\n      var criteria = textCriteriaRef.current;\n      var lowerKey = key.toLowerCase();\n      var currTime = performance.now();\n\n      if (criteria.keys.length > 0) {\n        // Reset\n        if (currTime - criteria.lastTime > 500) {\n          criteria.keys = [];\n          criteria.repeating = true;\n          criteria.previousKeyMatched = true;\n        } else if (criteria.repeating && lowerKey !== criteria.keys[0]) {\n          criteria.repeating = false;\n        }\n      }\n\n      criteria.lastTime = currTime;\n      criteria.keys.push(lowerKey);\n      var keepFocusOnCurrent = currentFocus && !criteria.repeating && textCriteriaMatches(currentFocus, criteria);\n\n      if (criteria.previousKeyMatched && (keepFocusOnCurrent || moveFocus(list, currentFocus, false, disabledItemsFocusable, nextItem, criteria))) {\n        event.preventDefault();\n      } else {\n        criteria.previousKeyMatched = false;\n      }\n    }\n\n    if (onKeyDown) {\n      onKeyDown(event);\n    }\n  };\n\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    listRef.current = react_dom__WEBPACK_IMPORTED_MODULE_5__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleOwnRef, ref);\n  /**\n   * the index of the item should receive focus\n   * in a `variant=\"selectedMenu\"` it's the first `selected` item\n   * otherwise it's the very first item.\n   */\n\n  var activeItemIndex = -1; // since we inject focus related props into children we have to do a lookahead\n  // to check if there is a `selected` item. We're looking for the last `selected`\n  // item and use the first valid item as a fallback\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child, index) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child)) {\n      return;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_3__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Menu component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    if (!child.props.disabled) {\n      if (variant === 'selectedMenu' && child.props.selected) {\n        activeItemIndex = index;\n      } else if (activeItemIndex === -1) {\n        activeItemIndex = index;\n      }\n    }\n  });\n  var items = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (index === activeItemIndex) {\n      var newChildProps = {};\n\n      if (autoFocusItem) {\n        newChildProps.autoFocus = true;\n      }\n\n      if (child.props.tabIndex === undefined && variant === 'selectedMenu') {\n        newChildProps.tabIndex = 0;\n      }\n\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](child, newChildProps);\n    }\n\n    return child;\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    role: \"menu\",\n    ref: handleRef,\n    className: className,\n    onKeyDown: handleKeyDown,\n    tabIndex: autoFocus ? 0 : -1\n  }, other), items);\n});\n true ? MenuList.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, will focus the `[role=\"menu\"]` container and move into tab order.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, will focus the first menuitem if `variant=\"menu\"` or selected item\n   * if `variant=\"selectedMenu\"`.\n   */\n  autoFocusItem: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * MenuList contents, normally `MenuItem`s.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, will allow focus on disabled items.\n   */\n  disabledItemsFocusable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the menu items will not wrap focus.\n   */\n  disableListWrap: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * The variant to use. Use `menu` to prevent selected items from impacting the initial focus\n   * and the vertical alignment relative to the anchor element.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['menu', 'selectedMenu'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (MenuList);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MenuList__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MenuList */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _MenuList__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js ***!
-  \***********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Portal */ \"./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js\");\n/* harmony import */ var _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n/* harmony import */ var _styles_zIndex__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/zIndex */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js\");\n/* harmony import */ var _ModalManager__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ModalManager */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js\");\n/* harmony import */ var _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Unstable_TrapFocus */ \"./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js\");\n/* harmony import */ var _SimpleBackdrop__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./SimpleBackdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getContainer(container) {\n  container = typeof container === 'function' ? container() : container;\n  return react_dom__WEBPACK_IMPORTED_MODULE_3__[\"findDOMNode\"](container);\n}\n\nfunction getHasTransition(props) {\n  return props.children ? props.children.props.hasOwnProperty('in') : false;\n} // A modal manager used to track and manage the state of open Modals.\n// Modals don't open on the server so this won't conflict with concurrent requests.\n\n\nvar defaultManager = new _ModalManager__WEBPACK_IMPORTED_MODULE_13__[\"default\"]();\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'fixed',\n      zIndex: theme.zIndex.modal,\n      right: 0,\n      bottom: 0,\n      top: 0,\n      left: 0\n    },\n\n    /* Styles applied to the root element if the `Modal` has exited. */\n    hidden: {\n      visibility: 'hidden'\n    }\n  };\n};\n/**\n * Modal is a lower-level construct that is leveraged by the following components:\n *\n * - [Dialog](/api/dialog/)\n * - [Drawer](/api/drawer/)\n * - [Menu](/api/menu/)\n * - [Popover](/api/popover/)\n *\n * If you are creating a modal dialog, you probably want to use the [Dialog](/api/dialog/) component\n * rather than directly using Modal.\n *\n * This component shares many concepts with [react-overlays](https://react-bootstrap.github.io/react-overlays/#modals).\n */\n\nvar Modal = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Modal(inProps, ref) {\n  var theme = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_5__[\"useTheme\"])();\n  var props = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_5__[\"getThemeProps\"])({\n    name: 'MuiModal',\n    props: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inProps),\n    theme: theme\n  });\n\n  var _props$BackdropCompon = props.BackdropComponent,\n      BackdropComponent = _props$BackdropCompon === void 0 ? _SimpleBackdrop__WEBPACK_IMPORTED_MODULE_15__[\"default\"] : _props$BackdropCompon,\n      BackdropProps = props.BackdropProps,\n      children = props.children,\n      _props$closeAfterTran = props.closeAfterTransition,\n      closeAfterTransition = _props$closeAfterTran === void 0 ? false : _props$closeAfterTran,\n      container = props.container,\n      _props$disableAutoFoc = props.disableAutoFocus,\n      disableAutoFocus = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$disableBackdro = props.disableBackdropClick,\n      disableBackdropClick = _props$disableBackdro === void 0 ? false : _props$disableBackdro,\n      _props$disableEnforce = props.disableEnforceFocus,\n      disableEnforceFocus = _props$disableEnforce === void 0 ? false : _props$disableEnforce,\n      _props$disableEscapeK = props.disableEscapeKeyDown,\n      disableEscapeKeyDown = _props$disableEscapeK === void 0 ? false : _props$disableEscapeK,\n      _props$disablePortal = props.disablePortal,\n      disablePortal = _props$disablePortal === void 0 ? false : _props$disablePortal,\n      _props$disableRestore = props.disableRestoreFocus,\n      disableRestoreFocus = _props$disableRestore === void 0 ? false : _props$disableRestore,\n      _props$disableScrollL = props.disableScrollLock,\n      disableScrollLock = _props$disableScrollL === void 0 ? false : _props$disableScrollL,\n      _props$hideBackdrop = props.hideBackdrop,\n      hideBackdrop = _props$hideBackdrop === void 0 ? false : _props$hideBackdrop,\n      _props$keepMounted = props.keepMounted,\n      keepMounted = _props$keepMounted === void 0 ? false : _props$keepMounted,\n      _props$manager = props.manager,\n      manager = _props$manager === void 0 ? defaultManager : _props$manager,\n      onBackdropClick = props.onBackdropClick,\n      onClose = props.onClose,\n      onEscapeKeyDown = props.onEscapeKeyDown,\n      onRendered = props.onRendered,\n      open = props.open,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"BackdropComponent\", \"BackdropProps\", \"children\", \"closeAfterTransition\", \"container\", \"disableAutoFocus\", \"disableBackdropClick\", \"disableEnforceFocus\", \"disableEscapeKeyDown\", \"disablePortal\", \"disableRestoreFocus\", \"disableScrollLock\", \"hideBackdrop\", \"keepMounted\", \"manager\", \"onBackdropClick\", \"onClose\", \"onEscapeKeyDown\", \"onRendered\", \"open\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](true),\n      exited = _React$useState[0],\n      setExited = _React$useState[1];\n\n  var modal = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"]({});\n  var mountNodeRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var modalRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(modalRef, ref);\n  var hasTransition = getHasTransition(props);\n\n  var getDoc = function getDoc() {\n    return Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(mountNodeRef.current);\n  };\n\n  var getModal = function getModal() {\n    modal.current.modalRef = modalRef.current;\n    modal.current.mountNode = mountNodeRef.current;\n    return modal.current;\n  };\n\n  var handleMounted = function handleMounted() {\n    manager.mount(getModal(), {\n      disableScrollLock: disableScrollLock\n    }); // Fix a bug on Chrome where the scroll isn't initially 0.\n\n    modalRef.current.scrollTop = 0;\n  };\n\n  var handleOpen = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(function () {\n    var resolvedContainer = getContainer(container) || getDoc().body;\n    manager.add(getModal(), resolvedContainer); // The element was already mounted.\n\n    if (modalRef.current) {\n      handleMounted();\n    }\n  });\n  var isTopModal = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    return manager.isTopModal(getModal());\n  }, [manager]);\n  var handlePortalRef = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(function (node) {\n    mountNodeRef.current = node;\n\n    if (!node) {\n      return;\n    }\n\n    if (onRendered) {\n      onRendered();\n    }\n\n    if (open && isTopModal()) {\n      handleMounted();\n    } else {\n      Object(_ModalManager__WEBPACK_IMPORTED_MODULE_13__[\"ariaHidden\"])(modalRef.current, true);\n    }\n  });\n  var handleClose = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    manager.remove(getModal());\n  }, [manager]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    return function () {\n      handleClose();\n    };\n  }, [handleClose]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (open) {\n      handleOpen();\n    } else if (!hasTransition || !closeAfterTransition) {\n      handleClose();\n    }\n  }, [open, handleClose, hasTransition, closeAfterTransition, handleOpen]);\n\n  if (!keepMounted && !open && (!hasTransition || exited)) {\n    return null;\n  }\n\n  var handleEnter = function handleEnter() {\n    setExited(false);\n  };\n\n  var handleExited = function handleExited() {\n    setExited(true);\n\n    if (closeAfterTransition) {\n      handleClose();\n    }\n  };\n\n  var handleBackdropClick = function handleBackdropClick(event) {\n    if (event.target !== event.currentTarget) {\n      return;\n    }\n\n    if (onBackdropClick) {\n      onBackdropClick(event);\n    }\n\n    if (!disableBackdropClick && onClose) {\n      onClose(event, 'backdropClick');\n    }\n  };\n\n  var handleKeyDown = function handleKeyDown(event) {\n    // The handler doesn't take event.defaultPrevented into account:\n    //\n    // event.preventDefault() is meant to stop default behaviours like\n    // clicking a checkbox to check it, hitting a button to submit a form,\n    // and hitting left arrow to move the cursor in a text input etc.\n    // Only special HTML elements have these default behaviors.\n    if (event.key !== 'Escape' || !isTopModal()) {\n      return;\n    }\n\n    if (onEscapeKeyDown) {\n      onEscapeKeyDown(event);\n    }\n\n    if (!disableEscapeKeyDown) {\n      // Swallow the event, in case someone is listening for the escape key on the body.\n      event.stopPropagation();\n\n      if (onClose) {\n        onClose(event, 'escapeKeyDown');\n      }\n    }\n  };\n\n  var inlineStyle = styles(theme || {\n    zIndex: _styles_zIndex__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n  });\n  var childProps = {};\n\n  if (children.props.tabIndex === undefined) {\n    childProps.tabIndex = children.props.tabIndex || '-1';\n  } // It's a Transition like component\n\n\n  if (hasTransition) {\n    childProps.onEnter = Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleEnter, children.props.onEnter);\n    childProps.onExited = Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleExited, children.props.onExited);\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Portal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n    ref: handlePortalRef,\n    container: container,\n    disablePortal: disablePortal\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    ref: handleRef,\n    onKeyDown: handleKeyDown,\n    role: \"presentation\"\n  }, other, {\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inlineStyle.root, !open && exited ? inlineStyle.hidden : {}, other.style)\n  }), hideBackdrop ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](BackdropComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    open: open,\n    onClick: handleBackdropClick\n  }, BackdropProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n    disableEnforceFocus: disableEnforceFocus,\n    disableAutoFocus: disableAutoFocus,\n    disableRestoreFocus: disableRestoreFocus,\n    getDoc: getDoc,\n    isEnabled: isTopModal,\n    open: open\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](children, childProps))));\n});\n true ? Modal.propTypes = {\n  /**\n   * A backdrop component. This prop enables custom backdrop rendering.\n   */\n  BackdropComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * Props applied to the [`Backdrop`](/api/backdrop/) element.\n   */\n  BackdropProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * A single child content element.\n   */\n  children: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"elementAcceptingRef\"].isRequired,\n\n  /**\n   * When set to true the Modal waits until a nested Transition is completed before closing.\n   */\n  closeAfterTransition: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will have the portal children appended to it.\n   *\n   * By default, it uses the body of the top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_2__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n  /**\n   * If `true`, the modal will not automatically shift focus to itself when it opens, and\n   * replace it to the last focused element when it closes.\n   * This also works correctly with any modal children that have the `disableAutoFocus` prop.\n   *\n   * Generally this should never be set to `true` as it makes the modal less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableAutoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, clicking the backdrop will not fire `onClose`.\n   */\n  disableBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the modal will not prevent focus from leaving the modal while open.\n   *\n   * Generally this should never be set to `true` as it makes the modal less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableEnforceFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, hitting escape will not fire `onClose`.\n   */\n  disableEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Disable the portal behavior.\n   * The children stay within it's parent DOM hierarchy.\n   */\n  disablePortal: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the modal will not restore focus to previously focused element once\n   * modal is hidden.\n   */\n  disableRestoreFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Disable the scroll lock behavior.\n   */\n  disableScrollLock: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is not rendered.\n   */\n  hideBackdrop: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Always keep the children in the DOM.\n   * This prop can be useful in SEO situation or\n   * when you want to maximize the responsiveness of the Modal.\n   */\n  keepMounted: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  manager: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Callback fired when the backdrop is clicked.\n   */\n  onBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * The `reason` parameter can optionally be used to control the response to `onClose`.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the escape key is pressed,\n   * `disableEscapeKeyDown` is false and the modal is in focus.\n   */\n  onEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired once the children has been mounted into the `container`.\n   * It signals that the `open={true}` prop took effect.\n   *\n   * This prop will be deprecated and removed in v5, the ref can be used instead.\n   */\n  onRendered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the modal is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Modal);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js ***!
-  \******************************************************************************/
-/*! exports provided: ariaHidden, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ariaHidden\", function() { return ariaHidden; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModalManager; });\n/* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getScrollbarSize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js\");\n\n\n\n\n\n // Is a vertical scrollbar displayed?\n\nfunction isOverflowing(container) {\n  var doc = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(container);\n\n  if (doc.body === container) {\n    return Object(_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(doc).innerWidth > doc.documentElement.clientWidth;\n  }\n\n  return container.scrollHeight > container.clientHeight;\n}\n\nfunction ariaHidden(node, show) {\n  if (show) {\n    node.setAttribute('aria-hidden', 'true');\n  } else {\n    node.removeAttribute('aria-hidden');\n  }\n}\n\nfunction getPaddingRight(node) {\n  return parseInt(window.getComputedStyle(node)['padding-right'], 10) || 0;\n}\n\nfunction ariaHiddenSiblings(container, mountNode, currentNode) {\n  var nodesToExclude = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n  var show = arguments.length > 4 ? arguments[4] : undefined;\n  var blacklist = [mountNode, currentNode].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(nodesToExclude));\n  var blacklistTagNames = ['TEMPLATE', 'SCRIPT', 'STYLE'];\n  [].forEach.call(container.children, function (node) {\n    if (node.nodeType === 1 && blacklist.indexOf(node) === -1 && blacklistTagNames.indexOf(node.tagName) === -1) {\n      ariaHidden(node, show);\n    }\n  });\n}\n\nfunction findIndexOf(containerInfo, callback) {\n  var idx = -1;\n  containerInfo.some(function (item, index) {\n    if (callback(item)) {\n      idx = index;\n      return true;\n    }\n\n    return false;\n  });\n  return idx;\n}\n\nfunction handleContainer(containerInfo, props) {\n  var restoreStyle = [];\n  var restorePaddings = [];\n  var container = containerInfo.container;\n  var fixedNodes;\n\n  if (!props.disableScrollLock) {\n    if (isOverflowing(container)) {\n      // Compute the size before applying overflow hidden to avoid any scroll jumps.\n      var scrollbarSize = Object(_utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n      restoreStyle.push({\n        value: container.style.paddingRight,\n        key: 'padding-right',\n        el: container\n      }); // Use computed style, here to get the real padding to add our scrollbar width.\n\n      container.style['padding-right'] = \"\".concat(getPaddingRight(container) + scrollbarSize, \"px\"); // .mui-fixed is a global helper.\n\n      fixedNodes = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(container).querySelectorAll('.mui-fixed');\n      [].forEach.call(fixedNodes, function (node) {\n        restorePaddings.push(node.style.paddingRight);\n        node.style.paddingRight = \"\".concat(getPaddingRight(node) + scrollbarSize, \"px\");\n      });\n    } // Improve Gatsby support\n    // https://css-tricks.com/snippets/css/force-vertical-scrollbar/\n\n\n    var parent = container.parentElement;\n    var scrollContainer = parent.nodeName === 'HTML' && window.getComputedStyle(parent)['overflow-y'] === 'scroll' ? parent : container; // Block the scroll even if no scrollbar is visible to account for mobile keyboard\n    // screensize shrink.\n\n    restoreStyle.push({\n      value: scrollContainer.style.overflow,\n      key: 'overflow',\n      el: scrollContainer\n    });\n    scrollContainer.style.overflow = 'hidden';\n  }\n\n  var restore = function restore() {\n    if (fixedNodes) {\n      [].forEach.call(fixedNodes, function (node, i) {\n        if (restorePaddings[i]) {\n          node.style.paddingRight = restorePaddings[i];\n        } else {\n          node.style.removeProperty('padding-right');\n        }\n      });\n    }\n\n    restoreStyle.forEach(function (_ref) {\n      var value = _ref.value,\n          el = _ref.el,\n          key = _ref.key;\n\n      if (value) {\n        el.style.setProperty(key, value);\n      } else {\n        el.style.removeProperty(key);\n      }\n    });\n  };\n\n  return restore;\n}\n\nfunction getHiddenSiblings(container) {\n  var hiddenSiblings = [];\n  [].forEach.call(container.children, function (node) {\n    if (node.getAttribute && node.getAttribute('aria-hidden') === 'true') {\n      hiddenSiblings.push(node);\n    }\n  });\n  return hiddenSiblings;\n}\n/**\n * @ignore - do not document.\n *\n * Proper state management for containers and the modals in those containers.\n * Simplified, but inspired by react-overlay's ModalManager class.\n * Used by the Modal to ensure proper styling of containers.\n */\n\n\nvar ModalManager = /*#__PURE__*/function () {\n  function ModalManager() {\n    Object(_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(this, ModalManager);\n\n    // this.modals[modalIndex] = modal\n    this.modals = []; // this.containers[containerIndex] = {\n    //   modals: [],\n    //   container,\n    //   restore: null,\n    // }\n\n    this.containers = [];\n  }\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(ModalManager, [{\n    key: \"add\",\n    value: function add(modal, container) {\n      var modalIndex = this.modals.indexOf(modal);\n\n      if (modalIndex !== -1) {\n        return modalIndex;\n      }\n\n      modalIndex = this.modals.length;\n      this.modals.push(modal); // If the modal we are adding is already in the DOM.\n\n      if (modal.modalRef) {\n        ariaHidden(modal.modalRef, false);\n      }\n\n      var hiddenSiblingNodes = getHiddenSiblings(container);\n      ariaHiddenSiblings(container, modal.mountNode, modal.modalRef, hiddenSiblingNodes, true);\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.container === container;\n      });\n\n      if (containerIndex !== -1) {\n        this.containers[containerIndex].modals.push(modal);\n        return modalIndex;\n      }\n\n      this.containers.push({\n        modals: [modal],\n        container: container,\n        restore: null,\n        hiddenSiblingNodes: hiddenSiblingNodes\n      });\n      return modalIndex;\n    }\n  }, {\n    key: \"mount\",\n    value: function mount(modal, props) {\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.modals.indexOf(modal) !== -1;\n      });\n      var containerInfo = this.containers[containerIndex];\n\n      if (!containerInfo.restore) {\n        containerInfo.restore = handleContainer(containerInfo, props);\n      }\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(modal) {\n      var modalIndex = this.modals.indexOf(modal);\n\n      if (modalIndex === -1) {\n        return modalIndex;\n      }\n\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.modals.indexOf(modal) !== -1;\n      });\n      var containerInfo = this.containers[containerIndex];\n      containerInfo.modals.splice(containerInfo.modals.indexOf(modal), 1);\n      this.modals.splice(modalIndex, 1); // If that was the last modal in a container, clean up the container.\n\n      if (containerInfo.modals.length === 0) {\n        // The modal might be closed before it had the chance to be mounted in the DOM.\n        if (containerInfo.restore) {\n          containerInfo.restore();\n        }\n\n        if (modal.modalRef) {\n          // In case the modal wasn't in the DOM yet.\n          ariaHidden(modal.modalRef, true);\n        }\n\n        ariaHiddenSiblings(containerInfo.container, modal.mountNode, modal.modalRef, containerInfo.hiddenSiblingNodes, false);\n        this.containers.splice(containerIndex, 1);\n      } else {\n        // Otherwise make sure the next top modal is visible to a screen reader.\n        var nextTop = containerInfo.modals[containerInfo.modals.length - 1]; // as soon as a modal is adding its modalRef is undefined. it can't set\n        // aria-hidden because the dom element doesn't exist either\n        // when modal was unmounted before modalRef gets null\n\n        if (nextTop.modalRef) {\n          ariaHidden(nextTop.modalRef, false);\n        }\n      }\n\n      return modalIndex;\n    }\n  }, {\n    key: \"isTopModal\",\n    value: function isTopModal(modal) {\n      return this.modals.length > 0 && this.modals[this.modals.length - 1] === modal;\n    }\n  }]);\n\n  return ModalManager;\n}();\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js ***!
-  \********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    zIndex: -1,\n    position: 'fixed',\n    right: 0,\n    bottom: 0,\n    top: 0,\n    left: 0,\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    WebkitTapHighlightColor: 'transparent'\n  },\n\n  /* Styles applied to the root element if `invisible={true}`. */\n  invisible: {\n    backgroundColor: 'transparent'\n  }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SimpleBackdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function SimpleBackdrop(props, ref) {\n  var _props$invisible = props.invisible,\n      invisible = _props$invisible === void 0 ? false : _props$invisible,\n      open = props.open,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"invisible\", \"open\"]);\n\n  return open ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-hidden\": true,\n    ref: ref\n  }, other, {\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles.root, invisible ? styles.invisible : {}, other.style)\n  })) : null;\n});\n true ? SimpleBackdrop.propTypes = {\n  /**\n   * If `true`, the backdrop is invisible.\n   * It can be used when rendering a popover or a custom select component.\n   */\n  invisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (SimpleBackdrop);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js ***!
-  \***********************************************************************/
-/*! exports provided: default, ModalManager */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Modal__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _ModalManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ModalManager */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ModalManager\", function() { return _ModalManager__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js ***!
-  \*************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _NativeSelectInput__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NativeSelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/svg-icons/ArrowDropDown */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the select component `root` class. */\n    root: {},\n\n    /* Styles applied to the select component `select` class. */\n    select: {\n      '-moz-appearance': 'none',\n      // Reset\n      '-webkit-appearance': 'none',\n      // Reset\n      // When interacting quickly, the text can end up selected.\n      // Native select can't be selected either.\n      userSelect: 'none',\n      borderRadius: 0,\n      // Reset\n      minWidth: 16,\n      // So it doesn't collapse.\n      cursor: 'pointer',\n      '&:focus': {\n        // Show that it's not an text input\n        backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.05)' : 'rgba(255, 255, 255, 0.05)',\n        borderRadius: 0 // Reset Chrome style\n\n      },\n      // Remove IE 11 arrow\n      '&::-ms-expand': {\n        display: 'none'\n      },\n      '&$disabled': {\n        cursor: 'default'\n      },\n      '&[multiple]': {\n        height: 'auto'\n      },\n      '&:not([multiple]) option, &:not([multiple]) optgroup': {\n        backgroundColor: theme.palette.background.paper\n      },\n      '&&': {\n        paddingRight: 24\n      }\n    },\n\n    /* Styles applied to the select component if `variant=\"filled\"`. */\n    filled: {\n      '&&': {\n        paddingRight: 32\n      }\n    },\n\n    /* Styles applied to the select component if `variant=\"outlined\"`. */\n    outlined: {\n      borderRadius: theme.shape.borderRadius,\n      '&&': {\n        paddingRight: 32\n      }\n    },\n\n    /* Styles applied to the select component `selectMenu` class. */\n    selectMenu: {\n      height: 'auto',\n      // Resets for multpile select with chips\n      minHeight: '1.1876em',\n      // Required for select\\text-field height consistency\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      overflow: 'hidden'\n    },\n\n    /* Pseudo-class applied to the select component `disabled` class. */\n    disabled: {},\n\n    /* Styles applied to the icon component. */\n    icon: {\n      // We use a position absolute over a flexbox in order to forward the pointer events\n      // to the input and to support wrapping tags..\n      position: 'absolute',\n      right: 0,\n      top: 'calc(50% - 12px)',\n      // Center vertically\n      pointerEvents: 'none',\n      // Don't block pointer events on the select under the icon.\n      color: theme.palette.action.active,\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the icon component if the popup is open. */\n    iconOpen: {\n      transform: 'rotate(180deg)'\n    },\n\n    /* Styles applied to the icon component if `variant=\"filled\"`. */\n    iconFilled: {\n      right: 7\n    },\n\n    /* Styles applied to the icon component if `variant=\"outlined\"`. */\n    iconOutlined: {\n      right: 7\n    },\n\n    /* Styles applied to the underlying native input component. */\n    nativeInput: {\n      bottom: 0,\n      left: 0,\n      position: 'absolute',\n      opacity: 0,\n      pointerEvents: 'none',\n      width: '100%'\n    }\n  };\n};\nvar defaultInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Input__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null);\n/**\n * An alternative to `<Select native />` with a much smaller bundle size footprint.\n */\n\nvar NativeSelect = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function NativeSelect(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      _props$IconComponent = props.IconComponent,\n      IconComponent = _props$IconComponent === void 0 ? _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_8__[\"default\"] : _props$IconComponent,\n      _props$input = props.input,\n      input = _props$input === void 0 ? defaultInput : _props$input,\n      inputProps = props.inputProps,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"IconComponent\", \"input\", \"inputProps\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](input, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // Most of the logic is implemented in `NativeSelectInput`.\n    // The `Select` component is a simple API wrapper to expose something better to play with.\n    inputComponent: _NativeSelectInput__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      children: children,\n      classes: classes,\n      IconComponent: IconComponent,\n      variant: fcs.variant,\n      type: undefined\n    }, inputProps, input ? input.props.inputProps : {}),\n    ref: ref\n  }, other));\n});\n true ? NativeSelect.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<option>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * An `Input` element; does not have to be a material-ui specific `Input`.\n   */\n  input: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element,\n\n  /**\n   * Attributes applied to the `select` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The input value. The DOM API casts this to a string.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\nNativeSelect.muiName = 'Select';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiNativeSelect'\n})(NativeSelect));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js ***!
-  \******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\nvar NativeSelectInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function NativeSelectInput(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      disabled = props.disabled,\n      IconComponent = props.IconComponent,\n      inputRef = props.inputRef,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"disabled\", \"IconComponent\", \"inputRef\", \"variant\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"select\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, // TODO v5: merge root and select\n    classes.select, classes[variant], className, disabled && classes.disabled),\n    disabled: disabled,\n    ref: inputRef || ref\n  }, other)), props.multiple ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](IconComponent, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.icon, classes[\"icon\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(variant))], disabled && classes.disabled)\n  }));\n});\n true ? NativeSelectInput.propTypes = {\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<option>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * The CSS class name of the select element.\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the select will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType.isRequired,\n\n  /**\n   * Use that prop to pass a ref to the native select element.\n   * @deprecated\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * @ignore\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `select` or hidden `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The input value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['standard', 'outlined', 'filled'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (NativeSelectInput);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js ***!
-  \****************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'absolute',\n      bottom: 0,\n      right: 0,\n      top: -5,\n      left: 0,\n      margin: 0,\n      padding: '0 8px',\n      pointerEvents: 'none',\n      borderRadius: 'inherit',\n      borderStyle: 'solid',\n      borderWidth: 1,\n      overflow: 'hidden'\n    },\n\n    /* Styles applied to the legend element when `labelWidth` is provided. */\n    legend: {\n      textAlign: 'left',\n      padding: 0,\n      lineHeight: '11px',\n      // sync with `height` in `legend` styles\n      transition: theme.transitions.create('width', {\n        duration: 150,\n        easing: theme.transitions.easing.easeOut\n      })\n    },\n\n    /* Styles applied to the legend element. */\n    legendLabelled: {\n      display: 'block',\n      width: 'auto',\n      textAlign: 'left',\n      padding: 0,\n      height: 11,\n      // sync with `lineHeight` in `legend` styles\n      fontSize: '0.75em',\n      visibility: 'hidden',\n      maxWidth: 0.01,\n      transition: theme.transitions.create('max-width', {\n        duration: 50,\n        easing: theme.transitions.easing.easeOut\n      }),\n      '& > span': {\n        paddingLeft: 5,\n        paddingRight: 5,\n        display: 'inline-block'\n      }\n    },\n\n    /* Styles applied to the legend element is notched. */\n    legendNotched: {\n      maxWidth: 1000,\n      transition: theme.transitions.create('max-width', {\n        duration: 100,\n        easing: theme.transitions.easing.easeOut,\n        delay: 50\n      })\n    }\n  };\n};\n/**\n * @ignore - internal component.\n */\n\nvar NotchedOutline = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function NotchedOutline(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      label = props.label,\n      labelWidthProp = props.labelWidth,\n      notched = props.notched,\n      style = props.style,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"label\", \"labelWidth\", \"notched\", \"style\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var align = theme.direction === 'rtl' ? 'right' : 'left';\n\n  if (label !== undefined) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"fieldset\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      \"aria-hidden\": true,\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n      ref: ref,\n      style: style\n    }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"legend\", {\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.legendLabelled, notched && classes.legendNotched)\n    }, label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", null, label) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", {\n      dangerouslySetInnerHTML: {\n        __html: '&#8203;'\n      }\n    })));\n  }\n\n  var labelWidth = labelWidthProp > 0 ? labelWidthProp * 0.75 + 8 : 0.01;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"fieldset\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    \"aria-hidden\": true,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, \"padding\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(align)), 8), style),\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"legend\", {\n    className: classes.legend,\n    style: {\n      // IE 11: fieldset with legend does not render\n      // a border radius. This maintains consistency\n      // by always having a legend rendered\n      width: notched ? labelWidth : 0.01\n    }\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  })));\n});\n true ? NotchedOutline.propTypes = {\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The label.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * The width of the label.\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number.isRequired,\n\n  /**\n   * If `true`, the outline is notched to accommodate the label.\n   */\n  notched: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'PrivateNotchedOutline'\n})(NotchedOutline));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js ***!
-  \***************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _NotchedOutline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./NotchedOutline */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var borderColor = theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      borderRadius: theme.shape.borderRadius,\n      '&:hover $notchedOutline': {\n        borderColor: theme.palette.text.primary\n      },\n      // Reset on touch devices, it doesn't add specificity\n      '@media (hover: none)': {\n        '&:hover $notchedOutline': {\n          borderColor: borderColor\n        }\n      },\n      '&$focused $notchedOutline': {\n        borderColor: theme.palette.primary.main,\n        borderWidth: 2\n      },\n      '&$error $notchedOutline': {\n        borderColor: theme.palette.error.main\n      },\n      '&$disabled $notchedOutline': {\n        borderColor: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {\n      '&$focused $notchedOutline': {\n        borderColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {\n      paddingLeft: 14\n    },\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {\n      paddingRight: 14\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: '18.5px 14px',\n      '&$marginDense': {\n        paddingTop: 10.5,\n        paddingBottom: 10.5\n      }\n    },\n\n    /* Styles applied to the `NotchedOutline` element. */\n    notchedOutline: {\n      borderColor: borderColor\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      padding: '18.5px 14px',\n      '&:-webkit-autofill': {\n        WebkitBoxShadow: theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\n        WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\n        caretColor: theme.palette.type === 'light' ? null : '#fff',\n        borderRadius: 'inherit'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 10.5,\n      paddingBottom: 10.5\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {\n      paddingLeft: 0\n    },\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {\n      paddingRight: 0\n    }\n  };\n};\nvar OutlinedInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function OutlinedInput(props, ref) {\n  var classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      label = props.label,\n      _props$labelWidth = props.labelWidth,\n      labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      notched = props.notched,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"fullWidth\", \"inputComponent\", \"label\", \"labelWidth\", \"multiline\", \"notched\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    renderSuffix: function renderSuffix(state) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_NotchedOutline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n        className: classes.notchedOutline,\n        label: label,\n        labelWidth: labelWidth,\n        notched: typeof notched !== 'undefined' ? notched : Boolean(state.startAdornment || state.filled || state.focused)\n      });\n    },\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes.underline),\n      notchedOutline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? OutlinedInput.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The label of the input. It is only used for layout. The actual labelling\n   * is handled by `InputLabel`. If specified `labelWidth` is ignored.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The width of the label. Is ignored if `label` is provided. Prefer `label`\n   * if the input label appears with a strike through.\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the outline is notched to accommodate the label.\n   */\n  notched: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nOutlinedInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiOutlinedInput'\n})(OutlinedInput));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _OutlinedInput__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js ***!
-  \***********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var elevations = {};\n  theme.shadows.forEach(function (shadow, index) {\n    elevations[\"elevation\".concat(index)] = {\n      boxShadow: shadow\n    };\n  });\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    /* Styles applied to the root element. */\n    root: {\n      backgroundColor: theme.palette.background.paper,\n      color: theme.palette.text.primary,\n      transition: theme.transitions.create('box-shadow')\n    },\n\n    /* Styles applied to the root element if `square={false}`. */\n    rounded: {\n      borderRadius: theme.shape.borderRadius\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      border: \"1px solid \".concat(theme.palette.divider)\n    }\n  }, elevations);\n};\nvar Paper = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Paper(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$square = props.square,\n      square = _props$square === void 0 ? false : _props$square,\n      _props$elevation = props.elevation,\n      elevation = _props$elevation === void 0 ? 1 : _props$elevation,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'elevation' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"square\", \"elevation\", \"variant\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, variant === 'outlined' ? classes.outlined : classes[\"elevation\".concat(elevation)], !square && classes.rounded),\n    ref: ref\n  }, other));\n});\n true ? Paper.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Shadow depth, corresponds to `dp` in the spec.\n   * It accepts values between 0 and 24 inclusive.\n   */\n  elevation: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, function (props) {\n    var classes = props.classes,\n        elevation = props.elevation; // in case `withStyles` fails to inject we don't need this warning\n\n    if (classes === undefined) {\n      return null;\n    }\n\n    if (elevation != null && classes[\"elevation\".concat(elevation)] === undefined) {\n      return new Error(\"Material-UI: This elevation `\".concat(elevation, \"` is not implemented.\"));\n    }\n\n    return null;\n  }),\n\n  /**\n   * If `true`, rounded corners are disabled.\n   */\n  square: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['elevation', 'outlined'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiPaper'\n})(Paper));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Paper__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js ***!
-  \***************************************************************************/
-/*! exports provided: getOffsetTop, getOffsetLeft, styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getOffsetTop\", function() { return getOffsetTop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getOffsetLeft\", function() { return getOffsetLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/debounce */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js\");\n/* harmony import */ var _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js\");\n/* harmony import */ var _Grow__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Grow */ \"./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js\");\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getOffsetTop(rect, vertical) {\n  var offset = 0;\n\n  if (typeof vertical === 'number') {\n    offset = vertical;\n  } else if (vertical === 'center') {\n    offset = rect.height / 2;\n  } else if (vertical === 'bottom') {\n    offset = rect.height;\n  }\n\n  return offset;\n}\nfunction getOffsetLeft(rect, horizontal) {\n  var offset = 0;\n\n  if (typeof horizontal === 'number') {\n    offset = horizontal;\n  } else if (horizontal === 'center') {\n    offset = rect.width / 2;\n  } else if (horizontal === 'right') {\n    offset = rect.width;\n  }\n\n  return offset;\n}\n\nfunction getTransformOriginValue(transformOrigin) {\n  return [transformOrigin.horizontal, transformOrigin.vertical].map(function (n) {\n    return typeof n === 'number' ? \"\".concat(n, \"px\") : n;\n  }).join(' ');\n} // Sum the scrollTop between two elements.\n\n\nfunction getScrollParent(parent, child) {\n  var element = child;\n  var scrollTop = 0;\n\n  while (element && element !== parent) {\n    element = element.parentElement;\n    scrollTop += element.scrollTop;\n  }\n\n  return scrollTop;\n}\n\nfunction getAnchorEl(anchorEl) {\n  return typeof anchorEl === 'function' ? anchorEl() : anchorEl;\n}\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {},\n\n  /* Styles applied to the `Paper` component. */\n  paper: {\n    position: 'absolute',\n    overflowY: 'auto',\n    overflowX: 'hidden',\n    // So we see the popover when it's empty.\n    // It's most likely on issue on userland.\n    minWidth: 16,\n    minHeight: 16,\n    maxWidth: 'calc(100% - 32px)',\n    maxHeight: 'calc(100% - 32px)',\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0\n  }\n};\nvar Popover = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Popover(props, ref) {\n  var action = props.action,\n      anchorEl = props.anchorEl,\n      _props$anchorOrigin = props.anchorOrigin,\n      anchorOrigin = _props$anchorOrigin === void 0 ? {\n    vertical: 'top',\n    horizontal: 'left'\n  } : _props$anchorOrigin,\n      anchorPosition = props.anchorPosition,\n      _props$anchorReferenc = props.anchorReference,\n      anchorReference = _props$anchorReferenc === void 0 ? 'anchorEl' : _props$anchorReferenc,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      containerProp = props.container,\n      _props$elevation = props.elevation,\n      elevation = _props$elevation === void 0 ? 8 : _props$elevation,\n      getContentAnchorEl = props.getContentAnchorEl,\n      _props$marginThreshol = props.marginThreshold,\n      marginThreshold = _props$marginThreshol === void 0 ? 16 : _props$marginThreshol,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      open = props.open,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      _props$transformOrigi = props.transformOrigin,\n      transformOrigin = _props$transformOrigi === void 0 ? {\n    vertical: 'top',\n    horizontal: 'left'\n  } : _props$transformOrigi,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Grow__WEBPACK_IMPORTED_MODULE_13__[\"default\"] : _props$TransitionComp,\n      _props$transitionDura = props.transitionDuration,\n      transitionDurationProp = _props$transitionDura === void 0 ? 'auto' : _props$transitionDura,\n      _props$TransitionProp = props.TransitionProps,\n      TransitionProps = _props$TransitionProp === void 0 ? {} : _props$TransitionProp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"action\", \"anchorEl\", \"anchorOrigin\", \"anchorPosition\", \"anchorReference\", \"children\", \"classes\", \"className\", \"container\", \"elevation\", \"getContentAnchorEl\", \"marginThreshold\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"open\", \"PaperProps\", \"transformOrigin\", \"TransitionComponent\", \"transitionDuration\", \"TransitionProps\"]);\n\n  var paperRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](); // Returns the top/left offset of the position\n  // to attach to on the anchor element (or body if none is provided)\n\n  var getAnchorOffset = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (contentAnchorOffset) {\n    if (anchorReference === 'anchorPosition') {\n      if (true) {\n        if (!anchorPosition) {\n          console.error('Material-UI: You need to provide a `anchorPosition` prop when using ' + '<Popover anchorReference=\"anchorPosition\" />.');\n        }\n      }\n\n      return anchorPosition;\n    }\n\n    var resolvedAnchorEl = getAnchorEl(anchorEl); // If an anchor element wasn't provided, just use the parent body element of this Popover\n\n    var anchorElement = resolvedAnchorEl && resolvedAnchorEl.nodeType === 1 ? resolvedAnchorEl : Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(paperRef.current).body;\n    var anchorRect = anchorElement.getBoundingClientRect();\n\n    if (true) {\n      var box = anchorElement.getBoundingClientRect();\n\n      if ( true && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n        console.warn(['Material-UI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n      }\n    }\n\n    var anchorVertical = contentAnchorOffset === 0 ? anchorOrigin.vertical : 'center';\n    return {\n      top: anchorRect.top + getOffsetTop(anchorRect, anchorVertical),\n      left: anchorRect.left + getOffsetLeft(anchorRect, anchorOrigin.horizontal)\n    };\n  }, [anchorEl, anchorOrigin.horizontal, anchorOrigin.vertical, anchorPosition, anchorReference]); // Returns the vertical offset of inner content to anchor the transform on if provided\n\n  var getContentAnchorOffset = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (element) {\n    var contentAnchorOffset = 0;\n\n    if (getContentAnchorEl && anchorReference === 'anchorEl') {\n      var contentAnchorEl = getContentAnchorEl(element);\n\n      if (contentAnchorEl && element.contains(contentAnchorEl)) {\n        var scrollTop = getScrollParent(element, contentAnchorEl);\n        contentAnchorOffset = contentAnchorEl.offsetTop + contentAnchorEl.clientHeight / 2 - scrollTop || 0;\n      } // != the default value\n\n\n      if (true) {\n        if (anchorOrigin.vertical !== 'top') {\n          console.error(['Material-UI: You can not change the default `anchorOrigin.vertical` value ', 'when also providing the `getContentAnchorEl` prop to the popover component.', 'Only use one of the two props.', 'Set `getContentAnchorEl` to `null | undefined`' + ' or leave `anchorOrigin.vertical` unchanged.'].join('\\n'));\n        }\n      }\n    }\n\n    return contentAnchorOffset;\n  }, [anchorOrigin.vertical, anchorReference, getContentAnchorEl]); // Return the base transform origin using the element\n  // and taking the content anchor offset into account if in use\n\n  var getTransformOrigin = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (elemRect) {\n    var contentAnchorOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    return {\n      vertical: getOffsetTop(elemRect, transformOrigin.vertical) + contentAnchorOffset,\n      horizontal: getOffsetLeft(elemRect, transformOrigin.horizontal)\n    };\n  }, [transformOrigin.horizontal, transformOrigin.vertical]);\n  var getPositioningStyle = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (element) {\n    // Check if the parent has requested anchoring on an inner content node\n    var contentAnchorOffset = getContentAnchorOffset(element);\n    var elemRect = {\n      width: element.offsetWidth,\n      height: element.offsetHeight\n    }; // Get the transform origin point on the element itself\n\n    var elemTransformOrigin = getTransformOrigin(elemRect, contentAnchorOffset);\n\n    if (anchorReference === 'none') {\n      return {\n        top: null,\n        left: null,\n        transformOrigin: getTransformOriginValue(elemTransformOrigin)\n      };\n    } // Get the offset of of the anchoring element\n\n\n    var anchorOffset = getAnchorOffset(contentAnchorOffset); // Calculate element positioning\n\n    var top = anchorOffset.top - elemTransformOrigin.vertical;\n    var left = anchorOffset.left - elemTransformOrigin.horizontal;\n    var bottom = top + elemRect.height;\n    var right = left + elemRect.width; // Use the parent window of the anchorEl if provided\n\n    var containerWindow = Object(_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(getAnchorEl(anchorEl)); // Window thresholds taking required margin into account\n\n    var heightThreshold = containerWindow.innerHeight - marginThreshold;\n    var widthThreshold = containerWindow.innerWidth - marginThreshold; // Check if the vertical axis needs shifting\n\n    if (top < marginThreshold) {\n      var diff = top - marginThreshold;\n      top -= diff;\n      elemTransformOrigin.vertical += diff;\n    } else if (bottom > heightThreshold) {\n      var _diff = bottom - heightThreshold;\n\n      top -= _diff;\n      elemTransformOrigin.vertical += _diff;\n    }\n\n    if (true) {\n      if (elemRect.height > heightThreshold && elemRect.height && heightThreshold) {\n        console.error(['Material-UI: The popover component is too tall.', \"Some part of it can not be seen on the screen (\".concat(elemRect.height - heightThreshold, \"px).\"), 'Please consider adding a `max-height` to improve the user-experience.'].join('\\n'));\n      }\n    } // Check if the horizontal axis needs shifting\n\n\n    if (left < marginThreshold) {\n      var _diff2 = left - marginThreshold;\n\n      left -= _diff2;\n      elemTransformOrigin.horizontal += _diff2;\n    } else if (right > widthThreshold) {\n      var _diff3 = right - widthThreshold;\n\n      left -= _diff3;\n      elemTransformOrigin.horizontal += _diff3;\n    }\n\n    return {\n      top: \"\".concat(Math.round(top), \"px\"),\n      left: \"\".concat(Math.round(left), \"px\"),\n      transformOrigin: getTransformOriginValue(elemTransformOrigin)\n    };\n  }, [anchorEl, anchorReference, getAnchorOffset, getContentAnchorOffset, getTransformOrigin, marginThreshold]);\n  var setPositioningStyles = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    var element = paperRef.current;\n\n    if (!element) {\n      return;\n    }\n\n    var positioning = getPositioningStyle(element);\n\n    if (positioning.top !== null) {\n      element.style.top = positioning.top;\n    }\n\n    if (positioning.left !== null) {\n      element.style.left = positioning.left;\n    }\n\n    element.style.transformOrigin = positioning.transformOrigin;\n  }, [getPositioningStyle]);\n\n  var handleEntering = function handleEntering(element, isAppearing) {\n    if (onEntering) {\n      onEntering(element, isAppearing);\n    }\n\n    setPositioningStyles();\n  };\n\n  var handlePaperRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    paperRef.current = react_dom__WEBPACK_IMPORTED_MODULE_4__[\"findDOMNode\"](instance);\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (open) {\n      setPositioningStyles();\n    }\n  });\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](action, function () {\n    return open ? {\n      updatePosition: function updatePosition() {\n        setPositioningStyles();\n      }\n    } : null;\n  }, [open, setPositioningStyles]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (!open) {\n      return undefined;\n    }\n\n    var handleResize = Object(_utils_debounce__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(function () {\n      setPositioningStyles();\n    });\n    window.addEventListener('resize', handleResize);\n    return function () {\n      handleResize.clear();\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [open, setPositioningStyles]);\n  var transitionDuration = transitionDurationProp;\n\n  if (transitionDurationProp === 'auto' && !TransitionComponent.muiSupportAuto) {\n    transitionDuration = undefined;\n  } // If the container prop is provided, use that\n  // If the anchorEl prop is provided, use its parent body element as the container\n  // If neither are provided let the Modal take care of choosing the container\n\n\n  var container = containerProp || (anchorEl ? Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(getAnchorEl(anchorEl)).body : undefined);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Modal__WEBPACK_IMPORTED_MODULE_12__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    container: container,\n    open: open,\n    ref: ref,\n    BackdropProps: {\n      invisible: true\n    },\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(classes.root, className)\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: open,\n    onEnter: onEnter,\n    onEntered: onEntered,\n    onExit: onExit,\n    onExited: onExited,\n    onExiting: onExiting,\n    timeout: transitionDuration\n  }, TransitionProps, {\n    onEntering: Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(handleEntering, TransitionProps.onEntering)\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Paper__WEBPACK_IMPORTED_MODULE_14__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    elevation: elevation,\n    ref: handlePaperRef\n  }, PaperProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(classes.paper, PaperProps.className)\n  }), children)));\n});\n true ? Popover.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A ref for imperative actions.\n   * It currently only supports updatePosition() action.\n   */\n  action: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * A HTML element, or a function that returns it.\n   * It's used to set the position of the popover.\n   */\n  anchorEl: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func]), function (props) {\n    if (props.open && (!props.anchorReference || props.anchorReference === 'anchorEl')) {\n      var resolvedAnchorEl = getAnchorEl(props.anchorEl);\n\n      if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {\n        var box = resolvedAnchorEl.getBoundingClientRect();\n\n        if ( true && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n          return new Error(['Material-UI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n        }\n      } else {\n        return new Error(['Material-UI: The `anchorEl` prop provided to the component is invalid.', \"It should be an Element instance but it's `\".concat(resolvedAnchorEl, \"` instead.\")].join('\\n'));\n      }\n    }\n\n    return null;\n  }),\n\n  /**\n   * This is the point on the anchor where the popover's\n   * `anchorEl` will attach to. This is not used when the\n   * anchorReference is 'anchorPosition'.\n   *\n   * Options:\n   * vertical: [top, center, bottom];\n   * horizontal: [left, center, right].\n   */\n  anchorOrigin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['center', 'left', 'right']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired,\n    vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'center', 'top']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired\n  }),\n\n  /**\n   * This is the position that may be used\n   * to set the position of the popover.\n   * The coordinates are relative to\n   * the application's client area.\n   */\n  anchorPosition: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    left: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number.isRequired,\n    top: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number.isRequired\n  }),\n\n  /**\n   * This determines which anchor prop to refer to to set\n   * the position of the popover.\n   */\n  anchorReference: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['anchorEl', 'anchorPosition', 'none']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will passed to the Modal component.\n   *\n   * By default, it uses the body of the anchorEl's top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_2__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func]),\n\n  /**\n   * The elevation of the popover.\n   */\n  elevation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * This function is called in order to retrieve the content anchor element.\n   * It's the opposite of the `anchorEl` prop.\n   * The content anchor element should be an element inside the popover.\n   * It's used to correctly scroll and set the position of the popover.\n   * The positioning strategy tries to make the content anchor element just above the\n   * anchor element.\n   */\n  getContentAnchorEl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Specifies how close to the edge of the window the popover can appear.\n   */\n  marginThreshold: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired before the component is entering.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired before the component is exiting.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * If `true`, the popover is visible.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,\n\n  /**\n   * Props applied to the [`Paper`](/api/paper/) element.\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .shape({\n    component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"elementTypeAcceptingRef\"]\n  }),\n\n  /**\n   * This is the point on the popover which\n   * will attach to the anchor's origin.\n   *\n   * Options:\n   * vertical: [top, center, bottom, x(px)];\n   * horizontal: [left, center, right, x(px)].\n   */\n  transformOrigin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['center', 'left', 'right']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired,\n    vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'center', 'top']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired\n  }),\n\n  /**\n   * The component used for the transition.\n   * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n   */\n  TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * Set to 'auto' to automatically calculate transition time based on height.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number\n  })]),\n\n  /**\n   * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.\n   */\n  TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(styles, {\n  name: 'MuiPopover'\n})(Popover));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover */ \"./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Popover__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_setRef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\nfunction getContainer(container) {\n  container = typeof container === 'function' ? container() : container; // #StrictMode ready\n\n  return react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](container);\n}\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"];\n/**\n * Portals provide a first-class way to render children into a DOM node\n * that exists outside the DOM hierarchy of the parent component.\n */\n\nvar Portal = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"forwardRef\"](function Portal(props, ref) {\n  var children = props.children,\n      container = props.container,\n      _props$disablePortal = props.disablePortal,\n      disablePortal = _props$disablePortal === void 0 ? false : _props$disablePortal,\n      onRendered = props.onRendered;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](null),\n      mountNode = _React$useState[0],\n      setMountNode = _React$useState[1];\n\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](children) ? children.ref : null, ref);\n  useEnhancedEffect(function () {\n    if (!disablePortal) {\n      setMountNode(getContainer(container) || document.body);\n    }\n  }, [container, disablePortal]);\n  useEnhancedEffect(function () {\n    if (mountNode && !disablePortal) {\n      Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(ref, mountNode);\n      return function () {\n        Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(ref, null);\n      };\n    }\n\n    return undefined;\n  }, [ref, mountNode, disablePortal]);\n  useEnhancedEffect(function () {\n    if (onRendered && (mountNode || disablePortal)) {\n      onRendered();\n    }\n  }, [onRendered, mountNode, disablePortal]);\n\n  if (disablePortal) {\n    if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](children)) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"](children, {\n        ref: handleRef\n      });\n    }\n\n    return children;\n  }\n\n  return mountNode ? /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1__[\"createPortal\"](children, mountNode) : mountNode;\n});\n true ? Portal.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The children to render into the `container`.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will have the portal children appended to it.\n   *\n   * By default, it uses the body of the top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func]),\n\n  /**\n   * Disable the portal behavior.\n   * The children stay within it's parent DOM hierarchy.\n   */\n  disablePortal: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Callback fired once the children has been mounted into the `container`.\n   *\n   * This prop will be deprecated and removed in v5, the ref can be used instead.\n   */\n  onRendered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  Portal['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"exactProp\"])(Portal.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Portal);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Portal */ \"./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Portal__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _SelectInput__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./SelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../internal/svg-icons/ArrowDropDown */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n/* harmony import */ var _NativeSelect_NativeSelect__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../NativeSelect/NativeSelect */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js\");\n/* harmony import */ var _NativeSelect_NativeSelectInput__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../NativeSelect/NativeSelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js\");\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js\");\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = _NativeSelect_NativeSelect__WEBPACK_IMPORTED_MODULE_11__[\"styles\"];\n\nvar _ref = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Input__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null);\n\nvar _ref2 = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FilledInput__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null);\n\nvar Select = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Select(props, ref) {\n  var _props$autoWidth = props.autoWidth,\n      autoWidth = _props$autoWidth === void 0 ? false : _props$autoWidth,\n      children = props.children,\n      classes = props.classes,\n      _props$displayEmpty = props.displayEmpty,\n      displayEmpty = _props$displayEmpty === void 0 ? false : _props$displayEmpty,\n      _props$IconComponent = props.IconComponent,\n      IconComponent = _props$IconComponent === void 0 ? _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_9__[\"default\"] : _props$IconComponent,\n      id = props.id,\n      input = props.input,\n      inputProps = props.inputProps,\n      label = props.label,\n      labelId = props.labelId,\n      _props$labelWidth = props.labelWidth,\n      labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth,\n      MenuProps = props.MenuProps,\n      _props$multiple = props.multiple,\n      multiple = _props$multiple === void 0 ? false : _props$multiple,\n      _props$native = props.native,\n      native = _props$native === void 0 ? false : _props$native,\n      onClose = props.onClose,\n      onOpen = props.onOpen,\n      open = props.open,\n      renderValue = props.renderValue,\n      SelectDisplayProps = props.SelectDisplayProps,\n      _props$variant = props.variant,\n      variantProps = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoWidth\", \"children\", \"classes\", \"displayEmpty\", \"IconComponent\", \"id\", \"input\", \"inputProps\", \"label\", \"labelId\", \"labelWidth\", \"MenuProps\", \"multiple\", \"native\", \"onClose\", \"onOpen\", \"open\", \"renderValue\", \"SelectDisplayProps\", \"variant\"]);\n\n  var inputComponent = native ? _NativeSelect_NativeSelectInput__WEBPACK_IMPORTED_MODULE_12__[\"default\"] : _SelectInput__WEBPACK_IMPORTED_MODULE_5__[\"default\"];\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant']\n  });\n  var variant = fcs.variant || variantProps;\n  var InputComponent = input || {\n    standard: _ref,\n    outlined: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_OutlinedInput__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n      label: label,\n      labelWidth: labelWidth\n    }),\n    filled: _ref2\n  }[variant];\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // Most of the logic is implemented in `SelectInput`.\n    // The `Select` component is a simple API wrapper to expose something better to play with.\n    inputComponent: inputComponent,\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      children: children,\n      IconComponent: IconComponent,\n      variant: variant,\n      type: undefined,\n      // We render a select. We can ignore the type provided by the `Input`.\n      multiple: multiple\n    }, native ? {\n      id: id\n    } : {\n      autoWidth: autoWidth,\n      displayEmpty: displayEmpty,\n      labelId: labelId,\n      MenuProps: MenuProps,\n      onClose: onClose,\n      onOpen: onOpen,\n      open: open,\n      renderValue: renderValue,\n      SelectDisplayProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        id: id\n      }, SelectDisplayProps)\n    }, inputProps, {\n      classes: inputProps ? Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_4__[\"mergeClasses\"])({\n        baseClasses: classes,\n        newClasses: inputProps.classes,\n        Component: Select\n      }) : classes\n    }, input ? input.props.inputProps : {}),\n    ref: ref\n  }, other));\n});\n true ? Select.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the width of the popover will automatically be set according to the items inside the\n   * menu, otherwise it will be at least the width of the select input.\n   */\n  autoWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `MenuItem` when `native` is false and `option` when `native` is true.\n   *\n   * ⚠️The `MenuItem` elements **must** be direct descendants when `native` is false.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The default element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, a value is displayed even if no items are selected.\n   *\n   * In order to display a meaningful value, a function should be passed to the `renderValue` prop which returns the value to be displayed when no items are selected.\n   * You can only use it when the `native` prop is `false` (default).\n   */\n  displayEmpty: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * The `id` of the wrapper element or the `select` element when `native`.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * An `Input` element; does not have to be a material-ui specific `Input`.\n   */\n  input: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   * When `native` is `true`, the attributes are applied on the `select` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * See [OutlinedInput#label](/api/outlined-input/#props)\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The ID of an element that acts as an additional label. The Select will\n   * be labelled by the additional label and the selected value.\n   */\n  labelId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * See [OutlinedInput#label](/api/outlined-input/#props)\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * Props applied to the [`Menu`](/api/menu/) element.\n   */\n  MenuProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, `value` must be an array and the menu will support multiple selections.\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will be using a native `select` element.\n   */\n  native: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (any).\n   * @param {object} [child] The react element that was selected when `native` is `false` (default).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be opened.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onOpen: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Control `select` open state.\n   * You can only use it when the `native` prop is `false` (default).\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Render the selected value.\n   * You can only use it when the `native` prop is `false` (default).\n   *\n   * @param {any} value The `value` provided to the component.\n   * @returns {ReactNode}\n   */\n  renderValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Props applied to the clickable div element.\n   */\n  SelectDisplayProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The input value. Providing an empty string will select no options.\n   * This prop is required when the `native` prop is `false` (default).\n   * Set to an empty string `''` if you don't want any of the available options to be selected.\n   *\n   * If the value is an object it must have reference equality with the option in order to be selected.\n   * If the value is not an object, the string representation must match with the string representation of the option in order to be selected.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\nSelect.muiName = 'Select';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiSelect'\n})(Select));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _Menu_Menu__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Menu/Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js\");\n/* harmony import */ var _InputBase_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../InputBase/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/useControlled */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction areEqualValues(a, b) {\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(b) === 'object' && b !== null) {\n    return a === b;\n  }\n\n  return String(a) === String(b);\n}\n\nfunction isEmpty(display) {\n  return display == null || typeof display === 'string' && !display.trim();\n}\n/**\n * @ignore - internal component.\n */\n\n\nvar SelectInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"forwardRef\"](function SelectInput(props, ref) {\n  var ariaLabel = props['aria-label'],\n      autoFocus = props.autoFocus,\n      autoWidth = props.autoWidth,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      defaultValue = props.defaultValue,\n      disabled = props.disabled,\n      displayEmpty = props.displayEmpty,\n      IconComponent = props.IconComponent,\n      inputRefProp = props.inputRef,\n      labelId = props.labelId,\n      _props$MenuProps = props.MenuProps,\n      MenuProps = _props$MenuProps === void 0 ? {} : _props$MenuProps,\n      multiple = props.multiple,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onClose = props.onClose,\n      onFocus = props.onFocus,\n      onOpen = props.onOpen,\n      openProp = props.open,\n      readOnly = props.readOnly,\n      renderValue = props.renderValue,\n      _props$SelectDisplayP = props.SelectDisplayProps,\n      SelectDisplayProps = _props$SelectDisplayP === void 0 ? {} : _props$SelectDisplayP,\n      tabIndexProp = props.tabIndex,\n      type = props.type,\n      valueProp = props.value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"aria-label\", \"autoFocus\", \"autoWidth\", \"children\", \"classes\", \"className\", \"defaultValue\", \"disabled\", \"displayEmpty\", \"IconComponent\", \"inputRef\", \"labelId\", \"MenuProps\", \"multiple\", \"name\", \"onBlur\", \"onChange\", \"onClose\", \"onFocus\", \"onOpen\", \"open\", \"readOnly\", \"renderValue\", \"SelectDisplayProps\", \"tabIndex\", \"type\", \"value\", \"variant\"]);\n\n  var _useControlled = Object(_utils_useControlled__WEBPACK_IMPORTED_MODULE_14__[\"default\"])({\n    controlled: valueProp,\n    default: defaultValue,\n    name: 'Select'\n  }),\n      _useControlled2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_useControlled, 2),\n      value = _useControlled2[0],\n      setValue = _useControlled2[1];\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_5__[\"useRef\"](null);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](null),\n      displayNode = _React$useState[0],\n      setDisplayNode = _React$useState[1];\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_5__[\"useRef\"](openProp != null),\n      isOpenControlled = _React$useRef.current;\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](),\n      menuMinWidthState = _React$useState2[0],\n      setMenuMinWidthState = _React$useState2[1];\n\n  var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](false),\n      openState = _React$useState3[0],\n      setOpenState = _React$useState3[1];\n\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_13__[\"default\"])(ref, inputRefProp);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useImperativeHandle\"](handleRef, function () {\n    return {\n      focus: function focus() {\n        displayNode.focus();\n      },\n      node: inputRef.current,\n      value: value\n    };\n  }, [displayNode, value]);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n    if (autoFocus && displayNode) {\n      displayNode.focus();\n    }\n  }, [autoFocus, displayNode]);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n    if (displayNode) {\n      var label = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(displayNode).getElementById(labelId);\n\n      if (label) {\n        var handler = function handler() {\n          if (getSelection().isCollapsed) {\n            displayNode.focus();\n          }\n        };\n\n        label.addEventListener('click', handler);\n        return function () {\n          label.removeEventListener('click', handler);\n        };\n      }\n    }\n\n    return undefined;\n  }, [labelId, displayNode]);\n\n  var update = function update(open, event) {\n    if (open) {\n      if (onOpen) {\n        onOpen(event);\n      }\n    } else if (onClose) {\n      onClose(event);\n    }\n\n    if (!isOpenControlled) {\n      setMenuMinWidthState(autoWidth ? null : displayNode.clientWidth);\n      setOpenState(open);\n    }\n  };\n\n  var handleMouseDown = function handleMouseDown(event) {\n    // Ignore everything but left-click\n    if (event.button !== 0) {\n      return;\n    } // Hijack the default focus behavior.\n\n\n    event.preventDefault();\n    displayNode.focus();\n    update(true, event);\n  };\n\n  var handleClose = function handleClose(event) {\n    update(false, event);\n  };\n\n  var childrenArray = react__WEBPACK_IMPORTED_MODULE_5__[\"Children\"].toArray(children); // Support autofill.\n\n  var handleChange = function handleChange(event) {\n    var index = childrenArray.map(function (child) {\n      return child.props.value;\n    }).indexOf(event.target.value);\n\n    if (index === -1) {\n      return;\n    }\n\n    var child = childrenArray[index];\n    setValue(child.props.value);\n\n    if (onChange) {\n      onChange(event, child);\n    }\n  };\n\n  var handleItemClick = function handleItemClick(child) {\n    return function (event) {\n      if (!multiple) {\n        update(false, event);\n      }\n\n      var newValue;\n\n      if (multiple) {\n        newValue = Array.isArray(value) ? value.slice() : [];\n        var itemIndex = value.indexOf(child.props.value);\n\n        if (itemIndex === -1) {\n          newValue.push(child.props.value);\n        } else {\n          newValue.splice(itemIndex, 1);\n        }\n      } else {\n        newValue = child.props.value;\n      }\n\n      if (child.props.onClick) {\n        child.props.onClick(event);\n      }\n\n      if (value === newValue) {\n        return;\n      }\n\n      setValue(newValue);\n\n      if (onChange) {\n        event.persist(); // Preact support, target is read only property on a native event.\n\n        Object.defineProperty(event, 'target', {\n          writable: true,\n          value: {\n            value: newValue,\n            name: name\n          }\n        });\n        onChange(event, child);\n      }\n    };\n  };\n\n  var handleKeyDown = function handleKeyDown(event) {\n    if (!readOnly) {\n      var validKeys = [' ', 'ArrowUp', 'ArrowDown', // The native select doesn't respond to enter on MacOS, but it's recommended by\n      // https://www.w3.org/TR/wai-aria-practices/examples/listbox/listbox-collapsible.html\n      'Enter'];\n\n      if (validKeys.indexOf(event.key) !== -1) {\n        event.preventDefault();\n        update(true, event);\n      }\n    }\n  };\n\n  var open = displayNode !== null && (isOpenControlled ? openProp : openState);\n\n  var handleBlur = function handleBlur(event) {\n    // if open event.stopImmediatePropagation\n    if (!open && onBlur) {\n      event.persist(); // Preact support, target is read only property on a native event.\n\n      Object.defineProperty(event, 'target', {\n        writable: true,\n        value: {\n          value: value,\n          name: name\n        }\n      });\n      onBlur(event);\n    }\n  };\n\n  delete other['aria-invalid'];\n  var display;\n  var displaySingle;\n  var displayMultiple = [];\n  var computeDisplay = false;\n  var foundMatch = false; // No need to display any value if the field is empty.\n\n  if (Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_12__[\"isFilled\"])({\n    value: value\n  }) || displayEmpty) {\n    if (renderValue) {\n      display = renderValue(value);\n    } else {\n      computeDisplay = true;\n    }\n  }\n\n  var items = childrenArray.map(function (child) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"isValidElement\"](child)) {\n      return null;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_6__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Select component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    var selected;\n\n    if (multiple) {\n      if (!Array.isArray(value)) {\n        throw new Error( true ? \"Material-UI: The `value` prop must be an array when using the `Select` component with `multiple`.\" : undefined);\n      }\n\n      selected = value.some(function (v) {\n        return areEqualValues(v, child.props.value);\n      });\n\n      if (selected && computeDisplay) {\n        displayMultiple.push(child.props.children);\n      }\n    } else {\n      selected = areEqualValues(value, child.props.value);\n\n      if (selected && computeDisplay) {\n        displaySingle = child.props.children;\n      }\n    }\n\n    if (selected) {\n      foundMatch = true;\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"cloneElement\"](child, {\n      'aria-selected': selected ? 'true' : undefined,\n      onClick: handleItemClick(child),\n      onKeyUp: function onKeyUp(event) {\n        if (event.key === ' ') {\n          // otherwise our MenuItems dispatches a click event\n          // it's not behavior of the native <option> and causes\n          // the select to close immediately since we open on space keydown\n          event.preventDefault();\n        }\n\n        if (child.props.onKeyUp) {\n          child.props.onKeyUp(event);\n        }\n      },\n      role: 'option',\n      selected: selected,\n      value: undefined,\n      // The value is most likely not a valid HTML attribute.\n      'data-value': child.props.value // Instead, we provide it as a data attribute.\n\n    });\n  });\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n      if (!foundMatch && !multiple && value !== '') {\n        var values = childrenArray.map(function (child) {\n          return child.props.value;\n        });\n        console.warn([\"Material-UI: You have provided an out-of-range value `\".concat(value, \"` for the select \").concat(name ? \"(name=\\\"\".concat(name, \"\\\") \") : '', \"component.\"), \"Consider providing a value that matches one of the available options or ''.\", \"The available values are \".concat(values.filter(function (x) {\n          return x != null;\n        }).map(function (x) {\n          return \"`\".concat(x, \"`\");\n        }).join(', ') || '\"\"', \".\")].join('\\n'));\n      }\n    }, [foundMatch, childrenArray, multiple, name, value]);\n  }\n\n  if (computeDisplay) {\n    display = multiple ? displayMultiple.join(', ') : displaySingle;\n  } // Avoid performing a layout computation in the render method.\n\n\n  var menuMinWidth = menuMinWidthState;\n\n  if (!autoWidth && isOpenControlled && displayNode) {\n    menuMinWidth = displayNode.clientWidth;\n  }\n\n  var tabIndex;\n\n  if (typeof tabIndexProp !== 'undefined') {\n    tabIndex = tabIndexProp;\n  } else {\n    tabIndex = disabled ? null : 0;\n  }\n\n  var buttonId = SelectDisplayProps.id || (name ? \"mui-component-select-\".concat(name) : undefined);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_5__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(classes.root, // TODO v5: merge root and select\n    classes.select, classes.selectMenu, classes[variant], className, disabled && classes.disabled),\n    ref: setDisplayNode,\n    tabIndex: tabIndex,\n    role: \"button\",\n    \"aria-disabled\": disabled ? 'true' : undefined,\n    \"aria-expanded\": open ? 'true' : undefined,\n    \"aria-haspopup\": \"listbox\",\n    \"aria-label\": ariaLabel,\n    \"aria-labelledby\": [labelId, buttonId].filter(Boolean).join(' ') || undefined,\n    onKeyDown: handleKeyDown,\n    onMouseDown: disabled || readOnly ? null : handleMouseDown,\n    onBlur: handleBlur,\n    onFocus: onFocus\n  }, SelectDisplayProps, {\n    // The id is required for proper a11y\n    id: buttonId\n  }), isEmpty(display) ?\n  /*#__PURE__*/\n  // eslint-disable-next-line react/no-danger\n  react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  }) : display), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"input\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    value: Array.isArray(value) ? value.join(',') : value,\n    name: name,\n    ref: inputRef,\n    \"aria-hidden\": true,\n    onChange: handleChange,\n    tabIndex: -1,\n    className: classes.nativeInput,\n    autoFocus: autoFocus\n  }, other)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](IconComponent, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(classes.icon, classes[\"icon\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(variant))], open && classes.iconOpen, disabled && classes.disabled)\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](_Menu_Menu__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    id: \"menu-\".concat(name || ''),\n    anchorEl: displayNode,\n    open: open,\n    onClose: handleClose\n  }, MenuProps, {\n    MenuListProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      'aria-labelledby': labelId,\n      role: 'listbox',\n      disableListWrap: true\n    }, MenuProps.MenuListProps),\n    PaperProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, MenuProps.PaperProps, {\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        minWidth: menuMinWidth\n      }, MenuProps.PaperProps != null ? MenuProps.PaperProps.style : null)\n    })\n  }), items));\n});\n true ? SelectInput.propTypes = {\n  /**\n   * @ignore\n   */\n  'aria-label': prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * @ignore\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * If `true`, the width of the popover will automatically be set according to the items inside the\n   * menu, otherwise it will be at least the width of the select input.\n   */\n  autoWidth: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<MenuItem>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object.isRequired,\n\n  /**\n   * The CSS class name of the select element.\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * The default element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * If `true`, the select will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * If `true`, the selected item is displayed even if its value is empty.\n   */\n  displayEmpty: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType.isRequired,\n\n  /**\n   * Imperative handle implementing `{ value: T, node: HTMLElement, focus(): void }`\n   * Equivalent to `ref`\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"refType\"],\n\n  /**\n   * The ID of an element that acts as an additional label. The Select will\n   * be labelled by the additional label and the selected value.\n   */\n  labelId: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * Props applied to the [`Menu`](/api/menu/) element.\n   */\n  MenuProps: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object,\n\n  /**\n   * If `true`, `value` must be an array and the menu will support multiple selections.\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * Name attribute of the `select` or hidden `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (any).\n   * @param {object} [child] The react element that was selected.\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be opened.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onOpen: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Control `select` open state.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * Render the selected value.\n   *\n   * @param {any} value The `value` provided to the component.\n   * @returns {ReactNode}\n   */\n  renderValue: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Props applied to the clickable div element.\n   */\n  SelectDisplayProps: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * The input value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['standard', 'outlined', 'filled'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (SelectInput);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Select */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Select__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js ***!
-  \***************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      userSelect: 'none',\n      width: '1em',\n      height: '1em',\n      display: 'inline-block',\n      fill: 'currentColor',\n      flexShrink: 0,\n      fontSize: theme.typography.pxToRem(24),\n      transition: theme.transitions.create('fill', {\n        duration: theme.transitions.duration.shorter\n      })\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the root element if `color=\"action\"`. */\n    colorAction: {\n      color: theme.palette.action.active\n    },\n\n    /* Styles applied to the root element if `color=\"error\"`. */\n    colorError: {\n      color: theme.palette.error.main\n    },\n\n    /* Styles applied to the root element if `color=\"disabled\"`. */\n    colorDisabled: {\n      color: theme.palette.action.disabled\n    },\n\n    /* Styles applied to the root element if `fontSize=\"inherit\"`. */\n    fontSizeInherit: {\n      fontSize: 'inherit'\n    },\n\n    /* Styles applied to the root element if `fontSize=\"small\"`. */\n    fontSizeSmall: {\n      fontSize: theme.typography.pxToRem(20)\n    },\n\n    /* Styles applied to the root element if `fontSize=\"large\"`. */\n    fontSizeLarge: {\n      fontSize: theme.typography.pxToRem(35)\n    }\n  };\n};\nvar SvgIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function SvgIcon(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'inherit' : _props$color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'svg' : _props$component,\n      _props$fontSize = props.fontSize,\n      fontSize = _props$fontSize === void 0 ? 'default' : _props$fontSize,\n      htmlColor = props.htmlColor,\n      titleAccess = props.titleAccess,\n      _props$viewBox = props.viewBox,\n      viewBox = _props$viewBox === void 0 ? '0 0 24 24' : _props$viewBox,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"fontSize\", \"htmlColor\", \"titleAccess\", \"viewBox\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'inherit' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color))], fontSize !== 'default' && classes[\"fontSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(fontSize))]),\n    focusable: \"false\",\n    viewBox: viewBox,\n    color: htmlColor,\n    \"aria-hidden\": titleAccess ? undefined : true,\n    role: titleAccess ? 'img' : undefined,\n    ref: ref\n  }, other), children, titleAccess ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"title\", null, titleAccess) : null);\n});\n true ? SvgIcon.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Node passed into the SVG element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   * You can use the `htmlColor` prop to apply a color attribute to the SVG element.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['action', 'disabled', 'error', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\n   */\n  fontSize: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'large', 'small']),\n\n  /**\n   * Applies a color attribute to the SVG element.\n   */\n  htmlColor: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The shape-rendering attribute. The behavior of the different options is described on the\n   * [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering).\n   * If you are having issues with blurry icons you should investigate this property.\n   */\n  shapeRendering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Provides a human-readable title for the element that contains it.\n   * https://www.w3.org/TR/SVG-access/#Equivalent\n   */\n  titleAccess: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Allows you to redefine what the coordinates without units mean inside an SVG element.\n   * For example, if the SVG element is 500 (width) by 200 (height),\n   * and you pass viewBox=\"0 0 50 20\",\n   * this means that the coordinates inside the SVG will go from the top left corner (0,0)\n   * to bottom right (50,20) and each unit will be worth 10px.\n   */\n  viewBox: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string\n} : undefined;\nSvgIcon.muiName = 'SvgIcon';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiSvgIcon'\n})(SvgIcon));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _SvgIcon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _SvgIcon__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js\");\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js\");\n/* harmony import */ var _InputLabel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../InputLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js\");\n/* harmony import */ var _FormHelperText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../FormHelperText */ \"./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js\");\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Select */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar variantComponent = {\n  standard: _Input__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n  filled: _FilledInput__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n  outlined: _OutlinedInput__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n};\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {}\n};\n/**\n * The `TextField` is a convenience wrapper for the most common cases (80%).\n * It cannot be all things to all people, otherwise the API would grow out of control.\n *\n * ## Advanced Configuration\n *\n * It's important to understand that the text field is a simple abstraction\n * on top of the following components:\n *\n * - [FormControl](/api/form-control/)\n * - [InputLabel](/api/input-label/)\n * - [FilledInput](/api/filled-input/)\n * - [OutlinedInput](/api/outlined-input/)\n * - [Input](/api/input/)\n * - [FormHelperText](/api/form-helper-text/)\n *\n * If you wish to alter the props applied to the `input` element, you can do so as follows:\n *\n * ```jsx\n * const inputProps = {\n *   step: 300,\n * };\n *\n * return <TextField id=\"time\" type=\"time\" inputProps={inputProps} />;\n * ```\n *\n * For advanced cases, please look at the source of TextField by clicking on the\n * \"Edit this page\" button above. Consider either:\n *\n * - using the upper case props for passing values directly to the components\n * - using the underlying components directly as shown in the demos\n */\n\nvar TextField = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function TextField(props, ref) {\n  var autoComplete = props.autoComplete,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      defaultValue = props.defaultValue,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$error = props.error,\n      error = _props$error === void 0 ? false : _props$error,\n      FormHelperTextProps = props.FormHelperTextProps,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      helperText = props.helperText,\n      hiddenLabel = props.hiddenLabel,\n      id = props.id,\n      InputLabelProps = props.InputLabelProps,\n      inputProps = props.inputProps,\n      InputProps = props.InputProps,\n      inputRef = props.inputRef,\n      label = props.label,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onFocus = props.onFocus,\n      placeholder = props.placeholder,\n      _props$required = props.required,\n      required = _props$required === void 0 ? false : _props$required,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      _props$select = props.select,\n      select = _props$select === void 0 ? false : _props$select,\n      SelectProps = props.SelectProps,\n      type = props.type,\n      value = props.value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoComplete\", \"autoFocus\", \"children\", \"classes\", \"className\", \"color\", \"defaultValue\", \"disabled\", \"error\", \"FormHelperTextProps\", \"fullWidth\", \"helperText\", \"hiddenLabel\", \"id\", \"InputLabelProps\", \"inputProps\", \"InputProps\", \"inputRef\", \"label\", \"multiline\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"placeholder\", \"required\", \"rows\", \"rowsMax\", \"select\", \"SelectProps\", \"type\", \"value\", \"variant\"]);\n\n  if (true) {\n    if (select && !children) {\n      console.error('Material-UI: `children` must be passed when using the `TextField` component with `select`.');\n    }\n  }\n\n  var InputMore = {};\n\n  if (variant === 'outlined') {\n    if (InputLabelProps && typeof InputLabelProps.shrink !== 'undefined') {\n      InputMore.notched = InputLabelProps.shrink;\n    }\n\n    if (label) {\n      var _InputLabelProps$requ;\n\n      var displayRequired = (_InputLabelProps$requ = InputLabelProps === null || InputLabelProps === void 0 ? void 0 : InputLabelProps.required) !== null && _InputLabelProps$requ !== void 0 ? _InputLabelProps$requ : required;\n      InputMore.label = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, label, displayRequired && \"\\xA0*\");\n    }\n  }\n\n  if (select) {\n    // unset defaults from textbox inputs\n    if (!SelectProps || !SelectProps.native) {\n      InputMore.id = undefined;\n    }\n\n    InputMore['aria-describedby'] = undefined;\n  }\n\n  var helperTextId = helperText && id ? \"\".concat(id, \"-helper-text\") : undefined;\n  var inputLabelId = label && id ? \"\".concat(id, \"-label\") : undefined;\n  var InputComponent = variantComponent[variant];\n  var InputElement = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-describedby\": helperTextId,\n    autoComplete: autoComplete,\n    autoFocus: autoFocus,\n    defaultValue: defaultValue,\n    fullWidth: fullWidth,\n    multiline: multiline,\n    name: name,\n    rows: rows,\n    rowsMax: rowsMax,\n    type: type,\n    value: value,\n    id: id,\n    inputRef: inputRef,\n    onBlur: onBlur,\n    onChange: onChange,\n    onFocus: onFocus,\n    placeholder: placeholder,\n    inputProps: inputProps\n  }, InputMore, InputProps));\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormControl__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n    disabled: disabled,\n    error: error,\n    fullWidth: fullWidth,\n    hiddenLabel: hiddenLabel,\n    ref: ref,\n    required: required,\n    color: color,\n    variant: variant\n  }, other), label && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputLabel__WEBPACK_IMPORTED_MODULE_9__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    htmlFor: id,\n    id: inputLabelId\n  }, InputLabelProps), label), select ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Select__WEBPACK_IMPORTED_MODULE_12__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-describedby\": helperTextId,\n    id: id,\n    labelId: inputLabelId,\n    value: value,\n    input: InputElement\n  }, SelectProps), children) : InputElement, helperText && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormHelperText__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    id: helperTextId\n  }, FormHelperTextProps), helperText));\n});\n true ? TextField.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default value of the `input` element.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Props applied to the [`FormHelperText`](/api/form-helper-text/) element.\n   */\n  FormHelperTextProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The helper text content.\n   */\n  helperText: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  hiddenLabel: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   * Use this prop to make `label` and `helperText` accessible for screen readers.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Props applied to the [`InputLabel`](/api/input-label/) element.\n   */\n  InputLabelProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Props applied to the Input element.\n   * It will be a [`FilledInput`](/api/filled-input/),\n   * [`OutlinedInput`](/api/outlined-input/) or [`Input`](/api/input/)\n   * component depending on the `variant` prop value.\n   */\n  InputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The label content.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `dense` or `normal`, will adjust vertical spacing of this and contained components.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none', 'normal']),\n\n  /**\n   * If `true`, a textarea element will be rendered instead of an input.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the label is displayed as required and the `input` element` will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Render a [`Select`](/api/select/) element while passing the Input element to `Select` as `input` parameter.\n   * If this option is set you must pass the options of the select as children.\n   */\n  select: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Props applied to the [`Select`](/api/select/) element.\n   */\n  SelectProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The size of the text field.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_13__[\"default\"])(styles, {\n  name: 'MuiTextField'\n})(TextField));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TextField__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextField */ \"./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _TextField__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js ***!
-  \*********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/debounce */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\nfunction getStyleValue(computedStyle, property) {\n  return parseInt(computedStyle[property], 10) || 0;\n}\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"];\nvar styles = {\n  /* Styles applied to the shadow textarea element. */\n  shadow: {\n    // Visibility needed to hide the extra text area on iPads\n    visibility: 'hidden',\n    // Remove from the content flow\n    position: 'absolute',\n    // Ignore the scrollbar width\n    overflow: 'hidden',\n    height: 0,\n    top: 0,\n    left: 0,\n    // Create a new layer, increase the isolation of the computed values\n    transform: 'translateZ(0)'\n  }\n};\nvar TextareaAutosize = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function TextareaAutosize(props, ref) {\n  var onChange = props.onChange,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      _props$rowsMin = props.rowsMin,\n      rowsMinProp = _props$rowsMin === void 0 ? 1 : _props$rowsMin,\n      style = props.style,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"onChange\", \"rows\", \"rowsMax\", \"rowsMin\", \"style\", \"value\"]);\n\n  var rowsMin = rows || rowsMinProp;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](value != null),\n      isControlled = _React$useRef.current;\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ref, inputRef);\n  var shadowRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var renders = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](0);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"]({}),\n      state = _React$useState[0],\n      setState = _React$useState[1];\n\n  var syncHeight = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    var input = inputRef.current;\n    var computedStyle = window.getComputedStyle(input);\n    var inputShallow = shadowRef.current;\n    inputShallow.style.width = computedStyle.width;\n    inputShallow.value = input.value || props.placeholder || 'x';\n\n    if (inputShallow.value.slice(-1) === '\\n') {\n      // Certain fonts which overflow the line height will cause the textarea\n      // to report a different scrollHeight depending on whether the last line\n      // is empty. Make it non-empty to avoid this issue.\n      inputShallow.value += ' ';\n    }\n\n    var boxSizing = computedStyle['box-sizing'];\n    var padding = getStyleValue(computedStyle, 'padding-bottom') + getStyleValue(computedStyle, 'padding-top');\n    var border = getStyleValue(computedStyle, 'border-bottom-width') + getStyleValue(computedStyle, 'border-top-width'); // The height of the inner content\n\n    var innerHeight = inputShallow.scrollHeight - padding; // Measure height of a textarea with a single row\n\n    inputShallow.value = 'x';\n    var singleRowHeight = inputShallow.scrollHeight - padding; // The height of the outer content\n\n    var outerHeight = innerHeight;\n\n    if (rowsMin) {\n      outerHeight = Math.max(Number(rowsMin) * singleRowHeight, outerHeight);\n    }\n\n    if (rowsMax) {\n      outerHeight = Math.min(Number(rowsMax) * singleRowHeight, outerHeight);\n    }\n\n    outerHeight = Math.max(outerHeight, singleRowHeight); // Take the box sizing into account for applying this value as a style.\n\n    var outerHeightStyle = outerHeight + (boxSizing === 'border-box' ? padding + border : 0);\n    var overflow = Math.abs(outerHeight - innerHeight) <= 1;\n    setState(function (prevState) {\n      // Need a large enough difference to update the height.\n      // This prevents infinite rendering loop.\n      if (renders.current < 20 && (outerHeightStyle > 0 && Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1 || prevState.overflow !== overflow)) {\n        renders.current += 1;\n        return {\n          overflow: overflow,\n          outerHeightStyle: outerHeightStyle\n        };\n      }\n\n      if (true) {\n        if (renders.current === 20) {\n          console.error(['Material-UI: Too many re-renders. The layout is unstable.', 'TextareaAutosize limits the number of renders to prevent an infinite loop.'].join('\\n'));\n        }\n      }\n\n      return prevState;\n    });\n  }, [rowsMax, rowsMin, props.placeholder]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    var handleResize = Object(_utils_debounce__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(function () {\n      renders.current = 0;\n      syncHeight();\n    });\n    window.addEventListener('resize', handleResize);\n    return function () {\n      handleResize.clear();\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [syncHeight]);\n  useEnhancedEffect(function () {\n    syncHeight();\n  });\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    renders.current = 0;\n  }, [value]);\n\n  var handleChange = function handleChange(event) {\n    renders.current = 0;\n\n    if (!isControlled) {\n      syncHeight();\n    }\n\n    if (onChange) {\n      onChange(event);\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"textarea\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    value: value,\n    onChange: handleChange,\n    ref: handleRef // Apply the rows prop to get a \"correct\" first SSR paint\n    ,\n    rows: rowsMin,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      height: state.outerHeightStyle,\n      // Need a large enough difference to allow scrolling.\n      // This prevents infinite rendering loop.\n      overflow: state.overflow ? 'hidden' : null\n    }, style)\n  }, other)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"textarea\", {\n    \"aria-hidden\": true,\n    className: props.className,\n    readOnly: true,\n    ref: shadowRef,\n    tabIndex: -1,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles.shadow, style)\n  }));\n});\n true ? TextareaAutosize.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Use `rowsMin` instead. The prop will be removed in v5.\n   *\n   * @deprecated\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Minimum number of rows to display.\n   */\n  rowsMin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (TextareaAutosize);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TextareaAutosize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextareaAutosize */ \"./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _TextareaAutosize__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      margin: 0\n    },\n\n    /* Styles applied to the root element if `variant=\"body2\"`. */\n    body2: theme.typography.body2,\n\n    /* Styles applied to the root element if `variant=\"body1\"`. */\n    body1: theme.typography.body1,\n\n    /* Styles applied to the root element if `variant=\"caption\"`. */\n    caption: theme.typography.caption,\n\n    /* Styles applied to the root element if `variant=\"button\"`. */\n    button: theme.typography.button,\n\n    /* Styles applied to the root element if `variant=\"h1\"`. */\n    h1: theme.typography.h1,\n\n    /* Styles applied to the root element if `variant=\"h2\"`. */\n    h2: theme.typography.h2,\n\n    /* Styles applied to the root element if `variant=\"h3\"`. */\n    h3: theme.typography.h3,\n\n    /* Styles applied to the root element if `variant=\"h4\"`. */\n    h4: theme.typography.h4,\n\n    /* Styles applied to the root element if `variant=\"h5\"`. */\n    h5: theme.typography.h5,\n\n    /* Styles applied to the root element if `variant=\"h6\"`. */\n    h6: theme.typography.h6,\n\n    /* Styles applied to the root element if `variant=\"subtitle1\"`. */\n    subtitle1: theme.typography.subtitle1,\n\n    /* Styles applied to the root element if `variant=\"subtitle2\"`. */\n    subtitle2: theme.typography.subtitle2,\n\n    /* Styles applied to the root element if `variant=\"overline\"`. */\n    overline: theme.typography.overline,\n\n    /* Styles applied to the root element if `variant=\"srOnly\"`. Only accessible to screen readers. */\n    srOnly: {\n      position: 'absolute',\n      height: 1,\n      width: 1,\n      overflow: 'hidden'\n    },\n\n    /* Styles applied to the root element if `align=\"left\"`. */\n    alignLeft: {\n      textAlign: 'left'\n    },\n\n    /* Styles applied to the root element if `align=\"center\"`. */\n    alignCenter: {\n      textAlign: 'center'\n    },\n\n    /* Styles applied to the root element if `align=\"right\"`. */\n    alignRight: {\n      textAlign: 'right'\n    },\n\n    /* Styles applied to the root element if `align=\"justify\"`. */\n    alignJustify: {\n      textAlign: 'justify'\n    },\n\n    /* Styles applied to the root element if `nowrap={true}`. */\n    noWrap: {\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap'\n    },\n\n    /* Styles applied to the root element if `gutterBottom={true}`. */\n    gutterBottom: {\n      marginBottom: '0.35em'\n    },\n\n    /* Styles applied to the root element if `paragraph={true}`. */\n    paragraph: {\n      marginBottom: 16\n    },\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the root element if `color=\"textPrimary\"`. */\n    colorTextPrimary: {\n      color: theme.palette.text.primary\n    },\n\n    /* Styles applied to the root element if `color=\"textSecondary\"`. */\n    colorTextSecondary: {\n      color: theme.palette.text.secondary\n    },\n\n    /* Styles applied to the root element if `color=\"error\"`. */\n    colorError: {\n      color: theme.palette.error.main\n    },\n\n    /* Styles applied to the root element if `display=\"inline\"`. */\n    displayInline: {\n      display: 'inline'\n    },\n\n    /* Styles applied to the root element if `display=\"block\"`. */\n    displayBlock: {\n      display: 'block'\n    }\n  };\n};\nvar defaultVariantMapping = {\n  h1: 'h1',\n  h2: 'h2',\n  h3: 'h3',\n  h4: 'h4',\n  h5: 'h5',\n  h6: 'h6',\n  subtitle1: 'h6',\n  subtitle2: 'h6',\n  body1: 'p',\n  body2: 'p'\n};\nvar Typography = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Typography(props, ref) {\n  var _props$align = props.align,\n      align = _props$align === void 0 ? 'inherit' : _props$align,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'initial' : _props$color,\n      component = props.component,\n      _props$display = props.display,\n      display = _props$display === void 0 ? 'initial' : _props$display,\n      _props$gutterBottom = props.gutterBottom,\n      gutterBottom = _props$gutterBottom === void 0 ? false : _props$gutterBottom,\n      _props$noWrap = props.noWrap,\n      noWrap = _props$noWrap === void 0 ? false : _props$noWrap,\n      _props$paragraph = props.paragraph,\n      paragraph = _props$paragraph === void 0 ? false : _props$paragraph,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'body1' : _props$variant,\n      _props$variantMapping = props.variantMapping,\n      variantMapping = _props$variantMapping === void 0 ? defaultVariantMapping : _props$variantMapping,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"align\", \"classes\", \"className\", \"color\", \"component\", \"display\", \"gutterBottom\", \"noWrap\", \"paragraph\", \"variant\", \"variantMapping\"]);\n\n  var Component = component || (paragraph ? 'p' : variantMapping[variant] || defaultVariantMapping[variant]) || 'span';\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, variant !== 'inherit' && classes[variant], color !== 'initial' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color))], noWrap && classes.noWrap, gutterBottom && classes.gutterBottom, paragraph && classes.paragraph, align !== 'inherit' && classes[\"align\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(align))], display !== 'initial' && classes[\"display\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(display))]),\n    ref: ref\n  }, other));\n});\n true ? Typography.propTypes = {\n  /**\n   * Set the text-align on the component.\n   */\n  align: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   * Overrides the behavior of the `variantMapping` prop.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Controls the display type\n   */\n  display: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'block', 'inline']),\n\n  /**\n   * If `true`, the text will have a bottom margin.\n   */\n  gutterBottom: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the text will not wrap, but instead will truncate with a text overflow ellipsis.\n   *\n   * Note that text overflow can only happen with block or inline-block level elements\n   * (the element needs to have a width in order to overflow).\n   */\n  noWrap: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the text will have a bottom margin.\n   */\n  paragraph: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Applies the theme typography styles.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption', 'button', 'overline', 'srOnly', 'inherit']),\n\n  /**\n   * The component maps the variant prop to a range of different HTML element types.\n   * For instance, subtitle1 to `<h6>`.\n   * If you wish to change that mapping, you can provide your own.\n   * Alternatively, you can use the `component` prop.\n   */\n  variantMapping: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiTypography'\n})(Typography));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Typography__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js":
-/*!*************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js ***!
-  \*************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* eslint-disable consistent-return, jsx-a11y/no-noninteractive-tabindex, camelcase */\n\n\n\n\n\n\n/**\n * Utility component that locks focus inside the component.\n */\n\nfunction Unstable_TrapFocus(props) {\n  var children = props.children,\n      _props$disableAutoFoc = props.disableAutoFocus,\n      disableAutoFocus = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$disableEnforce = props.disableEnforceFocus,\n      disableEnforceFocus = _props$disableEnforce === void 0 ? false : _props$disableEnforce,\n      _props$disableRestore = props.disableRestoreFocus,\n      disableRestoreFocus = _props$disableRestore === void 0 ? false : _props$disableRestore,\n      getDoc = props.getDoc,\n      isEnabled = props.isEnabled,\n      open = props.open;\n  var ignoreNextEnforceFocus = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  var sentinelStart = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null);\n  var sentinelEnd = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null);\n  var nodeToRestore = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  var rootRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null); // can be removed once we drop support for non ref forwarding class components\n\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    rootRef.current = react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(children.ref, handleOwnRef);\n  var prevOpenRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n    prevOpenRef.current = open;\n  }, [open]);\n\n  if (!prevOpenRef.current && open && typeof window !== 'undefined') {\n    // WARNING: Potentially unsafe in concurrent mode.\n    // The way the read on `nodeToRestore` is setup could make this actually safe.\n    // Say we render `open={false}` -> `open={true}` but never commit.\n    // We have now written a state that wasn't committed. But no committed effect\n    // will read this wrong value. We only read from `nodeToRestore` in effects\n    // that were committed on `open={true}`\n    // WARNING: Prevents the instance from being garbage collected. Should only\n    // hold a weak ref.\n    nodeToRestore.current = getDoc().activeElement;\n  }\n\n  react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n    if (!open) {\n      return;\n    }\n\n    var doc = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(rootRef.current); // We might render an empty child.\n\n    if (!disableAutoFocus && rootRef.current && !rootRef.current.contains(doc.activeElement)) {\n      if (!rootRef.current.hasAttribute('tabIndex')) {\n        if (true) {\n          console.error(['Material-UI: The modal content node does not accept focus.', 'For the benefit of assistive technologies, ' + 'the tabIndex of the node is being set to \"-1\".'].join('\\n'));\n        }\n\n        rootRef.current.setAttribute('tabIndex', -1);\n      }\n\n      rootRef.current.focus();\n    }\n\n    var contain = function contain() {\n      if (!doc.hasFocus() || disableEnforceFocus || !isEnabled() || ignoreNextEnforceFocus.current) {\n        ignoreNextEnforceFocus.current = false;\n        return;\n      }\n\n      if (rootRef.current && !rootRef.current.contains(doc.activeElement)) {\n        rootRef.current.focus();\n      }\n    };\n\n    var loopFocus = function loopFocus(event) {\n      // 9 = Tab\n      if (disableEnforceFocus || !isEnabled() || event.keyCode !== 9) {\n        return;\n      } // Make sure the next tab starts from the right place.\n\n\n      if (doc.activeElement === rootRef.current) {\n        // We need to ignore the next contain as\n        // it will try to move the focus back to the rootRef element.\n        ignoreNextEnforceFocus.current = true;\n\n        if (event.shiftKey) {\n          sentinelEnd.current.focus();\n        } else {\n          sentinelStart.current.focus();\n        }\n      }\n    };\n\n    doc.addEventListener('focus', contain, true);\n    doc.addEventListener('keydown', loopFocus, true); // With Edge, Safari and Firefox, no focus related events are fired when the focused area stops being a focused area\n    // e.g. https://bugzilla.mozilla.org/show_bug.cgi?id=559561.\n    //\n    // The whatwg spec defines how the browser should behave but does not explicitly mention any events:\n    // https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule.\n\n    var interval = setInterval(function () {\n      contain();\n    }, 50);\n    return function () {\n      clearInterval(interval);\n      doc.removeEventListener('focus', contain, true);\n      doc.removeEventListener('keydown', loopFocus, true); // restoreLastFocus()\n\n      if (!disableRestoreFocus) {\n        // In IE 11 it is possible for document.activeElement to be null resulting\n        // in nodeToRestore.current being null.\n        // Not all elements in IE 11 have a focus method.\n        // Once IE 11 support is dropped the focus() call can be unconditional.\n        if (nodeToRestore.current && nodeToRestore.current.focus) {\n          nodeToRestore.current.focus();\n        }\n\n        nodeToRestore.current = null;\n      }\n    };\n  }, [disableAutoFocus, disableEnforceFocus, disableRestoreFocus, isEnabled, open]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"div\", {\n    tabIndex: 0,\n    ref: sentinelStart,\n    \"data-test\": \"sentinelStart\"\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"](children, {\n    ref: handleRef\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"div\", {\n    tabIndex: 0,\n    ref: sentinelEnd,\n    \"data-test\": \"sentinelEnd\"\n  }));\n}\n\n true ? Unstable_TrapFocus.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * If `true`, the trap focus will not automatically shift focus to itself when it opens, and\n   * replace it to the last focused element when it closes.\n   * This also works correctly with any trap focus children that have the `disableAutoFocus` prop.\n   *\n   * Generally this should never be set to `true` as it makes the trap focus less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableAutoFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * If `true`, the trap focus will not prevent focus from leaving the trap focus while open.\n   *\n   * Generally this should never be set to `true` as it makes the trap focus less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableEnforceFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * If `true`, the trap focus will not restore focus to previously focused element once\n   * trap focus is hidden.\n   */\n  disableRestoreFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Return the document to consider.\n   * We use it to implement the restore focus between different browser documents.\n   */\n  getDoc: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,\n\n  /**\n   * Do we still want to enforce the focus?\n   * This prop helps nesting TrapFocus elements.\n   */\n  isEnabled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,\n\n  /**\n   * If `true`, focus will be locked.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  Unstable_TrapFocus['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"exactProp\"])(Unstable_TrapFocus.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Unstable_TrapFocus);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Unstable_TrapFocus */ \"./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar blue = {\n  50: '#e3f2fd',\n  100: '#bbdefb',\n  200: '#90caf9',\n  300: '#64b5f6',\n  400: '#42a5f5',\n  500: '#2196f3',\n  600: '#1e88e5',\n  700: '#1976d2',\n  800: '#1565c0',\n  900: '#0d47a1',\n  A100: '#82b1ff',\n  A200: '#448aff',\n  A400: '#2979ff',\n  A700: '#2962ff'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (blue);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/common.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/common.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar common = {\n  black: '#000',\n  white: '#fff'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (common);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/common.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/green.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/green.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar green = {\n  50: '#e8f5e9',\n  100: '#c8e6c9',\n  200: '#a5d6a7',\n  300: '#81c784',\n  400: '#66bb6a',\n  500: '#4caf50',\n  600: '#43a047',\n  700: '#388e3c',\n  800: '#2e7d32',\n  900: '#1b5e20',\n  A100: '#b9f6ca',\n  A200: '#69f0ae',\n  A400: '#00e676',\n  A700: '#00c853'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (green);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/green.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar grey = {\n  50: '#fafafa',\n  100: '#f5f5f5',\n  200: '#eeeeee',\n  300: '#e0e0e0',\n  400: '#bdbdbd',\n  500: '#9e9e9e',\n  600: '#757575',\n  700: '#616161',\n  800: '#424242',\n  900: '#212121',\n  A100: '#d5d5d5',\n  A200: '#aaaaaa',\n  A400: '#303030',\n  A700: '#616161'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (grey);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar indigo = {\n  50: '#e8eaf6',\n  100: '#c5cae9',\n  200: '#9fa8da',\n  300: '#7986cb',\n  400: '#5c6bc0',\n  500: '#3f51b5',\n  600: '#3949ab',\n  700: '#303f9f',\n  800: '#283593',\n  900: '#1a237e',\n  A100: '#8c9eff',\n  A200: '#536dfe',\n  A400: '#3d5afe',\n  A700: '#304ffe'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (indigo);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar orange = {\n  50: '#fff3e0',\n  100: '#ffe0b2',\n  200: '#ffcc80',\n  300: '#ffb74d',\n  400: '#ffa726',\n  500: '#ff9800',\n  600: '#fb8c00',\n  700: '#f57c00',\n  800: '#ef6c00',\n  900: '#e65100',\n  A100: '#ffd180',\n  A200: '#ffab40',\n  A400: '#ff9100',\n  A700: '#ff6d00'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (orange);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar pink = {\n  50: '#fce4ec',\n  100: '#f8bbd0',\n  200: '#f48fb1',\n  300: '#f06292',\n  400: '#ec407a',\n  500: '#e91e63',\n  600: '#d81b60',\n  700: '#c2185b',\n  800: '#ad1457',\n  900: '#880e4f',\n  A100: '#ff80ab',\n  A200: '#ff4081',\n  A400: '#f50057',\n  A700: '#c51162'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (pink);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/red.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/red.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar red = {\n  50: '#ffebee',\n  100: '#ffcdd2',\n  200: '#ef9a9a',\n  300: '#e57373',\n  400: '#ef5350',\n  500: '#f44336',\n  600: '#e53935',\n  700: '#d32f2f',\n  800: '#c62828',\n  900: '#b71c1c',\n  A100: '#ff8a80',\n  A200: '#ff5252',\n  A400: '#ff1744',\n  A700: '#d50000'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (red);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/red.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/useControlled */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../IconButton */ \"./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js\");\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  root: {\n    padding: 9\n  },\n  checked: {},\n  disabled: {},\n  input: {\n    cursor: 'inherit',\n    position: 'absolute',\n    opacity: 0,\n    width: '100%',\n    height: '100%',\n    top: 0,\n    left: 0,\n    margin: 0,\n    padding: 0,\n    zIndex: 1\n  }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SwitchBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function SwitchBase(props, ref) {\n  var autoFocus = props.autoFocus,\n      checkedProp = props.checked,\n      checkedIcon = props.checkedIcon,\n      classes = props.classes,\n      className = props.className,\n      defaultChecked = props.defaultChecked,\n      disabledProp = props.disabled,\n      icon = props.icon,\n      id = props.id,\n      inputProps = props.inputProps,\n      inputRef = props.inputRef,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onFocus = props.onFocus,\n      readOnly = props.readOnly,\n      required = props.required,\n      tabIndex = props.tabIndex,\n      type = props.type,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"autoFocus\", \"checked\", \"checkedIcon\", \"classes\", \"className\", \"defaultChecked\", \"disabled\", \"icon\", \"id\", \"inputProps\", \"inputRef\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"readOnly\", \"required\", \"tabIndex\", \"type\", \"value\"]);\n\n  var _useControlled = Object(_utils_useControlled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({\n    controlled: checkedProp,\n    default: Boolean(defaultChecked),\n    name: 'SwitchBase',\n    state: 'checked'\n  }),\n      _useControlled2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_useControlled, 2),\n      checked = _useControlled2[0],\n      setCheckedState = _useControlled2[1];\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_8__[\"default\"])();\n\n  var handleFocus = function handleFocus(event) {\n    if (onFocus) {\n      onFocus(event);\n    }\n\n    if (muiFormControl && muiFormControl.onFocus) {\n      muiFormControl.onFocus(event);\n    }\n  };\n\n  var handleBlur = function handleBlur(event) {\n    if (onBlur) {\n      onBlur(event);\n    }\n\n    if (muiFormControl && muiFormControl.onBlur) {\n      muiFormControl.onBlur(event);\n    }\n  };\n\n  var handleInputChange = function handleInputChange(event) {\n    var newChecked = event.target.checked;\n    setCheckedState(newChecked);\n\n    if (onChange) {\n      // TODO v5: remove the second argument.\n      onChange(event, newChecked);\n    }\n  };\n\n  var disabled = disabledProp;\n\n  if (muiFormControl) {\n    if (typeof disabled === 'undefined') {\n      disabled = muiFormControl.disabled;\n    }\n  }\n\n  var hasLabelFor = type === 'checkbox' || type === 'radio';\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_IconButton__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    component: \"span\",\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, checked && classes.checked, disabled && classes.disabled),\n    disabled: disabled,\n    tabIndex: null,\n    role: undefined,\n    onFocus: handleFocus,\n    onBlur: handleBlur,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"input\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    autoFocus: autoFocus,\n    checked: checkedProp,\n    defaultChecked: defaultChecked,\n    className: classes.input,\n    disabled: disabled,\n    id: hasLabelFor && id,\n    name: name,\n    onChange: handleInputChange,\n    readOnly: readOnly,\n    ref: inputRef,\n    required: required,\n    tabIndex: tabIndex,\n    type: type,\n    value: value\n  }, inputProps)), checked ? checkedIcon : icon);\n}); // NB: If changed, please update Checkbox, Switch and Radio\n// so that the API documentation is updated.\n\n true ? SwitchBase.propTypes = {\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the component is checked.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The icon to display when the component is checked.\n   */\n  checkedIcon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  defaultChecked: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the switch will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The icon to display when the component is unchecked.\n   */\n  icon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /*\n   * @ignore\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * The input component prop `type`.\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string.isRequired,\n\n  /**\n   * The value of the component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(styles, {\n  name: 'PrivateSwitchBase'\n})(SwitchBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js":
-/*!********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js ***!
-  \********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M7 10l5 5 5-5z\"\n}), 'ArrowDropDown'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckBox'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js":
-/*!***************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js ***!
-  \***************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n}), 'CheckBoxOutlineBlank'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js":
-/*!****************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js ***!
-  \****************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z\"\n}), 'IndeterminateCheckBox'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js ***!
-  \*************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"\n}), 'Person'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js ***!
-  \***********************************************************************************/
-/*! exports provided: hexToRgb, rgbToHex, hslToRgb, decomposeColor, recomposeColor, getContrastRatio, getLuminance, emphasize, fade, darken, lighten */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hexToRgb\", function() { return hexToRgb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"rgbToHex\", function() { return rgbToHex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hslToRgb\", function() { return hslToRgb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"decomposeColor\", function() { return decomposeColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"recomposeColor\", function() { return recomposeColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getContrastRatio\", function() { return getContrastRatio; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getLuminance\", function() { return getLuminance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"emphasize\", function() { return emphasize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fade\", function() { return fade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"darken\", function() { return darken; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lighten\", function() { return lighten; });\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n/* eslint-disable no-use-before-define */\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * @param {number} value The value to be clamped\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns {number} A number in the range [min, max]\n */\nfunction clamp(value) {\n  var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n  if (true) {\n    if (value < min || value > max) {\n      console.error(\"Material-UI: The value provided \".concat(value, \" is out of range [\").concat(min, \", \").concat(max, \"].\"));\n    }\n  }\n\n  return Math.min(Math.max(min, value), max);\n}\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n *\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\n * @returns {string} A CSS rgb color string\n */\n\n\nfunction hexToRgb(color) {\n  color = color.substr(1);\n  var re = new RegExp(\".{1,\".concat(color.length >= 6 ? 2 : 1, \"}\"), 'g');\n  var colors = color.match(re);\n\n  if (colors && colors[0].length === 1) {\n    colors = colors.map(function (n) {\n      return n + n;\n    });\n  }\n\n  return colors ? \"rgb\".concat(colors.length === 4 ? 'a' : '', \"(\").concat(colors.map(function (n, index) {\n    return index < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1000) / 1000;\n  }).join(', '), \")\") : '';\n}\n\nfunction intToHex(int) {\n  var hex = int.toString(16);\n  return hex.length === 1 ? \"0\".concat(hex) : hex;\n}\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n *\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\n */\n\n\nfunction rgbToHex(color) {\n  // Idempotent\n  if (color.indexOf('#') === 0) {\n    return color;\n  }\n\n  var _decomposeColor = decomposeColor(color),\n      values = _decomposeColor.values;\n\n  return \"#\".concat(values.map(function (n) {\n    return intToHex(n);\n  }).join(''));\n}\n/**\n * Converts a color from hsl format to rgb format.\n *\n * @param {string} color - HSL color values\n * @returns {string} rgb color values\n */\n\nfunction hslToRgb(color) {\n  color = decomposeColor(color);\n  var _color = color,\n      values = _color.values;\n  var h = values[0];\n  var s = values[1] / 100;\n  var l = values[2] / 100;\n  var a = s * Math.min(l, 1 - l);\n\n  var f = function f(n) {\n    var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 30) % 12;\n    return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  };\n\n  var type = 'rgb';\n  var rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n\n  if (color.type === 'hsla') {\n    type += 'a';\n    rgb.push(values[3]);\n  }\n\n  return recomposeColor({\n    type: type,\n    values: rgb\n  });\n}\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n */\n\nfunction decomposeColor(color) {\n  // Idempotent\n  if (color.type) {\n    return color;\n  }\n\n  if (color.charAt(0) === '#') {\n    return decomposeColor(hexToRgb(color));\n  }\n\n  var marker = color.indexOf('(');\n  var type = color.substring(0, marker);\n\n  if (['rgb', 'rgba', 'hsl', 'hsla'].indexOf(type) === -1) {\n    throw new Error( true ? \"Material-UI: Unsupported `\".concat(color, \"` color.\\nWe support the following formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla().\") : undefined);\n  }\n\n  var values = color.substring(marker + 1, color.length - 1).split(',');\n  values = values.map(function (value) {\n    return parseFloat(value);\n  });\n  return {\n    type: type,\n    values: values\n  };\n}\n/**\n * Converts a color object with type and values to a string.\n *\n * @param {object} color - Decomposed color\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns {string} A CSS color string\n */\n\nfunction recomposeColor(color) {\n  var type = color.type;\n  var values = color.values;\n\n  if (type.indexOf('rgb') !== -1) {\n    // Only convert the first 3 values to int (i.e. not alpha)\n    values = values.map(function (n, i) {\n      return i < 3 ? parseInt(n, 10) : n;\n    });\n  } else if (type.indexOf('hsl') !== -1) {\n    values[1] = \"\".concat(values[1], \"%\");\n    values[2] = \"\".concat(values[2], \"%\");\n  }\n\n  return \"\".concat(type, \"(\").concat(values.join(', '), \")\");\n}\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} A contrast ratio value in the range 0 - 21.\n */\n\nfunction getContrastRatio(foreground, background) {\n  var lumA = getLuminance(foreground);\n  var lumB = getLuminance(background);\n  return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} The relative brightness of the color in the range 0 - 1\n */\n\nfunction getLuminance(color) {\n  color = decomposeColor(color);\n  var rgb = color.type === 'hsl' ? decomposeColor(hslToRgb(color)).values : color.values;\n  rgb = rgb.map(function (val) {\n    val /= 255; // normalized\n\n    return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n  }); // Truncate at 3 digits\n\n  return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n}\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction emphasize(color) {\n  var coefficient = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n  return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n/**\n * Set the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} value - value to set the alpha channel to in the range 0 -1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction fade(color, value) {\n  color = decomposeColor(color);\n  value = clamp(value);\n\n  if (color.type === 'rgb' || color.type === 'hsl') {\n    color.type += 'a';\n  }\n\n  color.values[3] = value;\n  return recomposeColor(color);\n}\n/**\n * Darkens a color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction darken(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (color.type.indexOf('hsl') !== -1) {\n    color.values[2] *= 1 - coefficient;\n  } else if (color.type.indexOf('rgb') !== -1) {\n    for (var i = 0; i < 3; i += 1) {\n      color.values[i] *= 1 - coefficient;\n    }\n  }\n\n  return recomposeColor(color);\n}\n/**\n * Lightens a color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction lighten(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (color.type.indexOf('hsl') !== -1) {\n    color.values[2] += (100 - color.values[2]) * coefficient;\n  } else if (color.type.indexOf('rgb') !== -1) {\n    for (var i = 0; i < 3; i += 1) {\n      color.values[i] += (255 - color.values[i]) * coefficient;\n    }\n  }\n\n  return recomposeColor(color);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js ***!
-  \************************************************************************************/
-/*! exports provided: keys, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keys\", function() { return keys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createBreakpoints; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n\n\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nvar keys = ['xs', 'sm', 'md', 'lg', 'xl']; // Keep in mind that @media is inclusive by the CSS specification.\n\nfunction createBreakpoints(breakpoints) {\n  var _breakpoints$values = breakpoints.values,\n      values = _breakpoints$values === void 0 ? {\n    xs: 0,\n    sm: 600,\n    md: 960,\n    lg: 1280,\n    xl: 1920\n  } : _breakpoints$values,\n      _breakpoints$unit = breakpoints.unit,\n      unit = _breakpoints$unit === void 0 ? 'px' : _breakpoints$unit,\n      _breakpoints$step = breakpoints.step,\n      step = _breakpoints$step === void 0 ? 5 : _breakpoints$step,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(breakpoints, [\"values\", \"unit\", \"step\"]);\n\n  function up(key) {\n    var value = typeof values[key] === 'number' ? values[key] : key;\n    return \"@media (min-width:\".concat(value).concat(unit, \")\");\n  }\n\n  function down(key) {\n    var endIndex = keys.indexOf(key) + 1;\n    var upperbound = values[keys[endIndex]];\n\n    if (endIndex === keys.length) {\n      // xl down applies to all sizes\n      return up('xs');\n    }\n\n    var value = typeof upperbound === 'number' && endIndex > 0 ? upperbound : key;\n    return \"@media (max-width:\".concat(value - step / 100).concat(unit, \")\");\n  }\n\n  function between(start, end) {\n    var endIndex = keys.indexOf(end);\n\n    if (endIndex === keys.length - 1) {\n      return up(start);\n    }\n\n    return \"@media (min-width:\".concat(typeof values[start] === 'number' ? values[start] : start).concat(unit, \") and \") + \"(max-width:\".concat((endIndex !== -1 && typeof values[keys[endIndex + 1]] === 'number' ? values[keys[endIndex + 1]] : end) - step / 100).concat(unit, \")\");\n  }\n\n  function only(key) {\n    return between(key, key);\n  }\n\n  function width(key) {\n    return values[key];\n  }\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    keys: keys,\n    values: values,\n    up: up,\n    down: down,\n    between: between,\n    only: only,\n    width: width\n  }, other);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createMixins; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n\n\nfunction createMixins(breakpoints, spacing, mixins) {\n  var _toolbar;\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    gutters: function gutters() {\n      var styles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      // To deprecate in v4.1\n      //       warning(\n      //         false,\n      //         [\n      //           'Material-UI: Theme.mixins.gutters() is deprecated.',\n      //           'You can use the source of the mixin directly:',\n      //           `\n      // paddingLeft: theme.spacing(2),\n      // paddingRight: theme.spacing(2),\n      // [theme.breakpoints.up('sm')]: {\n      //   paddingLeft: theme.spacing(3),\n      //   paddingRight: theme.spacing(3),\n      // },\n      // `,\n      //         ].join('\\n'),\n      //       );\n      return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        paddingLeft: spacing(2),\n        paddingRight: spacing(2)\n      }, styles, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, breakpoints.up('sm'), Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        paddingLeft: spacing(3),\n        paddingRight: spacing(3)\n      }, styles[breakpoints.up('sm')])));\n    },\n    toolbar: (_toolbar = {\n      minHeight: 56\n    }, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_toolbar, \"\".concat(breakpoints.up('xs'), \" and (orientation: landscape)\"), {\n      minHeight: 48\n    }), Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_toolbar, breakpoints.up('sm'), {\n      minHeight: 64\n    }), _toolbar)\n  }, mixins);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createBreakpoints__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createBreakpoints */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js\");\n/* harmony import */ var _createMixins__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./createMixins */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js\");\n/* harmony import */ var _createPalette__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createPalette */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js\");\n/* harmony import */ var _createTypography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./createTypography */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js\");\n/* harmony import */ var _shadows__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shadows */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js\");\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./shape */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js\");\n/* harmony import */ var _createSpacing__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./createSpacing */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js\");\n/* harmony import */ var _transitions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _zIndex__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./zIndex */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction createMuiTheme() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var _options$breakpoints = options.breakpoints,\n      breakpointsInput = _options$breakpoints === void 0 ? {} : _options$breakpoints,\n      _options$mixins = options.mixins,\n      mixinsInput = _options$mixins === void 0 ? {} : _options$mixins,\n      _options$palette = options.palette,\n      paletteInput = _options$palette === void 0 ? {} : _options$palette,\n      spacingInput = options.spacing,\n      _options$typography = options.typography,\n      typographyInput = _options$typography === void 0 ? {} : _options$typography,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"breakpoints\", \"mixins\", \"palette\", \"spacing\", \"typography\"]);\n\n  var palette = Object(_createPalette__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(paletteInput);\n  var breakpoints = Object(_createBreakpoints__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(breakpointsInput);\n  var spacing = Object(_createSpacing__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(spacingInput);\n  var muiTheme = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])({\n    breakpoints: breakpoints,\n    direction: 'ltr',\n    mixins: Object(_createMixins__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(breakpoints, spacing, mixinsInput),\n    overrides: {},\n    // Inject custom styles\n    palette: palette,\n    props: {},\n    // Provide default props\n    shadows: _shadows__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n    typography: Object(_createTypography__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(palette, typographyInput),\n    spacing: spacing,\n    shape: _shape__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n    transitions: _transitions__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n    zIndex: _zIndex__WEBPACK_IMPORTED_MODULE_11__[\"default\"]\n  }, other);\n\n  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    args[_key - 1] = arguments[_key];\n  }\n\n  muiTheme = args.reduce(function (acc, argument) {\n    return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(acc, argument);\n  }, muiTheme);\n\n  if (true) {\n    var pseudoClasses = ['checked', 'disabled', 'error', 'focused', 'focusVisible', 'required', 'expanded', 'selected'];\n\n    var traverse = function traverse(node, parentKey) {\n      var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n      var key; // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n      for (key in node) {\n        var child = node[key];\n\n        if (depth === 1) {\n          if (key.indexOf('Mui') === 0 && child) {\n            traverse(child, key, depth + 1);\n          }\n        } else if (pseudoClasses.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n          if (true) {\n            console.error([\"Material-UI: The `\".concat(parentKey, \"` component increases \") + \"the CSS specificity of the `\".concat(key, \"` internal state.\"), 'You can not override it like this: ', JSON.stringify(node, null, 2), '', 'Instead, you need to use the $ruleName syntax:', JSON.stringify({\n              root: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, \"&$\".concat(key), child)\n            }, null, 2), '', 'https://material-ui.com/r/pseudo-classes-guide'].join('\\n'));\n          } // Remove the style to prevent global conflicts.\n\n\n          node[key] = {};\n        }\n      }\n    };\n\n    traverse(muiTheme.overrides);\n  }\n\n  return muiTheme;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createMuiTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js ***!
-  \********************************************************************************/
-/*! exports provided: light, dark, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"light\", function() { return light; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dark\", function() { return dark; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createPalette; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _colors_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../colors/common */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/common.js\");\n/* harmony import */ var _colors_grey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../colors/grey */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js\");\n/* harmony import */ var _colors_indigo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../colors/indigo */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js\");\n/* harmony import */ var _colors_pink__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../colors/pink */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js\");\n/* harmony import */ var _colors_red__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../colors/red */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/red.js\");\n/* harmony import */ var _colors_orange__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../colors/orange */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js\");\n/* harmony import */ var _colors_blue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../colors/blue */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js\");\n/* harmony import */ var _colors_green__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../colors/green */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/green.js\");\n/* harmony import */ var _colorManipulator__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar light = {\n  // The colors used to style the text.\n  text: {\n    // The most important text.\n    primary: 'rgba(0, 0, 0, 0.87)',\n    // Secondary text.\n    secondary: 'rgba(0, 0, 0, 0.54)',\n    // Disabled text have even lower visual prominence.\n    disabled: 'rgba(0, 0, 0, 0.38)',\n    // Text hints.\n    hint: 'rgba(0, 0, 0, 0.38)'\n  },\n  // The color used to divide different elements.\n  divider: 'rgba(0, 0, 0, 0.12)',\n  // The background colors used to style the surfaces.\n  // Consistency between these values is important.\n  background: {\n    paper: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    default: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"][50]\n  },\n  // The colors used to style the action elements.\n  action: {\n    // The color of an active action like an icon button.\n    active: 'rgba(0, 0, 0, 0.54)',\n    // The color of an hovered action.\n    hover: 'rgba(0, 0, 0, 0.04)',\n    hoverOpacity: 0.04,\n    // The color of a selected action.\n    selected: 'rgba(0, 0, 0, 0.08)',\n    selectedOpacity: 0.08,\n    // The color of a disabled action.\n    disabled: 'rgba(0, 0, 0, 0.26)',\n    // The background color of a disabled action.\n    disabledBackground: 'rgba(0, 0, 0, 0.12)',\n    disabledOpacity: 0.38,\n    focus: 'rgba(0, 0, 0, 0.12)',\n    focusOpacity: 0.12,\n    activatedOpacity: 0.12\n  }\n};\nvar dark = {\n  text: {\n    primary: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    secondary: 'rgba(255, 255, 255, 0.7)',\n    disabled: 'rgba(255, 255, 255, 0.5)',\n    hint: 'rgba(255, 255, 255, 0.5)',\n    icon: 'rgba(255, 255, 255, 0.5)'\n  },\n  divider: 'rgba(255, 255, 255, 0.12)',\n  background: {\n    paper: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"][800],\n    default: '#303030'\n  },\n  action: {\n    active: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    hover: 'rgba(255, 255, 255, 0.08)',\n    hoverOpacity: 0.08,\n    selected: 'rgba(255, 255, 255, 0.16)',\n    selectedOpacity: 0.16,\n    disabled: 'rgba(255, 255, 255, 0.3)',\n    disabledBackground: 'rgba(255, 255, 255, 0.12)',\n    disabledOpacity: 0.38,\n    focus: 'rgba(255, 255, 255, 0.12)',\n    focusOpacity: 0.12,\n    activatedOpacity: 0.24\n  }\n};\n\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n  var tonalOffsetLight = tonalOffset.light || tonalOffset;\n  var tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n\n  if (!intent[direction]) {\n    if (intent.hasOwnProperty(shade)) {\n      intent[direction] = intent[shade];\n    } else if (direction === 'light') {\n      intent.light = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"lighten\"])(intent.main, tonalOffsetLight);\n    } else if (direction === 'dark') {\n      intent.dark = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"darken\"])(intent.main, tonalOffsetDark);\n    }\n  }\n}\n\nfunction createPalette(palette) {\n  var _palette$primary = palette.primary,\n      primary = _palette$primary === void 0 ? {\n    light: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][300],\n    main: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][500],\n    dark: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][700]\n  } : _palette$primary,\n      _palette$secondary = palette.secondary,\n      secondary = _palette$secondary === void 0 ? {\n    light: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A200,\n    main: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A400,\n    dark: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A700\n  } : _palette$secondary,\n      _palette$error = palette.error,\n      error = _palette$error === void 0 ? {\n    light: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][300],\n    main: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][500],\n    dark: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][700]\n  } : _palette$error,\n      _palette$warning = palette.warning,\n      warning = _palette$warning === void 0 ? {\n    light: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][300],\n    main: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][500],\n    dark: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][700]\n  } : _palette$warning,\n      _palette$info = palette.info,\n      info = _palette$info === void 0 ? {\n    light: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][300],\n    main: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][500],\n    dark: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][700]\n  } : _palette$info,\n      _palette$success = palette.success,\n      success = _palette$success === void 0 ? {\n    light: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][300],\n    main: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][500],\n    dark: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][700]\n  } : _palette$success,\n      _palette$type = palette.type,\n      type = _palette$type === void 0 ? 'light' : _palette$type,\n      _palette$contrastThre = palette.contrastThreshold,\n      contrastThreshold = _palette$contrastThre === void 0 ? 3 : _palette$contrastThre,\n      _palette$tonalOffset = palette.tonalOffset,\n      tonalOffset = _palette$tonalOffset === void 0 ? 0.2 : _palette$tonalOffset,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(palette, [\"primary\", \"secondary\", \"error\", \"warning\", \"info\", \"success\", \"type\", \"contrastThreshold\", \"tonalOffset\"]); // Use the same logic as\n  // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n  // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n\n\n  function getContrastText(background) {\n    var contrastText = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"getContrastRatio\"])(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n\n    if (true) {\n      var contrast = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"getContrastRatio\"])(background, contrastText);\n\n      if (contrast < 3) {\n        console.error([\"Material-UI: The contrast ratio of \".concat(contrast, \":1 for \").concat(contrastText, \" on \").concat(background), 'falls below the WCAG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n'));\n      }\n    }\n\n    return contrastText;\n  }\n\n  var augmentColor = function augmentColor(color) {\n    var mainShade = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n    var lightShade = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n    var darkShade = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 700;\n    color = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, color);\n\n    if (!color.main && color[mainShade]) {\n      color.main = color[mainShade];\n    }\n\n    if (!color.main) {\n      throw new Error( true ? \"Material-UI: The color provided to augmentColor(color) is invalid.\\nThe color object needs to have a `main` property or a `\".concat(mainShade, \"` property.\") : undefined);\n    }\n\n    if (typeof color.main !== 'string') {\n      throw new Error( true ? \"Material-UI: The color provided to augmentColor(color) is invalid.\\n`color.main` should be a string, but `\".concat(JSON.stringify(color.main), \"` was provided instead.\\n\\nDid you intend to use one of the following approaches?\\n\\nimport {\\xA0green } from \\\"@material-ui/core/colors\\\";\\n\\nconst theme1 = createMuiTheme({ palette: {\\n  primary: green,\\n} });\\n\\nconst theme2 = createMuiTheme({ palette: {\\n  primary: { main: green[500] },\\n} });\") : undefined);\n    }\n\n    addLightOrDark(color, 'light', lightShade, tonalOffset);\n    addLightOrDark(color, 'dark', darkShade, tonalOffset);\n\n    if (!color.contrastText) {\n      color.contrastText = getContrastText(color.main);\n    }\n\n    return color;\n  };\n\n  var types = {\n    dark: dark,\n    light: light\n  };\n\n  if (true) {\n    if (!types[type]) {\n      console.error(\"Material-UI: The palette type `\".concat(type, \"` is not supported.\"));\n    }\n  }\n\n  var paletteOutput = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // A collection of common colors.\n    common: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n    // The palette type, can be light or dark.\n    type: type,\n    // The colors used to represent primary interface elements for a user.\n    primary: augmentColor(primary),\n    // The colors used to represent secondary interface elements for a user.\n    secondary: augmentColor(secondary, 'A400', 'A200', 'A700'),\n    // The colors used to represent interface elements that the user should be made aware of.\n    error: augmentColor(error),\n    // The colors used to represent potentially dangerous actions or important messages.\n    warning: augmentColor(warning),\n    // The colors used to present information to the user that is neutral and not necessarily important.\n    info: augmentColor(info),\n    // The colors used to indicate the successful completion of an action that user triggered.\n    success: augmentColor(success),\n    // The grey colors.\n    grey: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    // Used by `getContrastText()` to maximize the contrast between\n    // the background and the text.\n    contrastThreshold: contrastThreshold,\n    // Takes a background color and returns the text color that maximizes the contrast.\n    getContrastText: getContrastText,\n    // Generate a rich color object.\n    augmentColor: augmentColor,\n    // Used by the functions below to shift a color's luminance by approximately\n    // two indexes within its tonal palette.\n    // E.g., shift from Red 500 to Red 300 or Red 700.\n    tonalOffset: tonalOffset\n  }, types[type]), other);\n  return paletteOutput;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSpacing; });\n/* harmony import */ var _material_ui_system__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/system */ \"./jaas-client/node_modules/@material-ui/system/esm/index.js\");\n\nvar warnOnce;\nfunction createSpacing() {\n  var spacingInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 8;\n\n  // Already transformed.\n  if (spacingInput.mui) {\n    return spacingInput;\n  } // Material Design layouts are visually balanced. Most measurements align to an 8dp grid applied, which aligns both spacing and the overall layout.\n  // Smaller components, such as icons and type, can align to a 4dp grid.\n  // https://material.io/design/layout/understanding-layout.html#usage\n\n\n  var transform = Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"createUnarySpacing\"])({\n    spacing: spacingInput\n  });\n\n  var spacing = function spacing() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    if (true) {\n      if (!(args.length <= 4)) {\n        console.error(\"Material-UI: Too many arguments provided, expected between 0 and 4, got \".concat(args.length));\n      }\n    }\n\n    if (args.length === 0) {\n      return transform(1);\n    }\n\n    if (args.length === 1) {\n      return transform(args[0]);\n    }\n\n    return args.map(function (argument) {\n      if (typeof argument === 'string') {\n        return argument;\n      }\n\n      var output = transform(argument);\n      return typeof output === 'number' ? \"\".concat(output, \"px\") : output;\n    }).join(' ');\n  }; // Backward compatibility, to remove in v5.\n\n\n  Object.defineProperty(spacing, 'unit', {\n    get: function get() {\n      if (true) {\n        if (!warnOnce || \"development\" === 'test') {\n          console.error(['Material-UI: theme.spacing.unit usage has been deprecated.', 'It will be removed in v5.', 'You can replace `theme.spacing.unit * y` with `theme.spacing(y)`.', '', 'You can use the `https://github.com/mui-org/material-ui/tree/master/packages/material-ui-codemod/README.md#theme-spacing-api` migration helper to make the process smoother.'].join('\\n'));\n        }\n\n        warnOnce = true;\n      }\n\n      return spacingInput;\n    }\n  });\n  spacing.mui = true;\n  return spacing;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createTypography; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n\n\nfunction round(value) {\n  return Math.round(value * 1e5) / 1e5;\n}\n\nvar caseAllCaps = {\n  textTransform: 'uppercase'\n};\nvar defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n/**\n * @see @link{https://material.io/design/typography/the-type-system.html}\n * @see @link{https://material.io/design/typography/understanding-typography.html}\n */\n\nfunction createTypography(palette, typography) {\n  var _ref = typeof typography === 'function' ? typography(palette) : typography,\n      _ref$fontFamily = _ref.fontFamily,\n      fontFamily = _ref$fontFamily === void 0 ? defaultFontFamily : _ref$fontFamily,\n      _ref$fontSize = _ref.fontSize,\n      fontSize = _ref$fontSize === void 0 ? 14 : _ref$fontSize,\n      _ref$fontWeightLight = _ref.fontWeightLight,\n      fontWeightLight = _ref$fontWeightLight === void 0 ? 300 : _ref$fontWeightLight,\n      _ref$fontWeightRegula = _ref.fontWeightRegular,\n      fontWeightRegular = _ref$fontWeightRegula === void 0 ? 400 : _ref$fontWeightRegula,\n      _ref$fontWeightMedium = _ref.fontWeightMedium,\n      fontWeightMedium = _ref$fontWeightMedium === void 0 ? 500 : _ref$fontWeightMedium,\n      _ref$fontWeightBold = _ref.fontWeightBold,\n      fontWeightBold = _ref$fontWeightBold === void 0 ? 700 : _ref$fontWeightBold,\n      _ref$htmlFontSize = _ref.htmlFontSize,\n      htmlFontSize = _ref$htmlFontSize === void 0 ? 16 : _ref$htmlFontSize,\n      allVariants = _ref.allVariants,\n      pxToRem2 = _ref.pxToRem,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"fontWeightBold\", \"htmlFontSize\", \"allVariants\", \"pxToRem\"]);\n\n  if (true) {\n    if (typeof fontSize !== 'number') {\n      console.error('Material-UI: `fontSize` is required to be a number.');\n    }\n\n    if (typeof htmlFontSize !== 'number') {\n      console.error('Material-UI: `htmlFontSize` is required to be a number.');\n    }\n  }\n\n  var coef = fontSize / 14;\n\n  var pxToRem = pxToRem2 || function (size) {\n    return \"\".concat(size / htmlFontSize * coef, \"rem\");\n  };\n\n  var buildVariant = function buildVariant(fontWeight, size, lineHeight, letterSpacing, casing) {\n    return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      fontFamily: fontFamily,\n      fontWeight: fontWeight,\n      fontSize: pxToRem(size),\n      // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n      lineHeight: lineHeight\n    }, fontFamily === defaultFontFamily ? {\n      letterSpacing: \"\".concat(round(letterSpacing / size), \"em\")\n    } : {}, casing, allVariants);\n  };\n\n  var variants = {\n    h1: buildVariant(fontWeightLight, 96, 1.167, -1.5),\n    h2: buildVariant(fontWeightLight, 60, 1.2, -0.5),\n    h3: buildVariant(fontWeightRegular, 48, 1.167, 0),\n    h4: buildVariant(fontWeightRegular, 34, 1.235, 0.25),\n    h5: buildVariant(fontWeightRegular, 24, 1.334, 0),\n    h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n    subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n    subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n    body1: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n    body2: buildVariant(fontWeightRegular, 14, 1.43, 0.15),\n    button: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n    caption: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n    overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps)\n  };\n  return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    htmlFontSize: htmlFontSize,\n    pxToRem: pxToRem,\n    round: round,\n    // TODO v5: remove\n    fontFamily: fontFamily,\n    fontSize: fontSize,\n    fontWeightLight: fontWeightLight,\n    fontWeightRegular: fontWeightRegular,\n    fontWeightMedium: fontWeightMedium,\n    fontWeightBold: fontWeightBold\n  }, variants), other, {\n    clone: false // No need to clone deep\n\n  });\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createMuiTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createMuiTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js\");\n\nvar defaultTheme = Object(_createMuiTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\n/* harmony default export */ __webpack_exports__[\"default\"] = (defaultTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar shadowKeyUmbraOpacity = 0.2;\nvar shadowKeyPenumbraOpacity = 0.14;\nvar shadowAmbientShadowOpacity = 0.12;\n\nfunction createShadow() {\n  return [\"\".concat(arguments.length <= 0 ? undefined : arguments[0], \"px \").concat(arguments.length <= 1 ? undefined : arguments[1], \"px \").concat(arguments.length <= 2 ? undefined : arguments[2], \"px \").concat(arguments.length <= 3 ? undefined : arguments[3], \"px rgba(0,0,0,\").concat(shadowKeyUmbraOpacity, \")\"), \"\".concat(arguments.length <= 4 ? undefined : arguments[4], \"px \").concat(arguments.length <= 5 ? undefined : arguments[5], \"px \").concat(arguments.length <= 6 ? undefined : arguments[6], \"px \").concat(arguments.length <= 7 ? undefined : arguments[7], \"px rgba(0,0,0,\").concat(shadowKeyPenumbraOpacity, \")\"), \"\".concat(arguments.length <= 8 ? undefined : arguments[8], \"px \").concat(arguments.length <= 9 ? undefined : arguments[9], \"px \").concat(arguments.length <= 10 ? undefined : arguments[10], \"px \").concat(arguments.length <= 11 ? undefined : arguments[11], \"px rgba(0,0,0,\").concat(shadowAmbientShadowOpacity, \")\")].join(',');\n} // Values from https://github.com/material-components/material-components-web/blob/be8747f94574669cb5e7add1a7c54fa41a89cec7/packages/mdc-elevation/_variables.scss\n\n\nvar shadows = ['none', createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), createShadow(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0), createShadow(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\n/* harmony default export */ __webpack_exports__[\"default\"] = (shadows);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar shape = {\n  borderRadius: 4\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (shape);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\n\nvar styled = function styled(Component) {\n  var componentCreator = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_1__[\"styled\"])(Component);\n  return function (style, options) {\n    return componentCreator(style, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      defaultTheme: _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n    }, options));\n  };\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (styled);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js ***!
-  \******************************************************************************/
-/*! exports provided: easing, duration, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"easing\", function() { return easing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"duration\", function() { return duration; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nvar easing = {\n  // This is the most common easing curve.\n  easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n  // Objects enter the screen at full velocity from off-screen and\n  // slowly decelerate to a resting point.\n  easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n  // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n  easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n  // The sharp curve is used by objects that may return to the screen at any time.\n  sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n}; // Follow https://material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\n\nvar duration = {\n  shortest: 150,\n  shorter: 200,\n  short: 250,\n  // most basic recommended timing\n  standard: 300,\n  // this is to be used in complex animations\n  complex: 375,\n  // recommended when something is entering screen\n  enteringScreen: 225,\n  // recommended when something is leaving screen\n  leavingScreen: 195\n};\n\nfunction formatMs(milliseconds) {\n  return \"\".concat(Math.round(milliseconds), \"ms\");\n}\n/**\n * @param {string|Array} props\n * @param {object} param\n * @param {string} param.prop\n * @param {number} param.duration\n * @param {string} param.easing\n * @param {number} param.delay\n */\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  easing: easing,\n  duration: duration,\n  create: function create() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['all'];\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var _options$duration = options.duration,\n        durationOption = _options$duration === void 0 ? duration.standard : _options$duration,\n        _options$easing = options.easing,\n        easingOption = _options$easing === void 0 ? easing.easeInOut : _options$easing,\n        _options$delay = options.delay,\n        delay = _options$delay === void 0 ? 0 : _options$delay,\n        other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(options, [\"duration\", \"easing\", \"delay\"]);\n\n    if (true) {\n      var isString = function isString(value) {\n        return typeof value === 'string';\n      };\n\n      var isNumber = function isNumber(value) {\n        return !isNaN(parseFloat(value));\n      };\n\n      if (!isString(props) && !Array.isArray(props)) {\n        console.error('Material-UI: Argument \"props\" must be a string or Array.');\n      }\n\n      if (!isNumber(durationOption) && !isString(durationOption)) {\n        console.error(\"Material-UI: Argument \\\"duration\\\" must be a number or a string but found \".concat(durationOption, \".\"));\n      }\n\n      if (!isString(easingOption)) {\n        console.error('Material-UI: Argument \"easing\" must be a string.');\n      }\n\n      if (!isNumber(delay) && !isString(delay)) {\n        console.error('Material-UI: Argument \"delay\" must be a number or a string.');\n      }\n\n      if (Object.keys(other).length !== 0) {\n        console.error(\"Material-UI: Unrecognized argument(s) [\".concat(Object.keys(other).join(','), \"].\"));\n      }\n    }\n\n    return (Array.isArray(props) ? props : [props]).map(function (animatedProp) {\n      return \"\".concat(animatedProp, \" \").concat(typeof durationOption === 'string' ? durationOption : formatMs(durationOption), \" \").concat(easingOption, \" \").concat(typeof delay === 'string' ? delay : formatMs(delay));\n    }).join(',');\n  },\n  getAutoHeightDuration: function getAutoHeightDuration(height) {\n    if (!height) {\n      return 0;\n    }\n\n    var constant = height / 36; // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n\n    return Math.round((4 + 15 * Math.pow(constant, 0.25) + constant / 5) * 10);\n  }\n});\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useTheme; });\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\nfunction useTheme() {\n  var theme = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_0__[\"useTheme\"])() || _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_1___default.a.useDebugValue(theme);\n  }\n\n  return theme;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\n\nfunction withStyles(stylesOrCreator, options) {\n  return Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_1__[\"withStyles\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    defaultTheme: _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n  }, options));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (withStyles);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nvar zIndex = {\n  mobileStepper: 1000,\n  speedDial: 1050,\n  appBar: 1100,\n  drawer: 1200,\n  modal: 1300,\n  snackbar: 1400,\n  tooltip: 1500\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (zIndex);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js ***!
-  \*****************************************************************************/
-/*! exports provided: reflow, getTransitionProps */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reflow\", function() { return reflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTransitionProps\", function() { return getTransitionProps; });\nvar reflow = function reflow(node) {\n  return node.scrollTop;\n};\nfunction getTransitionProps(props, options) {\n  var timeout = props.timeout,\n      _props$style = props.style,\n      style = _props$style === void 0 ? {} : _props$style;\n  return {\n    duration: style.transitionDuration || typeof timeout === 'number' ? timeout : timeout[options.mode] || 0,\n    delay: style.transitionDelay\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return capitalize; });\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.\n//\n// A strict capitalization should uppercase the first letter of each word a the sentence.\n// We only handle the first word.\nfunction capitalize(string) {\n  if (typeof string !== 'string') {\n    throw new Error( true ? \"Material-UI: capitalize(string) expects a string argument.\" : undefined);\n  }\n\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createChainedFunction; });\n/**\n * Safe chained function\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n *\n * @param {function} functions to chain\n * @returns {function|null}\n */\nfunction createChainedFunction() {\n  for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n    funcs[_key] = arguments[_key];\n  }\n\n  return funcs.reduce(function (acc, func) {\n    if (func == null) {\n      return acc;\n    }\n\n    if (true) {\n      if (typeof func !== 'function') {\n        console.error('Material-UI: Invalid Argument Type, must only provide functions, undefined, or null.');\n      }\n    }\n\n    return function chainedFunction() {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      acc.apply(this, args);\n      func.apply(this, args);\n    };\n  }, function () {});\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSvgIcon; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js\");\n\n\n\n/**\n * Private module reserved for @material-ui/x packages.\n */\n\nfunction createSvgIcon(path, displayName) {\n  var Component = function Component(props, ref) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_SvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      ref: ref\n    }, props), path);\n  };\n\n  if (true) {\n    // Need to set `displayName` on the inner component for React.memo.\n    // React prior to 16.14 ignores `displayName` on the wrapper.\n    Component.displayName = \"\".concat(displayName, \"Icon\");\n  }\n\n  Component.muiName = _SvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"].muiName;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.memo( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.forwardRef(Component));\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return debounce; });\n// Corresponds to 10 frames at 60 Hz.\n// A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 166;\n  var timeout;\n\n  function debounced() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    // eslint-disable-next-line consistent-this\n    var that = this;\n\n    var later = function later() {\n      func.apply(that, args);\n    };\n\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n  }\n\n  debounced.clear = function () {\n    clearTimeout(timeout);\n  };\n\n  return debounced;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getScrollbarSize; });\n// A change of the browser zoom change the scrollbar size.\n// Credit https://github.com/twbs/bootstrap/blob/3ffe3a5d82f6f561b82ff78d82b32a7d14aed558/js/src/modal.js#L512-L519\nfunction getScrollbarSize() {\n  var scrollDiv = document.createElement('div');\n  scrollDiv.style.width = '99px';\n  scrollDiv.style.height = '99px';\n  scrollDiv.style.position = 'absolute';\n  scrollDiv.style.top = '-9999px';\n  scrollDiv.style.overflow = 'scroll';\n  document.body.appendChild(scrollDiv);\n  var scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n  document.body.removeChild(scrollDiv);\n  return scrollbarSize;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isMuiElement; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nfunction isMuiElement(element, muiNames) {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](element) && muiNames.indexOf(element.type.muiName) !== -1;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ownerDocument; });\nfunction ownerDocument(node) {\n  return node && node.ownerDocument || document;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ownerWindow; });\n/* harmony import */ var _ownerDocument__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n\nfunction ownerWindow(node) {\n  var doc = Object(_ownerDocument__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(node);\n  return doc.defaultView || window;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return requirePropFactory; });\nfunction requirePropFactory(componentNameInError) {\n  if (false) {}\n\n  var requireProp = function requireProp(requiredProp) {\n    return function (props, propName, componentName, location, propFullName) {\n      var propFullNameSafe = propFullName || propName;\n\n      if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n        return new Error(\"The prop `\".concat(propFullNameSafe, \"` of \") + \"`\".concat(componentNameInError, \"` must be used on `\").concat(requiredProp, \"`.\"));\n      }\n\n      return null;\n    };\n  };\n\n  return requireProp;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return setRef; });\n// TODO v5: consider to make it private\nfunction setRef(ref, value) {\n  if (typeof ref === 'function') {\n    ref(value);\n  } else if (ref) {\n    ref.current = value;\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useControlled; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */\n\nfunction useControlled(_ref) {\n  var controlled = _ref.controlled,\n      defaultProp = _ref.default,\n      name = _ref.name,\n      _ref$state = _ref.state,\n      state = _ref$state === void 0 ? 'value' : _ref$state;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](controlled !== undefined),\n      isControlled = _React$useRef.current;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](defaultProp),\n      valueState = _React$useState[0],\n      setValue = _React$useState[1];\n\n  var value = isControlled ? controlled : valueState;\n\n  if (true) {\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n      if (isControlled !== (controlled !== undefined)) {\n        console.error([\"Material-UI: A component is changing the \".concat(isControlled ? '' : 'un', \"controlled \").concat(state, \" state of \").concat(name, \" to be \").concat(isControlled ? 'un' : '', \"controlled.\"), 'Elements should not switch from uncontrolled to controlled (or vice versa).', \"Decide between using a controlled or uncontrolled \".concat(name, \" \") + 'element for the lifetime of the component.', \"The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.\", 'More info: https://fb.me/react-controlled-components'].join('\\n'));\n      }\n    }, [controlled]);\n\n    var _React$useRef2 = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](defaultProp),\n        defaultValue = _React$useRef2.current;\n\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n      if (!isControlled && defaultValue !== defaultProp) {\n        console.error([\"Material-UI: A component is changing the default \".concat(state, \" state of an uncontrolled \").concat(name, \" after being initialized. \") + \"To suppress this warning opt to use a controlled \".concat(name, \".\")].join('\\n'));\n      }\n    }, [JSON.stringify(defaultProp)]);\n  }\n\n  var setValueIfUncontrolled = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (newValue) {\n    if (!isControlled) {\n      setValue(newValue);\n    }\n  }, []);\n  return [value, setValueIfUncontrolled];\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useEventCallback; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"];\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n *\n * @param {function} fn\n */\n\nfunction useEventCallback(fn) {\n  var ref = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](fn);\n  useEnhancedEffect(function () {\n    ref.current = fn;\n  });\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function () {\n    return (0, ref.current).apply(void 0, arguments);\n  }, []);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useForkRef; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _setRef__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n\n\nfunction useForkRef(refA, refB) {\n  /**\n   * This will create a new function if the ref props change and are defined.\n   * This means react will call the old forkRef with `null` and the new forkRef\n   * with the ref. Cleanup naturally emerges from this behavior\n   */\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useMemo\"](function () {\n    if (refA == null && refB == null) {\n      return null;\n    }\n\n    return function (refValue) {\n      Object(_setRef__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(refA, refValue);\n      Object(_setRef__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(refB, refValue);\n    };\n  }, [refA, refB]);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js ***!
-  \***********************************************************************************/
-/*! exports provided: teardown, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"teardown\", function() { return teardown; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useIsFocusVisible; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n// based on https://github.com/WICG/focus-visible/blob/v4.1.5/src/focus-visible.js\n\n\nvar hadKeyboardEvent = true;\nvar hadFocusVisibleRecently = false;\nvar hadFocusVisibleRecentlyTimeout = null;\nvar inputTypesWhitelist = {\n  text: true,\n  search: true,\n  url: true,\n  tel: true,\n  email: true,\n  password: true,\n  number: true,\n  date: true,\n  month: true,\n  week: true,\n  time: true,\n  datetime: true,\n  'datetime-local': true\n};\n/**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} node\n * @return {boolean}\n */\n\nfunction focusTriggersKeyboardModality(node) {\n  var type = node.type,\n      tagName = node.tagName;\n\n  if (tagName === 'INPUT' && inputTypesWhitelist[type] && !node.readOnly) {\n    return true;\n  }\n\n  if (tagName === 'TEXTAREA' && !node.readOnly) {\n    return true;\n  }\n\n  if (node.isContentEditable) {\n    return true;\n  }\n\n  return false;\n}\n/**\n * Keep track of our keyboard modality state with `hadKeyboardEvent`.\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * @param {KeyboardEvent} event\n */\n\n\nfunction handleKeyDown(event) {\n  if (event.metaKey || event.altKey || event.ctrlKey) {\n    return;\n  }\n\n  hadKeyboardEvent = true;\n}\n/**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n */\n\n\nfunction handlePointerDown() {\n  hadKeyboardEvent = false;\n}\n\nfunction handleVisibilityChange() {\n  if (this.visibilityState === 'hidden') {\n    // If the tab becomes active again, the browser will handle calling focus\n    // on the element (Safari actually calls it twice).\n    // If this tab change caused a blur on an element with focus-visible,\n    // re-apply the class when the user switches back to the tab.\n    if (hadFocusVisibleRecently) {\n      hadKeyboardEvent = true;\n    }\n  }\n}\n\nfunction prepare(doc) {\n  doc.addEventListener('keydown', handleKeyDown, true);\n  doc.addEventListener('mousedown', handlePointerDown, true);\n  doc.addEventListener('pointerdown', handlePointerDown, true);\n  doc.addEventListener('touchstart', handlePointerDown, true);\n  doc.addEventListener('visibilitychange', handleVisibilityChange, true);\n}\n\nfunction teardown(doc) {\n  doc.removeEventListener('keydown', handleKeyDown, true);\n  doc.removeEventListener('mousedown', handlePointerDown, true);\n  doc.removeEventListener('pointerdown', handlePointerDown, true);\n  doc.removeEventListener('touchstart', handlePointerDown, true);\n  doc.removeEventListener('visibilitychange', handleVisibilityChange, true);\n}\n\nfunction isFocusVisible(event) {\n  var target = event.target;\n\n  try {\n    return target.matches(':focus-visible');\n  } catch (error) {} // browsers not implementing :focus-visible will throw a SyntaxError\n  // we use our own heuristic for those browsers\n  // rethrow might be better if it's not the expected error but do we really\n  // want to crash if focus-visible malfunctioned?\n  // no need for validFocusTarget check. the user does that by attaching it to\n  // focusable events only\n\n\n  return hadKeyboardEvent || focusTriggersKeyboardModality(target);\n}\n/**\n * Should be called if a blur event is fired on a focus-visible element\n */\n\n\nfunction handleBlurVisible() {\n  // To detect a tab/window switch, we look for a blur event followed\n  // rapidly by a visibility change.\n  // If we don't see a visibility change within 100ms, it's probably a\n  // regular focus change.\n  hadFocusVisibleRecently = true;\n  window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n  hadFocusVisibleRecentlyTimeout = window.setTimeout(function () {\n    hadFocusVisibleRecently = false;\n  }, 100);\n}\n\nfunction useIsFocusVisible() {\n  var ref = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (instance) {\n    var node = react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](instance);\n\n    if (node != null) {\n      prepare(node.ownerDocument);\n    }\n  }, []);\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useDebugValue\"](isFocusVisible);\n  }\n\n  return {\n    isFocusVisible: isFocusVisible,\n    onBlurVisible: handleBlurVisible,\n    ref: ref\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/icons/LockOutlined.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/icons/LockOutlined.js ***!
-  \*********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(__webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\"));\n\nvar _createSvgIcon = _interopRequireDefault(__webpack_require__(/*! ./utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js\"));\n\nvar _default = (0, _createSvgIcon.default)(_react.default.createElement(\"path\", {\n  d: \"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n}), 'LockOutlined');\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/icons/LockOutlined.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = createSvgIcon;\n\nvar _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/extends.js\"));\n\nvar _react = _interopRequireDefault(__webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\"));\n\nvar _SvgIcon = _interopRequireDefault(__webpack_require__(/*! @material-ui/core/SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js\"));\n\nfunction createSvgIcon(path, displayName) {\n  var Component = _react.default.memo(_react.default.forwardRef(function (props, ref) {\n    return _react.default.createElement(_SvgIcon.default, (0, _extends2.default)({\n      ref: ref\n    }, props), path);\n  }));\n\n  if (true) {\n    Component.displayName = \"\".concat(displayName, \"Icon\");\n  }\n\n  Component.muiName = _SvgIcon.default.muiName;\n  return Component;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js":
-/*!*************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js ***!
-  \*************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ServerStyleSheets; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n\n\n\n\n\n\n\n\nvar ServerStyleSheets = /*#__PURE__*/function () {\n  function ServerStyleSheets() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    Object(_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, ServerStyleSheets);\n\n    this.options = options;\n  }\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(ServerStyleSheets, [{\n    key: \"collect\",\n    value: function collect(children) {\n      // This is needed in order to deduplicate the injection of CSS in the page.\n      var sheetsManager = new Map(); // This is needed in order to inject the critical CSS.\n\n      this.sheetsRegistry = new jss__WEBPACK_IMPORTED_MODULE_4__[\"SheetsRegistry\"](); // A new class name generator\n\n      var generateClassName = Object(_createGenerateClassName__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_StylesProvider__WEBPACK_IMPORTED_MODULE_5__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        sheetsManager: sheetsManager,\n        serverGenerateClassName: generateClassName,\n        sheetsRegistry: this.sheetsRegistry\n      }, this.options), children);\n    }\n  }, {\n    key: \"toString\",\n    value: function toString() {\n      return this.sheetsRegistry ? this.sheetsRegistry.toString() : '';\n    }\n  }, {\n    key: \"getStyleElement\",\n    value: function getStyleElement(props) {\n      return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement('style', Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        id: 'jss-server-side',\n        key: 'jss-server-side',\n        dangerouslySetInnerHTML: {\n          __html: this.toString()\n        }\n      }, props));\n    }\n  }]);\n\n  return ServerStyleSheets;\n}();\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js ***!
-  \*************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ServerStyleSheets */ \"./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js ***!
-  \*******************************************************************************************/
-/*! exports provided: sheetsManager, StylesContext, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return sheetsManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return StylesContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return StylesProvider; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js\");\n\n\n\n\n\n\n\n // Default JSS instance.\n\nvar jss = Object(jss__WEBPACK_IMPORTED_MODULE_6__[\"create\"])(Object(_jssPreset__WEBPACK_IMPORTED_MODULE_7__[\"default\"])()); // Use a singleton or the provided one by the context.\n//\n// The counter-based approach doesn't tolerate any mistake.\n// It's much safer to use the same counter everywhere.\n\nvar generateClassName = Object(_createGenerateClassName__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(); // Exported for test purposes\n\nvar sheetsManager = new Map();\nvar defaultOptions = {\n  disableGeneration: false,\n  generateClassName: generateClassName,\n  jss: jss,\n  sheetsCache: null,\n  sheetsManager: sheetsManager,\n  sheetsRegistry: null\n};\nvar StylesContext = react__WEBPACK_IMPORTED_MODULE_2___default.a.createContext(defaultOptions);\n\nif (true) {\n  StylesContext.displayName = 'StylesContext';\n}\n\nvar injectFirstNode;\nfunction StylesProvider(props) {\n  var children = props.children,\n      _props$injectFirst = props.injectFirst,\n      injectFirst = _props$injectFirst === void 0 ? false : _props$injectFirst,\n      _props$disableGenerat = props.disableGeneration,\n      disableGeneration = _props$disableGenerat === void 0 ? false : _props$disableGenerat,\n      localOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"injectFirst\", \"disableGeneration\"]);\n\n  var outerOptions = react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(StylesContext);\n\n  var context = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerOptions), {}, {\n    disableGeneration: disableGeneration\n  }, localOptions);\n\n  if (true) {\n    if (typeof window === 'undefined' && !context.sheetsManager) {\n      console.error('Material-UI: You need to use the ServerStyleSheets API when rendering on the server.');\n    }\n  }\n\n  if (true) {\n    if (context.jss.options.insertionPoint && injectFirst) {\n      console.error('Material-UI: You cannot use a custom insertionPoint and <StylesContext injectFirst> at the same time.');\n    }\n  }\n\n  if (true) {\n    if (injectFirst && localOptions.jss) {\n      console.error('Material-UI: You cannot use the jss and injectFirst props at the same time.');\n    }\n  }\n\n  if (!context.jss.options.insertionPoint && injectFirst && typeof window !== 'undefined') {\n    if (!injectFirstNode) {\n      var head = document.head;\n      injectFirstNode = document.createComment('mui-inject-first');\n      head.insertBefore(injectFirstNode, head.firstChild);\n    }\n\n    context.jss = Object(jss__WEBPACK_IMPORTED_MODULE_6__[\"create\"])({\n      plugins: Object(_jssPreset__WEBPACK_IMPORTED_MODULE_7__[\"default\"])().plugins,\n      insertionPoint: injectFirstNode\n    });\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(StylesContext.Provider, {\n    value: context\n  }, children);\n}\n true ? StylesProvider.propTypes = {\n  /**\n   * Your component tree.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n\n  /**\n   * You can disable the generation of the styles with this option.\n   * It can be useful when traversing the React tree outside of the HTML\n   * rendering step on the server.\n   * Let's say you are using react-apollo to extract all\n   * the queries made by the interface server-side - you can significantly speed up the traversal with this prop.\n   */\n  disableGeneration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * JSS's class name generator.\n   */\n  generateClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * By default, the styles are injected last in the <head> element of the page.\n   * As a result, they gain more specificity than any other style sheet.\n   * If you want to override Material-UI's styles, set this prop.\n   */\n  injectFirst: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * JSS's instance.\n   */\n  jss: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  serverGenerateClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   *\n   * Beta feature.\n   *\n   * Cache for the sheets.\n   */\n  sheetsCache: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   *\n   * The sheetsManager is used to deduplicate style sheet injection in the page.\n   * It's deduplicating using the (theme, styles) couple.\n   * On the server, you should provide a new instance for each request.\n   */\n  sheetsManager: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   *\n   * Collect the sheets.\n   */\n  sheetsRegistry: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n\nif (true) {\n   true ? StylesProvider.propTypes = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"exactProp\"])(StylesProvider.propTypes) : undefined;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default, sheetsManager, StylesContext */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"sheetsManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"StylesContext\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js":
-/*!*****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js ***!
-  \*****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../useTheme/ThemeContext */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony import */ var _nested__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./nested */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js\");\n\n\n\n\n\n\n // To support composition of theme.\n\nfunction mergeOuterLocalTheme(outerTheme, localTheme) {\n  if (typeof localTheme === 'function') {\n    var mergedTheme = localTheme(outerTheme);\n\n    if (true) {\n      if (!mergedTheme) {\n        console.error(['Material-UI: You should return an object from your theme function, i.e.', '<ThemeProvider theme={() => ({})} />'].join('\\n'));\n      }\n    }\n\n    return mergedTheme;\n  }\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerTheme), localTheme);\n}\n/**\n * This component takes a `theme` prop.\n * It makes the `theme` available down the React tree thanks to React context.\n * This component should preferably be used at **the root of your component tree**.\n */\n\n\nfunction ThemeProvider(props) {\n  var children = props.children,\n      localTheme = props.theme;\n  var outerTheme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n\n  if (true) {\n    if (outerTheme === null && typeof localTheme === 'function') {\n      console.error(['Material-UI: You are providing a theme function prop to the ThemeProvider component:', '<ThemeProvider theme={outerTheme => outerTheme} />', '', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n'));\n    }\n  }\n\n  var theme = react__WEBPACK_IMPORTED_MODULE_1___default.a.useMemo(function () {\n    var output = outerTheme === null ? localTheme : mergeOuterLocalTheme(outerTheme, localTheme);\n\n    if (output != null) {\n      output[_nested__WEBPACK_IMPORTED_MODULE_6__[\"default\"]] = outerTheme !== null;\n    }\n\n    return output;\n  }, [localTheme, outerTheme]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Provider, {\n    value: theme\n  }, children);\n}\n\n true ? ThemeProvider.propTypes = {\n  /**\n   * Your component tree.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node.isRequired,\n\n  /**\n   * A theme object. You can provide a function to extend the outer theme.\n   */\n  theme: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func]).isRequired\n} : undefined;\n\nif (true) {\n   true ? ThemeProvider.propTypes = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"exactProp\"])(ThemeProvider.propTypes) : undefined;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ThemeProvider);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ThemeProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ThemeProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ThemeProvider__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\n/* harmony default export */ __webpack_exports__[\"default\"] = (hasSymbol ? Symbol.for('mui.nested') : '__THEME_NESTED__');\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js":
-/*!*************************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js ***!
-  \*************************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createGenerateClassName; });\n/* harmony import */ var _ThemeProvider_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ThemeProvider/nested */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js\");\n\n/**\n * This is the list of the style rule name we use as drop in replacement for the built-in\n * pseudo classes (:checked, :disabled, :focused, etc.).\n *\n * Why do they exist in the first place?\n * These classes are used at a specificity of 2.\n * It allows them to override previously definied styles as well as\n * being untouched by simple user overrides.\n */\n\nvar pseudoClasses = ['checked', 'disabled', 'error', 'focused', 'focusVisible', 'required', 'expanded', 'selected']; // Returns a function which generates unique class names based on counters.\n// When new generator function is created, rule counter is reset.\n// We need to reset the rule counter for SSR for each request.\n//\n// It's inspired by\n// https://github.com/cssinjs/jss/blob/4e6a05dd3f7b6572fdd3ab216861d9e446c20331/src/utils/createGenerateClassName.js\n\nfunction createGenerateClassName() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _options$disableGloba = options.disableGlobal,\n      disableGlobal = _options$disableGloba === void 0 ? false : _options$disableGloba,\n      _options$productionPr = options.productionPrefix,\n      productionPrefix = _options$productionPr === void 0 ? 'jss' : _options$productionPr,\n      _options$seed = options.seed,\n      seed = _options$seed === void 0 ? '' : _options$seed;\n  var seedPrefix = seed === '' ? '' : \"\".concat(seed, \"-\");\n  var ruleCounter = 0;\n\n  var getNextCounterId = function getNextCounterId() {\n    ruleCounter += 1;\n\n    if (true) {\n      if (ruleCounter >= 1e10) {\n        console.warn(['Material-UI: You might have a memory leak.', 'The ruleCounter is not supposed to grow that much.'].join(''));\n      }\n    }\n\n    return ruleCounter;\n  };\n\n  return function (rule, styleSheet) {\n    var name = styleSheet.options.name; // Is a global static MUI style?\n\n    if (name && name.indexOf('Mui') === 0 && !styleSheet.options.link && !disableGlobal) {\n      // We can use a shorthand class name, we never use the keys to style the components.\n      if (pseudoClasses.indexOf(rule.key) !== -1) {\n        return \"Mui-\".concat(rule.key);\n      }\n\n      var prefix = \"\".concat(seedPrefix).concat(name, \"-\").concat(rule.key);\n\n      if (!styleSheet.options.theme[_ThemeProvider_nested__WEBPACK_IMPORTED_MODULE_0__[\"default\"]] || seed !== '') {\n        return prefix;\n      }\n\n      return \"\".concat(prefix, \"-\").concat(getNextCounterId());\n    }\n\n    if (false) {}\n\n    var suffix = \"\".concat(rule.key, \"-\").concat(getNextCounterId()); // Help with debuggability.\n\n    if (styleSheet.options.classNamePrefix) {\n      return \"\".concat(seedPrefix).concat(styleSheet.options.classNamePrefix, \"-\").concat(suffix);\n    }\n\n    return \"\".concat(seedPrefix).concat(suffix);\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js ***!
-  \*******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createGenerateClassName__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createStyles; });\nfunction createStyles(styles) {\n  return styles;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js":
-/*!***********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js ***!
-  \***********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getStylesCreator; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _noopTheme__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./noopTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js\");\n\n\n\n\nfunction getStylesCreator(stylesOrCreator) {\n  var themingEnabled = typeof stylesOrCreator === 'function';\n\n  if (true) {\n    if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(stylesOrCreator) !== 'object' && !themingEnabled) {\n      console.error(['Material-UI: The `styles` argument provided is invalid.', 'You need to provide a function generating the styles or a styles object.'].join('\\n'));\n    }\n  }\n\n  return {\n    create: function create(theme, name) {\n      var styles;\n\n      try {\n        styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n      } catch (err) {\n        if (true) {\n          if (themingEnabled === true && theme === _noopTheme__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n            // TODO: prepend error message/name instead\n            console.error(['Material-UI: The `styles` argument provided is invalid.', 'You are providing a function without a theme in the context.', 'One of the parent elements needs to use a ThemeProvider.'].join('\\n'));\n          }\n        }\n\n        throw err;\n      }\n\n      if (!name || !theme.overrides || !theme.overrides[name]) {\n        return styles;\n      }\n\n      var overrides = theme.overrides[name];\n\n      var stylesWithOverrides = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles);\n\n      Object.keys(overrides).forEach(function (key) {\n        if (true) {\n          if (!stylesWithOverrides[key]) {\n            console.warn(['Material-UI: You are trying to override a style that does not exist.', \"Fix the `\".concat(key, \"` key of `theme.overrides.\").concat(name, \"`.\")].join('\\n'));\n          }\n        }\n\n        stylesWithOverrides[key] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(stylesWithOverrides[key], overrides[key]);\n      });\n      return stylesWithOverrides;\n    },\n    options: {}\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _getStylesCreator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getStylesCreator */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _getStylesCreator__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js ***!
-  \****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n// We use the same empty object to ref count the styles that don't need a theme object.\nvar noopTheme = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = (noopTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js":
-/*!*****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js ***!
-  \*****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getThemeProps; });\n/* eslint-disable no-restricted-syntax */\nfunction getThemeProps(params) {\n  var theme = params.theme,\n      name = params.name,\n      props = params.props;\n\n  if (!theme || !theme.props || !theme.props[name]) {\n    return props;\n  } // Resolve default props, code borrow from React source.\n  // https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L221\n\n\n  var defaultProps = theme.props[name];\n  var propName;\n\n  for (propName in defaultProps) {\n    if (props[propName] === undefined) {\n      props[propName] = defaultProps[propName];\n    }\n  }\n\n  return props;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _getThemeProps__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/index.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/index.js ***!
-  \*******************************************************************/
-/*! exports provided: createGenerateClassName, createStyles, getThemeProps, jssPreset, makeStyles, mergeClasses, ServerStyleSheets, styled, StylesProvider, sheetsManager, StylesContext, ThemeProvider, useTheme, withStyles, withTheme, withThemeCreator */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createGenerateClassName\", function() { return _createGenerateClassName__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _createStyles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createStyles\", function() { return _createStyles__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"getThemeProps\", function() { return _getThemeProps__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"jssPreset\", function() { return _jssPreset__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"makeStyles\", function() { return _makeStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mergeClasses\", function() { return _mergeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ServerStyleSheets */ \"./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ServerStyleSheets\", function() { return _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./styled */ \"./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"styled\", function() { return _styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesProvider\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"sheetsManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"StylesContext\"]; });\n\n/* harmony import */ var _ThemeProvider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ThemeProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ThemeProvider\", function() { return _ThemeProvider__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useTheme\", function() { return _useTheme__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _withStyles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./withStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withStyles\", function() { return _withStyles__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _withTheme__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./withTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withTheme\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_13__[\"withThemeCreator\"]; });\n\n/** @license Material-UI v4.10.0\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/* eslint-disable import/export */\n\n/* Warning if there are several instances of @material-ui/styles */\n\nif ( true && typeof window !== 'undefined') {\n  _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] = _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] || 0;\n\n  if (_material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] === 1) {\n    console.warn(['It looks like there are several instances of `@material-ui/styles` initialized in this application.', 'This may cause theme propagation issues, broken class names, ' + 'specificity issues, and makes your application bigger without a good reason.', '', 'See https://material-ui.com/r/styles-instance-warning for more info.'].join('\\n'));\n  }\n\n  _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] += 1;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _jssPreset__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return jssPreset; });\n/* harmony import */ var jss_plugin_rule_value_function__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jss-plugin-rule-value-function */ \"./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js\");\n/* harmony import */ var jss_plugin_global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss-plugin-global */ \"./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js\");\n/* harmony import */ var jss_plugin_nested__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jss-plugin-nested */ \"./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js\");\n/* harmony import */ var jss_plugin_camel_case__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jss-plugin-camel-case */ \"./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js\");\n/* harmony import */ var jss_plugin_default_unit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jss-plugin-default-unit */ \"./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js\");\n/* harmony import */ var jss_plugin_vendor_prefixer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jss-plugin-vendor-prefixer */ \"./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js\");\n/* harmony import */ var jss_plugin_props_sort__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jss-plugin-props-sort */ \"./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js\");\n\n\n\n\n\n\n // Subset of jss-preset-default with only the plugins the Material-UI components are using.\n\nfunction jssPreset() {\n  return {\n    plugins: [Object(jss_plugin_rule_value_function__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(), Object(jss_plugin_global__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(), Object(jss_plugin_nested__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(), Object(jss_plugin_camel_case__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(), Object(jss_plugin_default_unit__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(), // Disable the vendor prefixer server-side, it does nothing.\n    // This way, we can get a performance boost.\n    // In the documentation, we are using `autoprefixer` to solve this problem.\n    typeof window === 'undefined' ? null : Object(jss_plugin_vendor_prefixer__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(), Object(jss_plugin_props_sort__WEBPACK_IMPORTED_MODULE_6__[\"default\"])()]\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _makeStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js ***!
-  \*************************************************************************************/
-/*! exports provided: increment */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"increment\", function() { return increment; });\n/* eslint-disable import/prefer-default-export */\n// Global index counter to preserve source order.\n// We create the style sheet during the creation of the component,\n// children are handled after the parents, so the order of style elements would be parent->child.\n// It is a problem though when a parent passes a className\n// which needs to override any child's styles.\n// StyleSheet of the child has a higher specificity, because of the source order.\n// So our solution is to render sheets them in the reverse order child->sheet, so\n// that parent has a higher specificity.\nvar indexCounter = -1e9;\nfunction increment() {\n  indexCounter += 1;\n\n  if (true) {\n    if (indexCounter >= 0) {\n      console.warn(['Material-UI: You might have a memory leak.', 'The indexCounter is not supposed to grow that much.'].join('\\n'));\n    }\n  }\n\n  return indexCounter;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return makeStyles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js\");\n/* harmony import */ var _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./multiKeyStore */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony import */ var _indexCounter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./indexCounter */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js\");\n/* harmony import */ var _getStylesCreator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../getStylesCreator */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js\");\n/* harmony import */ var _getStylesCreator_noopTheme__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../getStylesCreator/noopTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getClasses(_ref, classes, Component) {\n  var state = _ref.state,\n      stylesOptions = _ref.stylesOptions;\n\n  if (stylesOptions.disableGeneration) {\n    return classes || {};\n  }\n\n  if (!state.cacheClasses) {\n    state.cacheClasses = {\n      // Cache for the finalized classes value.\n      value: null,\n      // Cache for the last used classes prop pointer.\n      lastProp: null,\n      // Cache for the last used rendered classes pointer.\n      lastJSS: {}\n    };\n  } // Tracks if either the rendered classes or classes prop has changed,\n  // requiring the generation of a new finalized classes object.\n\n\n  var generate = false;\n\n  if (state.classes !== state.cacheClasses.lastJSS) {\n    state.cacheClasses.lastJSS = state.classes;\n    generate = true;\n  }\n\n  if (classes !== state.cacheClasses.lastProp) {\n    state.cacheClasses.lastProp = classes;\n    generate = true;\n  }\n\n  if (generate) {\n    state.cacheClasses.value = Object(_mergeClasses__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      baseClasses: state.cacheClasses.lastJSS,\n      newClasses: classes,\n      Component: Component\n    });\n  }\n\n  return state.cacheClasses.value;\n}\n\nfunction attach(_ref2, props) {\n  var state = _ref2.state,\n      theme = _ref2.theme,\n      stylesOptions = _ref2.stylesOptions,\n      stylesCreator = _ref2.stylesCreator,\n      name = _ref2.name;\n\n  if (stylesOptions.disableGeneration) {\n    return;\n  }\n\n  var sheetManager = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsManager, stylesCreator, theme);\n\n  if (!sheetManager) {\n    sheetManager = {\n      refs: 0,\n      staticSheet: null,\n      dynamicStyles: null\n    };\n    _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(stylesOptions.sheetsManager, stylesCreator, theme, sheetManager);\n  }\n\n  var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, stylesCreator.options), stylesOptions), {}, {\n    theme: theme,\n    flip: typeof stylesOptions.flip === 'boolean' ? stylesOptions.flip : theme.direction === 'rtl'\n  });\n\n  options.generateId = options.serverGenerateClassName || options.generateClassName;\n  var sheetsRegistry = stylesOptions.sheetsRegistry;\n\n  if (sheetManager.refs === 0) {\n    var staticSheet;\n\n    if (stylesOptions.sheetsCache) {\n      staticSheet = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsCache, stylesCreator, theme);\n    }\n\n    var styles = stylesCreator.create(theme, name);\n\n    if (!staticSheet) {\n      staticSheet = stylesOptions.jss.createStyleSheet(styles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        link: false\n      }, options));\n      staticSheet.attach();\n\n      if (stylesOptions.sheetsCache) {\n        _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(stylesOptions.sheetsCache, stylesCreator, theme, staticSheet);\n      }\n    }\n\n    if (sheetsRegistry) {\n      sheetsRegistry.add(staticSheet);\n    }\n\n    sheetManager.staticSheet = staticSheet;\n    sheetManager.dynamicStyles = Object(jss__WEBPACK_IMPORTED_MODULE_3__[\"getDynamicStyles\"])(styles);\n  }\n\n  if (sheetManager.dynamicStyles) {\n    var dynamicSheet = stylesOptions.jss.createStyleSheet(sheetManager.dynamicStyles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      link: true\n    }, options));\n    dynamicSheet.update(props);\n    dynamicSheet.attach();\n    state.dynamicSheet = dynamicSheet;\n    state.classes = Object(_mergeClasses__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      baseClasses: sheetManager.staticSheet.classes,\n      newClasses: dynamicSheet.classes\n    });\n\n    if (sheetsRegistry) {\n      sheetsRegistry.add(dynamicSheet);\n    }\n  } else {\n    state.classes = sheetManager.staticSheet.classes;\n  }\n\n  sheetManager.refs += 1;\n}\n\nfunction update(_ref3, props) {\n  var state = _ref3.state;\n\n  if (state.dynamicSheet) {\n    state.dynamicSheet.update(props);\n  }\n}\n\nfunction detach(_ref4) {\n  var state = _ref4.state,\n      theme = _ref4.theme,\n      stylesOptions = _ref4.stylesOptions,\n      stylesCreator = _ref4.stylesCreator;\n\n  if (stylesOptions.disableGeneration) {\n    return;\n  }\n\n  var sheetManager = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsManager, stylesCreator, theme);\n  sheetManager.refs -= 1;\n  var sheetsRegistry = stylesOptions.sheetsRegistry;\n\n  if (sheetManager.refs === 0) {\n    _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].delete(stylesOptions.sheetsManager, stylesCreator, theme);\n    stylesOptions.jss.removeStyleSheet(sheetManager.staticSheet);\n\n    if (sheetsRegistry) {\n      sheetsRegistry.remove(sheetManager.staticSheet);\n    }\n  }\n\n  if (state.dynamicSheet) {\n    stylesOptions.jss.removeStyleSheet(state.dynamicSheet);\n\n    if (sheetsRegistry) {\n      sheetsRegistry.remove(state.dynamicSheet);\n    }\n  }\n}\n\nfunction useSynchronousEffect(func, values) {\n  var key = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef([]);\n  var output; // Store \"generation\" key. Just returns a new object every time\n\n  var currentKey = react__WEBPACK_IMPORTED_MODULE_2___default.a.useMemo(function () {\n    return {};\n  }, values); // eslint-disable-line react-hooks/exhaustive-deps\n  // \"the first render\", or \"memo dropped the value\"\n\n  if (key.current !== currentKey) {\n    key.current = currentKey;\n    output = func();\n  }\n\n  react__WEBPACK_IMPORTED_MODULE_2___default.a.useEffect(function () {\n    return function () {\n      if (output) {\n        output();\n      }\n    };\n  }, [currentKey] // eslint-disable-line react-hooks/exhaustive-deps\n  );\n}\n\nfunction makeStyles(stylesOrCreator) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var name = options.name,\n      classNamePrefixOption = options.classNamePrefix,\n      Component = options.Component,\n      _options$defaultTheme = options.defaultTheme,\n      defaultTheme = _options$defaultTheme === void 0 ? _getStylesCreator_noopTheme__WEBPACK_IMPORTED_MODULE_10__[\"default\"] : _options$defaultTheme,\n      stylesOptions2 = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(options, [\"name\", \"classNamePrefix\", \"Component\", \"defaultTheme\"]);\n\n  var stylesCreator = Object(_getStylesCreator__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(stylesOrCreator);\n  var classNamePrefix = name || classNamePrefixOption || 'makeStyles';\n  stylesCreator.options = {\n    index: Object(_indexCounter__WEBPACK_IMPORTED_MODULE_8__[\"increment\"])(),\n    name: name,\n    meta: classNamePrefix,\n    classNamePrefix: classNamePrefix\n  };\n\n  var useStyles = function useStyles() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])() || defaultTheme;\n\n    var stylesOptions = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(_StylesProvider__WEBPACK_IMPORTED_MODULE_7__[\"StylesContext\"])), stylesOptions2);\n\n    var instance = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef();\n    var shouldUpdate = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef();\n    useSynchronousEffect(function () {\n      var current = {\n        name: name,\n        state: {},\n        stylesCreator: stylesCreator,\n        stylesOptions: stylesOptions,\n        theme: theme\n      };\n      attach(current, props);\n      shouldUpdate.current = false;\n      instance.current = current;\n      return function () {\n        detach(current);\n      };\n    }, [theme, stylesCreator]);\n    react__WEBPACK_IMPORTED_MODULE_2___default.a.useEffect(function () {\n      if (shouldUpdate.current) {\n        update(instance.current, props);\n      }\n\n      shouldUpdate.current = true;\n    });\n    var classes = getClasses(instance.current, props.classes, Component);\n\n    if (true) {\n      // eslint-disable-next-line react-hooks/rules-of-hooks\n      react__WEBPACK_IMPORTED_MODULE_2___default.a.useDebugValue(classes);\n    }\n\n    return classes;\n  };\n\n  return useStyles;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js":
-/*!**************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js ***!
-  \**************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n// Used https://github.com/thinkloop/multi-key-cache as inspiration\nvar multiKeyStore = {\n  set: function set(cache, key1, key2, value) {\n    var subCache = cache.get(key1);\n\n    if (!subCache) {\n      subCache = new Map();\n      cache.set(key1, subCache);\n    }\n\n    subCache.set(key2, value);\n  },\n  get: function get(cache, key1, key2) {\n    var subCache = cache.get(key1);\n    return subCache ? subCache.get(key2) : undefined;\n  },\n  delete: function _delete(cache, key1, key2) {\n    var subCache = cache.get(key1);\n    subCache.delete(key2);\n  }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (multiKeyStore);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _mergeClasses__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return mergeClasses; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\nfunction mergeClasses() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var baseClasses = options.baseClasses,\n      newClasses = options.newClasses,\n      Component = options.Component;\n\n  if (!newClasses) {\n    return baseClasses;\n  }\n\n  var nextClasses = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, baseClasses);\n\n  if (true) {\n    if (typeof newClasses === 'string') {\n      console.error([\"Material-UI: The value `\".concat(newClasses, \"` \") + \"provided to the classes prop of \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \" is incorrect.\"), 'You might want to use the className prop instead.'].join('\\n'));\n      return baseClasses;\n    }\n  }\n\n  Object.keys(newClasses).forEach(function (key) {\n    if (true) {\n      if (!baseClasses[key] && newClasses[key]) {\n        console.error([\"Material-UI: The key `\".concat(key, \"` \") + \"provided to the classes prop is not implemented in \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \".\"), \"You can only override one of the following: \".concat(Object.keys(baseClasses).join(','), \".\")].join('\\n'));\n      }\n\n      if (newClasses[key] && typeof newClasses[key] !== 'string') {\n        console.error([\"Material-UI: The key `\".concat(key, \"` \") + \"provided to the classes prop is not valid for \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \".\"), \"You need to provide a non empty string instead of: \".concat(newClasses[key], \".\")].join('\\n'));\n      }\n    }\n\n    if (newClasses[key]) {\n      nextClasses[key] = \"\".concat(baseClasses[key], \" \").concat(newClasses[key]);\n    }\n  });\n  return nextClasses;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _styled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./styled */ \"./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _styled__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return styled; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n\n\n\n\n\n\n\n\n\nfunction omit(input, fields) {\n  var output = {};\n  Object.keys(input).forEach(function (prop) {\n    if (fields.indexOf(prop) === -1) {\n      output[prop] = input[prop];\n    }\n  });\n  return output;\n} // styled-components's API removes the mapping between components and styles.\n// Using components as a low-level styling construct can be simpler.\n\n\nfunction styled(Component) {\n  var componentCreator = function componentCreator(style) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var name = options.name,\n        stylesOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"name\"]);\n\n    if ( true && Component === undefined) {\n      throw new Error(['You are calling styled(Component)(style) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n    }\n\n    var classNamePrefix = name;\n\n    if (true) {\n      if (!name) {\n        // Provide a better DX outside production.\n        var displayName = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component);\n\n        if (displayName !== undefined) {\n          classNamePrefix = displayName;\n        }\n      }\n    }\n\n    var stylesOrCreator = typeof style === 'function' ? function (theme) {\n      return {\n        root: function root(props) {\n          return style(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n            theme: theme\n          }, props));\n        }\n      };\n    } : {\n      root: style\n    };\n    var useStyles = Object(_makeStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      Component: Component,\n      name: name || Component.displayName,\n      classNamePrefix: classNamePrefix\n    }, stylesOptions));\n    var filterProps;\n    var propTypes = {};\n\n    if (style.filterProps) {\n      filterProps = style.filterProps;\n      delete style.filterProps;\n    }\n    /* eslint-disable react/forbid-foreign-prop-types */\n\n\n    if (style.propTypes) {\n      propTypes = style.propTypes;\n      delete style.propTypes;\n    }\n    /* eslint-enable react/forbid-foreign-prop-types */\n\n\n    var StyledComponent = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function StyledComponent(props, ref) {\n      var children = props.children,\n          classNameProp = props.className,\n          clone = props.clone,\n          ComponentProp = props.component,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"className\", \"clone\", \"component\"]);\n\n      var classes = useStyles(props);\n      var className = Object(clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, classNameProp);\n      var spread = other;\n\n      if (filterProps) {\n        spread = omit(spread, filterProps);\n      }\n\n      if (clone) {\n        return react__WEBPACK_IMPORTED_MODULE_2___default.a.cloneElement(children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n          className: Object(clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(children.props.className, className)\n        }, spread));\n      }\n\n      if (typeof children === 'function') {\n        return children(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n          className: className\n        }, spread));\n      }\n\n      var FinalComponent = ComponentProp || Component;\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(FinalComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        ref: ref,\n        className: className\n      }, spread), children);\n    });\n     true ? StyledComponent.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      /**\n       * A render function or node.\n       */\n      children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n      /**\n       * @ignore\n       */\n      className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n      /**\n       * If `true`, the component will recycle it's children HTML element.\n       * It's using `React.cloneElement` internally.\n       *\n       * This prop will be deprecated and removed in v5\n       */\n      clone: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, function (props) {\n        if (props.clone && props.component) {\n          return new Error('You can not use the clone and component prop at the same time.');\n        }\n\n        return null;\n      }),\n\n      /**\n       * The component used for the root node.\n       * Either a string to use a HTML element or a component.\n       */\n      component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType\n    }, propTypes) : undefined;\n\n    if (true) {\n      StyledComponent.displayName = \"Styled(\".concat(classNamePrefix, \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6___default()(StyledComponent, Component);\n    return StyledComponent;\n  };\n\n  return componentCreator;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nvar ThemeContext = react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext(null);\n\nif (true) {\n  ThemeContext.displayName = 'ThemeContext';\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ThemeContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _useTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useTheme; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ThemeContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ThemeContext */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js\");\n\n\nfunction useTheme() {\n  var theme = react__WEBPACK_IMPORTED_MODULE_0___default.a.useContext(_ThemeContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_0___default.a.useDebugValue(theme);\n  }\n\n  return theme;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _withStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _withStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n/* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n\n\n\n\n\n\n\n\n // Link a style sheet with a component.\n// It does not modify the component passed to it;\n// instead, it returns a new component, with a `classes` property.\n\nvar withStyles = function withStyles(stylesOrCreator) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return function (Component) {\n    var defaultTheme = options.defaultTheme,\n        _options$withTheme = options.withTheme,\n        withTheme = _options$withTheme === void 0 ? false : _options$withTheme,\n        name = options.name,\n        stylesOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"defaultTheme\", \"withTheme\", \"name\"]);\n\n    if (true) {\n      if (Component === undefined) {\n        throw new Error(['You are calling withStyles(styles)(Component) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n      }\n    }\n\n    var classNamePrefix = name;\n\n    if (true) {\n      if (!name) {\n        // Provide a better DX outside production.\n        var displayName = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component);\n\n        if (displayName !== undefined) {\n          classNamePrefix = displayName;\n        }\n      }\n    }\n\n    var useStyles = Object(_makeStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      defaultTheme: defaultTheme,\n      Component: Component,\n      name: name || Component.displayName,\n      classNamePrefix: classNamePrefix\n    }, stylesOptions));\n    var WithStyles = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function WithStyles(props, ref) {\n      var classesProp = props.classes,\n          innerRef = props.innerRef,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"innerRef\"]); // The wrapper receives only user supplied props, which could be a subset of\n      // the actual props Component might receive due to merging with defaultProps.\n      // So copying it here would give us the same result in the wrapper as well.\n\n\n      var classes = useStyles(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, Component.defaultProps), props));\n      var theme;\n      var more = other;\n\n      if (typeof name === 'string' || withTheme) {\n        // name and withTheme are invariant in the outer scope\n        // eslint-disable-next-line react-hooks/rules-of-hooks\n        theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_8__[\"default\"])() || defaultTheme;\n\n        if (name) {\n          more = Object(_getThemeProps__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({\n            theme: theme,\n            name: name,\n            props: other\n          });\n        } // Provide the theme to the wrapped component.\n        // So we don't have to use the `withTheme()` Higher-order Component.\n\n\n        if (withTheme && !more.theme) {\n          more.theme = theme;\n        }\n      }\n\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        ref: innerRef || ref,\n        classes: classes\n      }, more));\n    });\n     true ? WithStyles.propTypes = {\n      /**\n       * Override or extend the styles applied to the component.\n       */\n      classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n      /**\n       * Use that prop to pass a ref to the decorated component.\n       * @deprecated\n       */\n      innerRef: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object]), function (props) {\n        if (props.innerRef == null) {\n          return null;\n        }\n\n        return null; // return new Error(\n        //   'Material-UI: The `innerRef` prop is deprecated and will be removed in v5. ' +\n        //     'Refs are now automatically forwarded to the inner component.',\n        // );\n      })\n    } : undefined;\n\n    if (true) {\n      WithStyles.displayName = \"WithStyles(\".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component), \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default()(WithStyles, Component);\n\n    if (true) {\n      // Exposed for test purposes.\n      WithStyles.Naked = Component;\n      WithStyles.options = options;\n      WithStyles.useStyles = useStyles;\n    }\n\n    return WithStyles;\n  };\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (withStyles);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default, withThemeCreator */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _withTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_0__[\"withThemeCreator\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js ***!
-  \*********************************************************************************/
-/*! exports provided: withThemeCreator, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return withThemeCreator; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n\n\n\n\n\n\n\nfunction withThemeCreator() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var defaultTheme = options.defaultTheme;\n\n  var withTheme = function withTheme(Component) {\n    if (true) {\n      if (Component === undefined) {\n        throw new Error(['You are calling withTheme(Component) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n      }\n    }\n\n    var WithTheme = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function WithTheme(props, ref) {\n      var innerRef = props.innerRef,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"innerRef\"]);\n\n      var theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])() || defaultTheme;\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        theme: theme,\n        ref: innerRef || ref\n      }, other));\n    });\n     true ? WithTheme.propTypes = {\n      /**\n       * Use that prop to pass a ref to the decorated component.\n       * @deprecated\n       */\n      innerRef: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object]), function (props) {\n        if (props.innerRef == null) {\n          return null;\n        }\n\n        return new Error('Material-UI: The `innerRef` prop is deprecated and will be removed in v5. ' + 'Refs are now automatically forwarded to the inner component.');\n      })\n    } : undefined;\n\n    if (true) {\n      WithTheme.displayName = \"WithTheme(\".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component), \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default()(WithTheme, Component);\n\n    if (true) {\n      // Exposed for test purposes.\n      WithTheme.Naked = Component;\n    }\n\n    return WithTheme;\n  };\n\n  return withTheme;\n} // Provide the theme object as a prop to the input component.\n// It's an alternative API to useTheme().\n// We encourage the usage of useTheme() where possible.\n\nvar withTheme = withThemeCreator();\n/* harmony default export */ __webpack_exports__[\"default\"] = (withTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/borders.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/borders.js ***!
-  \*********************************************************************/
-/*! exports provided: border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"border\", function() { return border; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderTop\", function() { return borderTop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderRight\", function() { return borderRight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderBottom\", function() { return borderBottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderLeft\", function() { return borderLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderColor\", function() { return borderColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderRadius\", function() { return borderRadius; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\n\nfunction getBorder(value) {\n  if (typeof value !== 'number') {\n    return value;\n  }\n\n  return \"\".concat(value, \"px solid\");\n}\n\nvar border = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'border',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderTop = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderTop',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderRight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderRight',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderBottom = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderBottom',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderLeft = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderLeft',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderColor = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderColor',\n  themeKey: 'palette'\n});\nvar borderRadius = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderRadius',\n  themeKey: 'shape'\n});\nvar borders = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius);\n/* harmony default export */ __webpack_exports__[\"default\"] = (borders);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/borders.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js ***!
-  \*************************************************************************/
-/*! exports provided: handleBreakpoints, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"handleBreakpoints\", function() { return handleBreakpoints; });\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\n\n // The breakpoint **start** at this value.\n// For instance with the first breakpoint xs: [xs, sm[.\n\nvar values = {\n  xs: 0,\n  sm: 600,\n  md: 960,\n  lg: 1280,\n  xl: 1920\n};\nvar defaultBreakpoints = {\n  // Sorted ASC by size. That's important.\n  // It can't be configured as it's used statically for propTypes.\n  keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n  up: function up(key) {\n    return \"@media (min-width:\".concat(values[key], \"px)\");\n  }\n};\nfunction handleBreakpoints(props, propValue, styleFromPropValue) {\n  if (true) {\n    if (!props.theme) {\n      console.error('Material-UI: You are calling a style function without a theme value.');\n    }\n  }\n\n  if (Array.isArray(propValue)) {\n    var themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n    return propValue.reduce(function (acc, item, index) {\n      acc[themeBreakpoints.up(themeBreakpoints.keys[index])] = styleFromPropValue(propValue[index]);\n      return acc;\n    }, {});\n  }\n\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(propValue) === 'object') {\n    var _themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n\n    return Object.keys(propValue).reduce(function (acc, breakpoint) {\n      acc[_themeBreakpoints.up(breakpoint)] = styleFromPropValue(propValue[breakpoint]);\n      return acc;\n    }, {});\n  }\n\n  var output = styleFromPropValue(propValue);\n  return output;\n}\n\nfunction breakpoints(styleFunction) {\n  var newStyleFunction = function newStyleFunction(props) {\n    var base = styleFunction(props);\n    var themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n    var extended = themeBreakpoints.keys.reduce(function (acc, key) {\n      if (props[key]) {\n        acc = acc || {};\n        acc[themeBreakpoints.up(key)] = styleFunction(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n          theme: props.theme\n        }, props[key]));\n      }\n\n      return acc;\n    }, null);\n    return Object(_merge__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(base, extended);\n  };\n\n  newStyleFunction.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, styleFunction.propTypes), {}, {\n    xs: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    sm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    md: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    lg: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    xl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n  }) : undefined;\n  newStyleFunction.filterProps = ['xs', 'sm', 'md', 'lg', 'xl'].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(styleFunction.filterProps));\n  return newStyleFunction;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (breakpoints);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/compose.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/compose.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\nfunction compose() {\n  for (var _len = arguments.length, styles = new Array(_len), _key = 0; _key < _len; _key++) {\n    styles[_key] = arguments[_key];\n  }\n\n  var fn = function fn(props) {\n    return styles.reduce(function (acc, style) {\n      var output = style(props);\n\n      if (output) {\n        return Object(_merge__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(acc, output);\n      }\n\n      return acc;\n    }, {});\n  }; // Alternative approach that doesn't yield any performance gain.\n  // const handlers = styles.reduce((acc, style) => {\n  //   style.filterProps.forEach(prop => {\n  //     acc[prop] = style;\n  //   });\n  //   return acc;\n  // }, {});\n  // const fn = props => {\n  //   return Object.keys(props).reduce((acc, prop) => {\n  //     if (handlers[prop]) {\n  //       return merge(acc, handlers[prop](props));\n  //     }\n  //     return acc;\n  //   }, {});\n  // };\n\n\n  fn.propTypes =  true ? styles.reduce(function (acc, style) {\n    return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(acc, style.propTypes);\n  }, {}) : undefined;\n  fn.filterProps = styles.reduce(function (acc, style) {\n    return acc.concat(style.filterProps);\n  }, []);\n  return fn;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (compose);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/compose.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/css.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/css.js ***!
-  \*****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\n\n\nfunction omit(input, fields) {\n  var output = {};\n  Object.keys(input).forEach(function (prop) {\n    if (fields.indexOf(prop) === -1) {\n      output[prop] = input[prop];\n    }\n  });\n  return output;\n}\n\nfunction css(styleFunction) {\n  var newStyleFunction = function newStyleFunction(props) {\n    var output = styleFunction(props);\n\n    if (props.css) {\n      return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, Object(_merge__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(output, styleFunction(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        theme: props.theme\n      }, props.css)))), omit(props.css, [styleFunction.filterProps]));\n    }\n\n    return output;\n  };\n\n  newStyleFunction.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, styleFunction.propTypes), {}, {\n    css: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  }) : undefined;\n  newStyleFunction.filterProps = ['css'].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(styleFunction.filterProps));\n  return newStyleFunction;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (css);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/css.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/display.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/display.js ***!
-  \*********************************************************************/
-/*! exports provided: displayPrint, displayRaw, overflow, textOverflow, visibility, whiteSpace, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"displayPrint\", function() { return displayPrint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"displayRaw\", function() { return displayRaw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"overflow\", function() { return overflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"textOverflow\", function() { return textOverflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"visibility\", function() { return visibility; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"whiteSpace\", function() { return whiteSpace; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar displayPrint = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'displayPrint',\n  cssProperty: false,\n  transform: function transform(value) {\n    return {\n      '@media print': {\n        display: value\n      }\n    };\n  }\n});\nvar displayRaw = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'display'\n});\nvar overflow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'overflow'\n});\nvar textOverflow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'textOverflow'\n});\nvar visibility = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'visibility'\n});\nvar whiteSpace = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'whiteSpace'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(displayPrint, displayRaw, overflow, textOverflow, visibility, whiteSpace));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/display.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/flexbox.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/flexbox.js ***!
-  \*********************************************************************/
-/*! exports provided: flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexBasis\", function() { return flexBasis; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexDirection\", function() { return flexDirection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexWrap\", function() { return flexWrap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifyContent\", function() { return justifyContent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignItems\", function() { return alignItems; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignContent\", function() { return alignContent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"order\", function() { return order; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flex\", function() { return flex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexGrow\", function() { return flexGrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexShrink\", function() { return flexShrink; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignSelf\", function() { return alignSelf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifyItems\", function() { return justifyItems; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifySelf\", function() { return justifySelf; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar flexBasis = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexBasis'\n});\nvar flexDirection = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexDirection'\n});\nvar flexWrap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexWrap'\n});\nvar justifyContent = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifyContent'\n});\nvar alignItems = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignItems'\n});\nvar alignContent = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignContent'\n});\nvar order = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'order'\n});\nvar flex = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flex'\n});\nvar flexGrow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexGrow'\n});\nvar flexShrink = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexShrink'\n});\nvar alignSelf = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignSelf'\n});\nvar justifyItems = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifyItems'\n});\nvar justifySelf = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifySelf'\n});\nvar flexbox = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf);\n/* harmony default export */ __webpack_exports__[\"default\"] = (flexbox);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/flexbox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/grid.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/grid.js ***!
-  \******************************************************************/
-/*! exports provided: gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridGap\", function() { return gridGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridColumnGap\", function() { return gridColumnGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridRowGap\", function() { return gridRowGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridColumn\", function() { return gridColumn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridRow\", function() { return gridRow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoFlow\", function() { return gridAutoFlow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoColumns\", function() { return gridAutoColumns; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoRows\", function() { return gridAutoRows; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateColumns\", function() { return gridTemplateColumns; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateRows\", function() { return gridTemplateRows; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateAreas\", function() { return gridTemplateAreas; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridArea\", function() { return gridArea; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar gridGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridGap'\n});\nvar gridColumnGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridColumnGap'\n});\nvar gridRowGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridRowGap'\n});\nvar gridColumn = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridColumn'\n});\nvar gridRow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridRow'\n});\nvar gridAutoFlow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoFlow'\n});\nvar gridAutoColumns = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoColumns'\n});\nvar gridAutoRows = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoRows'\n});\nvar gridTemplateColumns = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateColumns'\n});\nvar gridTemplateRows = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateRows'\n});\nvar gridTemplateAreas = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateAreas'\n});\nvar gridArea = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridArea'\n});\nvar grid = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea);\n/* harmony default export */ __webpack_exports__[\"default\"] = (grid);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/grid.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/index.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/index.js ***!
-  \*******************************************************************/
-/*! exports provided: borders, border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius, breakpoints, compose, css, display, flexbox, flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf, grid, gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea, palette, color, bgcolor, positions, position, zIndex, top, right, bottom, left, shadows, sizing, width, maxWidth, minWidth, height, maxHeight, minHeight, sizeWidth, sizeHeight, boxSizing, spacing, createUnarySpacing, style, typography, fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _borders__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./borders */ \"./jaas-client/node_modules/@material-ui/system/esm/borders.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borders\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"border\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"border\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderTop\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderTop\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderRight\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderRight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderBottom\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderBottom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderLeft\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderLeft\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderColor\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderColor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderRadius\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderRadius\"]; });\n\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"breakpoints\", function() { return _breakpoints__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return _compose__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./css */ \"./jaas-client/node_modules/@material-ui/system/esm/css.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"css\", function() { return _css__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _display__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./display */ \"./jaas-client/node_modules/@material-ui/system/esm/display.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"display\", function() { return _display__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _flexbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./flexbox */ \"./jaas-client/node_modules/@material-ui/system/esm/flexbox.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexbox\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexBasis\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexBasis\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexDirection\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexDirection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexWrap\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexWrap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifyContent\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifyContent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignItems\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignItems\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignContent\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignContent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"order\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"order\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flex\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexGrow\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexGrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexShrink\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexShrink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignSelf\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignSelf\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifyItems\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifyItems\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifySelf\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifySelf\"]; });\n\n/* harmony import */ var _grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./grid */ \"./jaas-client/node_modules/@material-ui/system/esm/grid.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"grid\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridColumnGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridColumnGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridRowGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridRowGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridColumn\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridColumn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridRow\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoFlow\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoFlow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoColumns\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoColumns\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoRows\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoRows\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateColumns\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateColumns\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateRows\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateRows\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateAreas\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateAreas\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridArea\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridArea\"]; });\n\n/* harmony import */ var _palette__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./palette */ \"./jaas-client/node_modules/@material-ui/system/esm/palette.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"palette\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"color\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"color\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bgcolor\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"bgcolor\"]; });\n\n/* harmony import */ var _positions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./positions */ \"./jaas-client/node_modules/@material-ui/system/esm/positions.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"positions\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"position\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"position\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"zIndex\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"zIndex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"top\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"top\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"right\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"right\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bottom\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"bottom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"left\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"left\"]; });\n\n/* harmony import */ var _shadows__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./shadows */ \"./jaas-client/node_modules/@material-ui/system/esm/shadows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shadows\", function() { return _shadows__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _sizing__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./sizing */ \"./jaas-client/node_modules/@material-ui/system/esm/sizing.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizing\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"width\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"width\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"maxWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"maxWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"minWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"minWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"height\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"height\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"maxHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"maxHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"minHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"minHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizeWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"sizeWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizeHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"sizeHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"boxSizing\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"boxSizing\"]; });\n\n/* harmony import */ var _spacing__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./spacing */ \"./jaas-client/node_modules/@material-ui/system/esm/spacing.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"spacing\", function() { return _spacing__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createUnarySpacing\", function() { return _spacing__WEBPACK_IMPORTED_MODULE_11__[\"createUnarySpacing\"]; });\n\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"style\", function() { return _style__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _typography__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./typography */ \"./jaas-client/node_modules/@material-ui/system/esm/typography.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"typography\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontFamily\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontFamily\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontSize\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontSize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontStyle\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontStyle\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontWeight\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontWeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"letterSpacing\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"letterSpacing\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"lineHeight\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"lineHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"textAlign\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"textAlign\"]; });\n\n/** @license Material-UI v4.9.14\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/memoize.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/memoize.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return memoize; });\nfunction memoize(fn) {\n  var cache = {};\n  return function (arg) {\n    if (cache[arg] === undefined) {\n      cache[arg] = fn(arg);\n    }\n\n    return cache[arg];\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/memoize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/merge.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/merge.js ***!
-  \*******************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\nfunction merge(acc, item) {\n  if (!item) {\n    return acc;\n  }\n\n  return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"deepmerge\"])(acc, item, {\n    clone: false // No need to clone deep, it's way faster.\n\n  });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (merge);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/merge.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/palette.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/palette.js ***!
-  \*********************************************************************/
-/*! exports provided: color, bgcolor, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"color\", function() { return color; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bgcolor\", function() { return bgcolor; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar color = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'color',\n  themeKey: 'palette'\n});\nvar bgcolor = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'bgcolor',\n  cssProperty: 'backgroundColor',\n  themeKey: 'palette'\n});\nvar palette = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(color, bgcolor);\n/* harmony default export */ __webpack_exports__[\"default\"] = (palette);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/palette.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/positions.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/positions.js ***!
-  \***********************************************************************/
-/*! exports provided: position, zIndex, top, right, bottom, left, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"position\", function() { return position; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"zIndex\", function() { return zIndex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"top\", function() { return top; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"right\", function() { return right; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bottom\", function() { return bottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"left\", function() { return left; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar position = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'position'\n});\nvar zIndex = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'zIndex',\n  themeKey: 'zIndex'\n});\nvar top = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'top'\n});\nvar right = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'right'\n});\nvar bottom = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'bottom'\n});\nvar left = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'left'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(position, zIndex, top, right, bottom, left));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/positions.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar responsivePropType =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.array]) : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (responsivePropType);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/shadows.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/shadows.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n\nvar boxShadow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'boxShadow',\n  themeKey: 'shadows'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (boxShadow);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/shadows.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/sizing.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/sizing.js ***!
-  \********************************************************************/
-/*! exports provided: width, maxWidth, minWidth, height, maxHeight, minHeight, sizeWidth, sizeHeight, boxSizing, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"width\", function() { return width; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"maxWidth\", function() { return maxWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"minWidth\", function() { return minWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"height\", function() { return height; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"maxHeight\", function() { return maxHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"minHeight\", function() { return minHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sizeWidth\", function() { return sizeWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sizeHeight\", function() { return sizeHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"boxSizing\", function() { return boxSizing; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\n\nfunction transform(value) {\n  return value <= 1 ? \"\".concat(value * 100, \"%\") : value;\n}\n\nvar width = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'width',\n  transform: transform\n});\nvar maxWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'maxWidth',\n  transform: transform\n});\nvar minWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'minWidth',\n  transform: transform\n});\nvar height = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'height',\n  transform: transform\n});\nvar maxHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'maxHeight',\n  transform: transform\n});\nvar minHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'minHeight',\n  transform: transform\n});\nvar sizeWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'size',\n  cssProperty: 'width',\n  transform: transform\n});\nvar sizeHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'size',\n  cssProperty: 'height',\n  transform: transform\n});\nvar boxSizing = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'boxSizing'\n});\nvar sizing = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(width, maxWidth, minWidth, height, maxHeight, minHeight, boxSizing);\n/* harmony default export */ __webpack_exports__[\"default\"] = (sizing);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/sizing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/spacing.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/spacing.js ***!
-  \*********************************************************************/
-/*! exports provided: createUnarySpacing, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createUnarySpacing\", function() { return createUnarySpacing; });\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _responsivePropType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./responsivePropType */ \"./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js\");\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n/* harmony import */ var _memoize__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./memoize */ \"./jaas-client/node_modules/@material-ui/system/esm/memoize.js\");\n\n\n\n\n\nvar properties = {\n  m: 'margin',\n  p: 'padding'\n};\nvar directions = {\n  t: 'Top',\n  r: 'Right',\n  b: 'Bottom',\n  l: 'Left',\n  x: ['Left', 'Right'],\n  y: ['Top', 'Bottom']\n};\nvar aliases = {\n  marginX: 'mx',\n  marginY: 'my',\n  paddingX: 'px',\n  paddingY: 'py'\n}; // memoize() impact:\n// From 300,000 ops/sec\n// To 350,000 ops/sec\n\nvar getCssProperties = Object(_memoize__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(function (prop) {\n  // It's not a shorthand notation.\n  if (prop.length > 2) {\n    if (aliases[prop]) {\n      prop = aliases[prop];\n    } else {\n      return [prop];\n    }\n  }\n\n  var _prop$split = prop.split(''),\n      _prop$split2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_prop$split, 2),\n      a = _prop$split2[0],\n      b = _prop$split2[1];\n\n  var property = properties[a];\n  var direction = directions[b] || '';\n  return Array.isArray(direction) ? direction.map(function (dir) {\n    return property + dir;\n  }) : [property + direction];\n});\nvar spacingKeys = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'p', 'pt', 'pr', 'pb', 'pl', 'px', 'py', 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'marginX', 'marginY', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'paddingX', 'paddingY'];\nfunction createUnarySpacing(theme) {\n  var themeSpacing = theme.spacing || 8;\n\n  if (typeof themeSpacing === 'number') {\n    return function (abs) {\n      if (true) {\n        if (typeof abs !== 'number') {\n          console.error(\"Material-UI: Expected spacing argument to be a number, got \".concat(abs, \".\"));\n        }\n      }\n\n      return themeSpacing * abs;\n    };\n  }\n\n  if (Array.isArray(themeSpacing)) {\n    return function (abs) {\n      if (true) {\n        if (abs > themeSpacing.length - 1) {\n          console.error([\"Material-UI: The value provided (\".concat(abs, \") overflows.\"), \"The supported values are: \".concat(JSON.stringify(themeSpacing), \".\"), \"\".concat(abs, \" > \").concat(themeSpacing.length - 1, \", you need to add the missing values.\")].join('\\n'));\n        }\n      }\n\n      return themeSpacing[abs];\n    };\n  }\n\n  if (typeof themeSpacing === 'function') {\n    return themeSpacing;\n  }\n\n  if (true) {\n    console.error([\"Material-UI: The `theme.spacing` value (\".concat(themeSpacing, \") is invalid.\"), 'It should be a number, an array or a function.'].join('\\n'));\n  }\n\n  return function () {\n    return undefined;\n  };\n}\n\nfunction getValue(transformer, propValue) {\n  if (typeof propValue === 'string') {\n    return propValue;\n  }\n\n  var abs = Math.abs(propValue);\n  var transformed = transformer(abs);\n\n  if (propValue >= 0) {\n    return transformed;\n  }\n\n  if (typeof transformed === 'number') {\n    return -transformed;\n  }\n\n  return \"-\".concat(transformed);\n}\n\nfunction getStyleFromPropValue(cssProperties, transformer) {\n  return function (propValue) {\n    return cssProperties.reduce(function (acc, cssProperty) {\n      acc[cssProperty] = getValue(transformer, propValue);\n      return acc;\n    }, {});\n  };\n}\n\nfunction spacing(props) {\n  var theme = props.theme;\n  var transformer = createUnarySpacing(theme);\n  return Object.keys(props).map(function (prop) {\n    // Using a hash computation over an array iteration could be faster, but with only 28 items,\n    // it's doesn't worth the bundle size.\n    if (spacingKeys.indexOf(prop) === -1) {\n      return null;\n    }\n\n    var cssProperties = getCssProperties(prop);\n    var styleFromPropValue = getStyleFromPropValue(cssProperties, transformer);\n    var propValue = props[prop];\n    return Object(_breakpoints__WEBPACK_IMPORTED_MODULE_2__[\"handleBreakpoints\"])(props, propValue, styleFromPropValue);\n  }).reduce(_merge__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {});\n}\n\nspacing.propTypes =  true ? spacingKeys.reduce(function (obj, key) {\n  obj[key] = _responsivePropType__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n  return obj;\n}, {}) : undefined;\nspacing.filterProps = spacingKeys;\n/* harmony default export */ __webpack_exports__[\"default\"] = (spacing);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/spacing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/style.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/style.js ***!
-  \*******************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _responsivePropType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./responsivePropType */ \"./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js\");\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n\n\n\n\nfunction getPath(obj, path) {\n  if (!path || typeof path !== 'string') {\n    return null;\n  }\n\n  return path.split('.').reduce(function (acc, item) {\n    return acc && acc[item] ? acc[item] : null;\n  }, obj);\n}\n\nfunction style(options) {\n  var prop = options.prop,\n      _options$cssProperty = options.cssProperty,\n      cssProperty = _options$cssProperty === void 0 ? options.prop : _options$cssProperty,\n      themeKey = options.themeKey,\n      transform = options.transform;\n\n  var fn = function fn(props) {\n    if (props[prop] == null) {\n      return null;\n    }\n\n    var propValue = props[prop];\n    var theme = props.theme;\n    var themeMapping = getPath(theme, themeKey) || {};\n\n    var styleFromPropValue = function styleFromPropValue(propValueFinal) {\n      var value;\n\n      if (typeof themeMapping === 'function') {\n        value = themeMapping(propValueFinal);\n      } else if (Array.isArray(themeMapping)) {\n        value = themeMapping[propValueFinal] || propValueFinal;\n      } else {\n        value = getPath(themeMapping, propValueFinal) || propValueFinal;\n\n        if (transform) {\n          value = transform(value);\n        }\n      }\n\n      if (cssProperty === false) {\n        return value;\n      }\n\n      return Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, cssProperty, value);\n    };\n\n    return Object(_breakpoints__WEBPACK_IMPORTED_MODULE_2__[\"handleBreakpoints\"])(props, propValue, styleFromPropValue);\n  };\n\n  fn.propTypes =  true ? Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, prop, _responsivePropType__WEBPACK_IMPORTED_MODULE_1__[\"default\"]) : undefined;\n  fn.filterProps = [prop];\n  return fn;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (style);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/style.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/typography.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/typography.js ***!
-  \************************************************************************/
-/*! exports provided: fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontFamily\", function() { return fontFamily; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontSize\", function() { return fontSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontStyle\", function() { return fontStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontWeight\", function() { return fontWeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"letterSpacing\", function() { return letterSpacing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lineHeight\", function() { return lineHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"textAlign\", function() { return textAlign; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar fontFamily = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontFamily',\n  themeKey: 'typography'\n});\nvar fontSize = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontSize',\n  themeKey: 'typography'\n});\nvar fontStyle = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontStyle',\n  themeKey: 'typography'\n});\nvar fontWeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontWeight',\n  themeKey: 'typography'\n});\nvar letterSpacing = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'letterSpacing'\n});\nvar lineHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'lineHeight'\n});\nvar textAlign = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'textAlign'\n});\nvar typography = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign);\n/* harmony default export */ __webpack_exports__[\"default\"] = (typography);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/typography.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return HTMLElementType; });\nfunction HTMLElementType(props, propName, componentName, location, propFullName) {\n  if (false) {}\n\n  var propValue = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (propValue == null) {\n    return null;\n  }\n\n  if (propValue && propValue.nodeType !== 1) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an HTMLElement.\");\n  }\n\n  return null;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return chainPropTypes; });\nfunction chainPropTypes(propType1, propType2) {\n  if (false) {}\n\n  return function validate() {\n    return propType1.apply(void 0, arguments) || propType2.apply(void 0, arguments);\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js ***!
-  \**********************************************************************/
-/*! exports provided: isPlainObject, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isPlainObject\", function() { return isPlainObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return deepmerge; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n\n\nfunction isPlainObject(item) {\n  return item && Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(item) === 'object' && item.constructor === Object;\n}\nfunction deepmerge(target, source) {\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n    clone: true\n  };\n  var output = options.clone ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, target) : target;\n\n  if (isPlainObject(target) && isPlainObject(source)) {\n    Object.keys(source).forEach(function (key) {\n      // Avoid prototype pollution\n      if (key === '__proto__') {\n        return;\n      }\n\n      if (isPlainObject(source[key]) && key in target) {\n        output[key] = deepmerge(target[key], source[key], options);\n      } else {\n        output[key] = source[key];\n      }\n    });\n  }\n\n  return output;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n\n\n\nfunction isClassComponent(elementType) {\n  // elementType.prototype?.isReactComponent\n  var _elementType$prototyp = elementType.prototype,\n      prototype = _elementType$prototyp === void 0 ? {} : _elementType$prototyp;\n  return Boolean(prototype.isReactComponent);\n}\n\nfunction acceptingRef(props, propName, componentName, location, propFullName) {\n  var element = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (element == null) {\n    return null;\n  }\n\n  var warningHint;\n  var elementType = element.type;\n  /**\n   * Blacklisting instead of whitelisting\n   *\n   * Blacklisting will miss some components, such as React.Fragment. Those will at least\n   * trigger a warning in React.\n   * We can't whitelist because there is no safe way to detect React.forwardRef\n   * or class components. \"Safe\" means there's no public API.\n   *\n   */\n\n  if (typeof elementType === 'function' && !isClassComponent(elementType)) {\n    warningHint = 'Did you accidentally use a plain function component for an element instead?';\n  }\n\n  if (warningHint !== undefined) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an element that can hold a ref. \".concat(warningHint, \" \") + 'For more information see https://material-ui.com/r/caveat-with-refs-guide');\n  }\n\n  return null;\n}\n\nvar elementAcceptingRef = Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element, acceptingRef);\nelementAcceptingRef.isRequired = Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element.isRequired, acceptingRef);\n/* harmony default export */ __webpack_exports__[\"default\"] = (elementAcceptingRef);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n\n\n\nfunction isClassComponent(elementType) {\n  // elementType.prototype?.isReactComponent\n  var _elementType$prototyp = elementType.prototype,\n      prototype = _elementType$prototyp === void 0 ? {} : _elementType$prototyp;\n  return Boolean(prototype.isReactComponent);\n}\n\nfunction elementTypeAcceptingRef(props, propName, componentName, location, propFullName) {\n  var propValue = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (propValue == null) {\n    return null;\n  }\n\n  var warningHint;\n  /**\n   * Blacklisting instead of whitelisting\n   *\n   * Blacklisting will miss some components, such as React.Fragment. Those will at least\n   * trigger a warning in React.\n   * We can't whitelist because there is no safe way to detect React.forwardRef\n   * or class components. \"Safe\" means there's no public API.\n   *\n   */\n\n  if (typeof propValue === 'function' && !isClassComponent(propValue)) {\n    warningHint = 'Did you accidentally provide a plain function component instead?';\n  }\n\n  if (warningHint !== undefined) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an element type that can hold a ref. \".concat(warningHint, \" \") + 'For more information see https://material-ui.com/r/caveat-with-refs-guide');\n  }\n\n  return null;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0__[\"elementType\"], elementTypeAcceptingRef));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js ***!
-  \**********************************************************************/
-/*! exports provided: specialProperty, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"specialProperty\", function() { return specialProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return exactProp; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n\n\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n// Only exported for test purposes.\nvar specialProperty = \"exact-prop: \\u200B\";\nfunction exactProp(propTypes) {\n  if (false) {}\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, propTypes, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, specialProperty, function (props) {\n    var unsupportedProps = Object.keys(props).filter(function (prop) {\n      return !propTypes.hasOwnProperty(prop);\n    });\n\n    if (unsupportedProps.length > 0) {\n      return new Error(\"The following props are not supported: \".concat(unsupportedProps.map(function (prop) {\n        return \"`\".concat(prop, \"`\");\n      }).join(', '), \". Please remove them.\"));\n    }\n\n    return null;\n  }));\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return formatMuiErrorMessage; });\n/**\n * WARNING: Don't import this directly.\n * Use `MuiError` from `@material-ui/utils/macros/MuiError.macro` instead.\n * @param {number} code\n */\nfunction formatMuiErrorMessage(code) {\n  // Apply babel-plugin-transform-template-literals in loose mode\n  // loose mode is safe iff we're concatenating primitives\n  // see https://babeljs.io/docs/en/babel-plugin-transform-template-literals#loose\n\n  /* eslint-disable prefer-template */\n  var url = 'https://material-ui.com/production-error/?code=' + code;\n\n  for (var i = 1; i < arguments.length; i += 1) {\n    // rest params over-transpile for this case\n    // eslint-disable-next-line prefer-rest-params\n    url += '&args[]=' + encodeURIComponent(arguments[i]);\n  }\n\n  return 'Minified Material-UI error #' + code + '; visit ' + url + ' for the full message.';\n  /* eslint-enable prefer-template */\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js ***!
-  \***************************************************************************/
-/*! exports provided: getFunctionName, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFunctionName\", function() { return getFunctionName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getDisplayName; });\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_1__);\n\n // Simplified polyfill for IE 11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\n\nvar fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\nfunction getFunctionName(fn) {\n  var match = \"\".concat(fn).match(fnNameMatchRegex);\n  var name = match && match[1];\n  return name || '';\n}\n/**\n * @param {function} Component\n * @param {string} fallback\n * @returns {string | undefined}\n */\n\nfunction getFunctionComponentName(Component) {\n  var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  return Component.displayName || Component.name || getFunctionName(Component) || fallback;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = getFunctionComponentName(innerType);\n  return outerType.displayName || (functionName !== '' ? \"\".concat(wrapperName, \"(\").concat(functionName, \")\") : wrapperName);\n}\n/**\n * cherry-pick from\n * https://github.com/facebook/react/blob/769b1f270e1251d9dbdce0fcbd9e92e502d059b8/packages/shared/getComponentName.js\n * originally forked from recompose/getDisplayName with added IE 11 support\n *\n * @param {React.ReactType} Component\n * @returns {string | undefined}\n */\n\n\nfunction getDisplayName(Component) {\n  if (Component == null) {\n    return undefined;\n  }\n\n  if (typeof Component === 'string') {\n    return Component;\n  }\n\n  if (typeof Component === 'function') {\n    return getFunctionComponentName(Component, 'Component');\n  }\n\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Component) === 'object') {\n    switch (Component.$$typeof) {\n      case react_is__WEBPACK_IMPORTED_MODULE_1__[\"ForwardRef\"]:\n        return getWrappedName(Component, Component.render, 'ForwardRef');\n\n      case react_is__WEBPACK_IMPORTED_MODULE_1__[\"Memo\"]:\n        return getWrappedName(Component, Component.type, 'memo');\n\n      default:\n        return undefined;\n    }\n  }\n\n  return undefined;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/index.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/index.js ***!
-  \******************************************************************/
-/*! exports provided: chainPropTypes, deepmerge, elementAcceptingRef, elementTypeAcceptingRef, exactProp, formatMuiErrorMessage, getDisplayName, HTMLElementType, ponyfillGlobal, refType */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chainPropTypes\", function() { return _chainPropTypes__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _deepmerge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deepmerge */ \"./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deepmerge\", function() { return _deepmerge__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _elementAcceptingRef__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./elementAcceptingRef */ \"./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"elementAcceptingRef\", function() { return _elementAcceptingRef__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _elementTypeAcceptingRef__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./elementTypeAcceptingRef */ \"./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"elementTypeAcceptingRef\", function() { return _elementTypeAcceptingRef__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _exactProp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./exactProp */ \"./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"exactProp\", function() { return _exactProp__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _formatMuiErrorMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./formatMuiErrorMessage */ \"./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"formatMuiErrorMessage\", function() { return _formatMuiErrorMessage__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _getDisplayName__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getDisplayName */ \"./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"getDisplayName\", function() { return _getDisplayName__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _HTMLElementType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./HTMLElementType */ \"./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"HTMLElementType\", function() { return _HTMLElementType__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _ponyfillGlobal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ponyfillGlobal */ \"./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ponyfillGlobal\", function() { return _ponyfillGlobal__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _refType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./refType */ \"./jaas-client/node_modules/@material-ui/utils/esm/refType.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"refType\", function() { return _refType__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/** @license Material-UI v4.10.2\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n/* harmony default export */ __webpack_exports__[\"default\"] = (typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')());\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/refType.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/refType.js ***!
-  \********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar refType = prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (refType);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/refType.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/after/index.js":
-/*!*************************************************!*\
-  !*** ./jaas-client/node_modules/after/index.js ***!
-  \*************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/after/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/arraybuffer.slice/index.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/arraybuffer.slice/index.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/arraybuffer.slice/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/backo2/index.js":
-/*!**************************************************!*\
-  !*** ./jaas-client/node_modules/backo2/index.js ***!
-  \**************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/backo2/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js ***!
-  \*******************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(){\n  \"use strict\";\n\n  var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n  // Use a lookup table to find the index.\n  var lookup = new Uint8Array(256);\n  for (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n  }\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = lookup[base64.charCodeAt(i)];\n      encoded2 = lookup[base64.charCodeAt(i+1)];\n      encoded3 = lookup[base64.charCodeAt(i+2)];\n      encoded4 = lookup[base64.charCodeAt(i+3)];\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})();\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/blob/index.js":
-/*!************************************************!*\
-  !*** ./jaas-client/node_modules/blob/index.js ***!
-  \************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\r\n * Create a blob builder even when vendor prefixes exist\r\n */\r\n\r\nvar BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\r\n  typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :\r\n  typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\r\n  typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : \r\n  false;\r\n\r\n/**\r\n * Check if Blob constructor is supported\r\n */\r\n\r\nvar blobSupported = (function() {\r\n  try {\r\n    var a = new Blob(['hi']);\r\n    return a.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if Blob constructor supports ArrayBufferViews\r\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\r\n */\r\n\r\nvar blobSupportsArrayBufferView = blobSupported && (function() {\r\n  try {\r\n    var b = new Blob([new Uint8Array([1,2])]);\r\n    return b.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if BlobBuilder is supported\r\n */\r\n\r\nvar blobBuilderSupported = BlobBuilder\r\n  && BlobBuilder.prototype.append\r\n  && BlobBuilder.prototype.getBlob;\r\n\r\n/**\r\n * Helper function that maps ArrayBufferViews to ArrayBuffers\r\n * Used by BlobBuilder constructor and old browsers that didn't\r\n * support it in the Blob constructor.\r\n */\r\n\r\nfunction mapArrayBufferViews(ary) {\r\n  return ary.map(function(chunk) {\r\n    if (chunk.buffer instanceof ArrayBuffer) {\r\n      var buf = chunk.buffer;\r\n\r\n      // if this is a subarray, make a copy so we only\r\n      // include the subarray region from the underlying buffer\r\n      if (chunk.byteLength !== buf.byteLength) {\r\n        var copy = new Uint8Array(chunk.byteLength);\r\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\r\n        buf = copy.buffer;\r\n      }\r\n\r\n      return buf;\r\n    }\r\n\r\n    return chunk;\r\n  });\r\n}\r\n\r\nfunction BlobBuilderConstructor(ary, options) {\r\n  options = options || {};\r\n\r\n  var bb = new BlobBuilder();\r\n  mapArrayBufferViews(ary).forEach(function(part) {\r\n    bb.append(part);\r\n  });\r\n\r\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\r\n};\r\n\r\nfunction BlobConstructor(ary, options) {\r\n  return new Blob(mapArrayBufferViews(ary), options || {});\r\n};\r\n\r\nif (typeof Blob !== 'undefined') {\r\n  BlobBuilderConstructor.prototype = Blob.prototype;\r\n  BlobConstructor.prototype = Blob.prototype;\r\n}\r\n\r\nmodule.exports = (function() {\r\n  if (blobSupported) {\r\n    return blobSupportsArrayBufferView ? Blob : BlobConstructor;\r\n  } else if (blobBuilderSupported) {\r\n    return BlobBuilderConstructor;\r\n  } else {\r\n    return undefined;\r\n  }\r\n})();\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/blob/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/clsx/dist/clsx.m.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/clsx/dist/clsx.m.js ***!
-  \******************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nfunction toVal(mix) {\n\tvar k, y, str='';\n\n\tif (typeof mix === 'string' || typeof mix === 'number') {\n\t\tstr += mix;\n\t} else if (typeof mix === 'object') {\n\t\tif (Array.isArray(mix)) {\n\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tif (y = toVal(mix[k])) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (k in mix) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\tstr += k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn str;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (function () {\n\tvar i=0, tmp, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (tmp = arguments[i++]) {\n\t\t\tif (x = toVal(tmp)) {\n\t\t\t\tstr && (str += ' ');\n\t\t\t\tstr += x\n\t\t\t}\n\t\t}\n\t}\n\treturn str;\n});\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/clsx/dist/clsx.m.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/component-bind/index.js":
-/*!**********************************************************!*\
-  !*** ./jaas-client/node_modules/component-bind/index.js ***!
-  \**********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-bind/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/component-emitter/index.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/component-emitter/index.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n\r\n  // Remove event specific arrays for event types that no\r\n  // one is subscribed for to avoid memory leak.\r\n  if (callbacks.length === 0) {\r\n    delete this._callbacks['$' + event];\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  var args = new Array(arguments.length - 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  for (var i = 1; i < arguments.length; i++) {\r\n    args[i - 1] = arguments[i];\r\n  }\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-emitter/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/component-inherit/index.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/component-inherit/index.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-inherit/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js ***!
-  \********************************************************************/
-/*! exports provided: prefix, supportedKeyframes, supportedProperty, supportedValue */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"prefix\", function() { return prefix; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedKeyframes\", function() { return supportedKeyframes; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedProperty\", function() { return supportedProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedValue\", function() { return supportedValue; });\n/* harmony import */ var is_in_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! is-in-browser */ \"./jaas-client/node_modules/is-in-browser/dist/module.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n\n\n\n// Export javascript style and css style vendor prefixes.\nvar js = '';\nvar css = '';\nvar vendor = '';\nvar browser = '';\nvar isTouch = is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"] && 'ontouchstart' in document.documentElement; // We should not do anything if required serverside.\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n  // Order matters. We need to check Webkit the last one because\n  // other vendors use to add Webkit prefixes to some properties\n  var jsCssMap = {\n    Moz: '-moz-',\n    ms: '-ms-',\n    O: '-o-',\n    Webkit: '-webkit-'\n  };\n\n  var _document$createEleme = document.createElement('p'),\n      style = _document$createEleme.style;\n\n  var testProp = 'Transform';\n\n  for (var key in jsCssMap) {\n    if (key + testProp in style) {\n      js = key;\n      css = jsCssMap[key];\n      break;\n    }\n  } // Correctly detect the Edge browser.\n\n\n  if (js === 'Webkit' && 'msHyphens' in style) {\n    js = 'ms';\n    css = jsCssMap.ms;\n    browser = 'edge';\n  } // Correctly detect the Safari browser.\n\n\n  if (js === 'Webkit' && '-apple-trailing-word' in style) {\n    vendor = 'apple';\n  }\n}\n/**\n * Vendor prefix string for the current browser.\n *\n * @type {{js: String, css: String, vendor: String, browser: String}}\n * @api public\n */\n\n\nvar prefix = {\n  js: js,\n  css: css,\n  vendor: vendor,\n  browser: browser,\n  isTouch: isTouch\n};\n\n/**\n * Test if a keyframe at-rule should be prefixed or not\n *\n * @param {String} vendor prefix string for the current browser.\n * @return {String}\n * @api public\n */\n\nfunction supportedKeyframes(key) {\n  // Keyframes is already prefixed. e.g. key = '@-webkit-keyframes a'\n  if (key[1] === '-') return key; // No need to prefix IE/Edge. Older browsers will ignore unsupported rules.\n  // https://caniuse.com/#search=keyframes\n\n  if (prefix.js === 'ms') return key;\n  return \"@\" + prefix.css + \"keyframes\" + key.substr(10);\n}\n\n// https://caniuse.com/#search=appearance\n\nvar appearence = {\n  noPrefill: ['appearance'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'appearance') return false;\n    if (prefix.js === 'ms') return \"-webkit-\" + prop;\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=color-adjust\n\nvar colorAdjust = {\n  noPrefill: ['color-adjust'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'color-adjust') return false;\n    if (prefix.js === 'Webkit') return prefix.css + \"print-\" + prop;\n    return prop;\n  }\n};\n\nvar regExp = /[-\\s]+(.)?/g;\n/**\n * Replaces the letter with the capital letter\n *\n * @param {String} match\n * @param {String} c\n * @return {String}\n * @api private\n */\n\nfunction toUpper(match, c) {\n  return c ? c.toUpperCase() : '';\n}\n/**\n * Convert dash separated strings to camel-cased.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\n\nfunction camelize(str) {\n  return str.replace(regExp, toUpper);\n}\n\n/**\n * Convert dash separated strings to pascal cased.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction pascalize(str) {\n  return camelize(\"-\" + str);\n}\n\n// but we can use a longhand property instead.\n// https://caniuse.com/#search=mask\n\nvar mask = {\n  noPrefill: ['mask'],\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^mask/.test(prop)) return false;\n\n    if (prefix.js === 'Webkit') {\n      var longhand = 'mask-image';\n\n      if (camelize(longhand) in style) {\n        return prop;\n      }\n\n      if (prefix.js + pascalize(longhand) in style) {\n        return prefix.css + prop;\n      }\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=text-orientation\n\nvar textOrientation = {\n  noPrefill: ['text-orientation'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'text-orientation') return false;\n\n    if (prefix.vendor === 'apple' && !prefix.isTouch) {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=transform\n\nvar transform = {\n  noPrefill: ['transform'],\n  supportedProperty: function supportedProperty(prop, style, options) {\n    if (prop !== 'transform') return false;\n\n    if (options.transform) {\n      return prop;\n    }\n\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=transition\n\nvar transition = {\n  noPrefill: ['transition'],\n  supportedProperty: function supportedProperty(prop, style, options) {\n    if (prop !== 'transition') return false;\n\n    if (options.transition) {\n      return prop;\n    }\n\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=writing-mode\n\nvar writingMode = {\n  noPrefill: ['writing-mode'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'writing-mode') return false;\n\n    if (prefix.js === 'Webkit' || prefix.js === 'ms' && prefix.browser !== 'edge') {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=user-select\n\nvar userSelect = {\n  noPrefill: ['user-select'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'user-select') return false;\n\n    if (prefix.js === 'Moz' || prefix.js === 'ms' || prefix.vendor === 'apple') {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=multicolumn\n// https://github.com/postcss/autoprefixer/issues/491\n// https://github.com/postcss/autoprefixer/issues/177\n\nvar breakPropsOld = {\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^break-/.test(prop)) return false;\n\n    if (prefix.js === 'Webkit') {\n      var jsProp = \"WebkitColumn\" + pascalize(prop);\n      return jsProp in style ? prefix.css + \"column-\" + prop : false;\n    }\n\n    if (prefix.js === 'Moz') {\n      var _jsProp = \"page\" + pascalize(prop);\n\n      return _jsProp in style ? \"page-\" + prop : false;\n    }\n\n    return false;\n  }\n};\n\n// See https://github.com/postcss/autoprefixer/issues/324.\n\nvar inlineLogicalOld = {\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^(border|margin|padding)-inline/.test(prop)) return false;\n    if (prefix.js === 'Moz') return prop;\n    var newProp = prop.replace('-inline', '');\n    return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n  }\n};\n\n// Camelization is required because we can't test using.\n// CSS syntax for e.g. in FF.\n\nvar unprefixed = {\n  supportedProperty: function supportedProperty(prop, style) {\n    return camelize(prop) in style ? prop : false;\n  }\n};\n\nvar prefixed = {\n  supportedProperty: function supportedProperty(prop, style) {\n    var pascalized = pascalize(prop); // Return custom CSS variable without prefixing.\n\n    if (prop[0] === '-') return prop; // Return already prefixed value without prefixing.\n\n    if (prop[0] === '-' && prop[1] === '-') return prop;\n    if (prefix.js + pascalized in style) return prefix.css + prop; // Try webkit fallback.\n\n    if (prefix.js !== 'Webkit' && \"Webkit\" + pascalized in style) return \"-webkit-\" + prop;\n    return false;\n  }\n};\n\n// https://caniuse.com/#search=scroll-snap\n\nvar scrollSnap = {\n  supportedProperty: function supportedProperty(prop) {\n    if (prop.substring(0, 11) !== 'scroll-snap') return false;\n\n    if (prefix.js === 'ms') {\n      return \"\" + prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=overscroll-behavior\n\nvar overscrollBehavior = {\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'overscroll-behavior') return false;\n\n    if (prefix.js === 'ms') {\n      return prefix.css + \"scroll-chaining\";\n    }\n\n    return prop;\n  }\n};\n\nvar propMap = {\n  'flex-grow': 'flex-positive',\n  'flex-shrink': 'flex-negative',\n  'flex-basis': 'flex-preferred-size',\n  'justify-content': 'flex-pack',\n  order: 'flex-order',\n  'align-items': 'flex-align',\n  'align-content': 'flex-line-pack' // 'align-self' is handled by 'align-self' plugin.\n\n}; // Support old flex spec from 2012.\n\nvar flex2012 = {\n  supportedProperty: function supportedProperty(prop, style) {\n    var newProp = propMap[prop];\n    if (!newProp) return false;\n    return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n  }\n};\n\nvar propMap$1 = {\n  flex: 'box-flex',\n  'flex-grow': 'box-flex',\n  'flex-direction': ['box-orient', 'box-direction'],\n  order: 'box-ordinal-group',\n  'align-items': 'box-align',\n  'flex-flow': ['box-orient', 'box-direction'],\n  'justify-content': 'box-pack'\n};\nvar propKeys = Object.keys(propMap$1);\n\nvar prefixCss = function prefixCss(p) {\n  return prefix.css + p;\n}; // Support old flex spec from 2009.\n\n\nvar flex2009 = {\n  supportedProperty: function supportedProperty(prop, style, _ref) {\n    var multiple = _ref.multiple;\n\n    if (propKeys.indexOf(prop) > -1) {\n      var newProp = propMap$1[prop];\n\n      if (!Array.isArray(newProp)) {\n        return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n      }\n\n      if (!multiple) return false;\n\n      for (var i = 0; i < newProp.length; i++) {\n        if (!(prefix.js + pascalize(newProp[0]) in style)) {\n          return false;\n        }\n      }\n\n      return newProp.map(prefixCss);\n    }\n\n    return false;\n  }\n};\n\n// plugins = [\n//   ...plugins,\n//    breakPropsOld,\n//    inlineLogicalOld,\n//    unprefixed,\n//    prefixed,\n//    scrollSnap,\n//    flex2012,\n//    flex2009\n// ]\n// Plugins without 'noPrefill' value, going last.\n// 'flex-*' plugins should be at the bottom.\n// 'flex2009' going after 'flex2012'.\n// 'prefixed' going after 'unprefixed'\n\nvar plugins = [appearence, colorAdjust, mask, textOrientation, transform, transition, writingMode, userSelect, breakPropsOld, inlineLogicalOld, unprefixed, prefixed, scrollSnap, overscrollBehavior, flex2012, flex2009];\nvar propertyDetectors = plugins.filter(function (p) {\n  return p.supportedProperty;\n}).map(function (p) {\n  return p.supportedProperty;\n});\nvar noPrefill = plugins.filter(function (p) {\n  return p.noPrefill;\n}).reduce(function (a, p) {\n  a.push.apply(a, Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(p.noPrefill));\n  return a;\n}, []);\n\nvar el;\nvar cache = {};\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n  el = document.createElement('p'); // We test every property on vendor prefix requirement.\n  // Once tested, result is cached. It gives us up to 70% perf boost.\n  // http://jsperf.com/element-style-object-access-vs-plain-object\n  //\n  // Prefill cache with known css properties to reduce amount of\n  // properties we need to feature test at runtime.\n  // http://davidwalsh.name/vendor-prefix\n\n  var computed = window.getComputedStyle(document.documentElement, '');\n\n  for (var key$1 in computed) {\n    // eslint-disable-next-line no-restricted-globals\n    if (!isNaN(key$1)) cache[computed[key$1]] = computed[key$1];\n  } // Properties that cannot be correctly detected using the\n  // cache prefill method.\n\n\n  noPrefill.forEach(function (x) {\n    return delete cache[x];\n  });\n}\n/**\n * Test if a property is supported, returns supported property with vendor\n * prefix if required. Returns `false` if not supported.\n *\n * @param {String} prop dash separated\n * @param {Object} [options]\n * @return {String|Boolean}\n * @api public\n */\n\n\nfunction supportedProperty(prop, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  // For server-side rendering.\n  if (!el) return prop; // Remove cache for benchmark tests or return property from the cache.\n\n  if ( true && cache[prop] != null) {\n    return cache[prop];\n  } // Check if 'transition' or 'transform' natively supported in browser.\n\n\n  if (prop === 'transition' || prop === 'transform') {\n    options[prop] = prop in el.style;\n  } // Find a plugin for current prefix property.\n\n\n  for (var i = 0; i < propertyDetectors.length; i++) {\n    cache[prop] = propertyDetectors[i](prop, el.style, options); // Break loop, if value found.\n\n    if (cache[prop]) break;\n  } // Reset styles for current property.\n  // Firefox can even throw an error for invalid properties, e.g., \"0\".\n\n\n  try {\n    el.style[prop] = '';\n  } catch (err) {\n    return false;\n  }\n\n  return cache[prop];\n}\n\nvar cache$1 = {};\nvar transitionProperties = {\n  transition: 1,\n  'transition-property': 1,\n  '-webkit-transition': 1,\n  '-webkit-transition-property': 1\n};\nvar transPropsRegExp = /(^\\s*[\\w-]+)|, (\\s*[\\w-]+)(?![^()]*\\))/g;\nvar el$1;\n/**\n * Returns prefixed value transition/transform if needed.\n *\n * @param {String} match\n * @param {String} p1\n * @param {String} p2\n * @return {String}\n * @api private\n */\n\nfunction prefixTransitionCallback(match, p1, p2) {\n  if (p1 === 'var') return 'var';\n  if (p1 === 'all') return 'all';\n  if (p2 === 'all') return ', all';\n  var prefixedValue = p1 ? supportedProperty(p1) : \", \" + supportedProperty(p2);\n  if (!prefixedValue) return p1 || p2;\n  return prefixedValue;\n}\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) el$1 = document.createElement('p');\n/**\n * Returns prefixed value if needed. Returns `false` if value is not supported.\n *\n * @param {String} property\n * @param {String} value\n * @return {String|Boolean}\n * @api public\n */\n\nfunction supportedValue(property, value) {\n  // For server-side rendering.\n  var prefixedValue = value;\n  if (!el$1 || property === 'content') return value; // It is a string or a number as a string like '1'.\n  // We want only prefixable values here.\n  // eslint-disable-next-line no-restricted-globals\n\n  if (typeof prefixedValue !== 'string' || !isNaN(parseInt(prefixedValue, 10))) {\n    return prefixedValue;\n  } // Create cache key for current value.\n\n\n  var cacheKey = property + prefixedValue; // Remove cache for benchmark tests or return value from cache.\n\n  if ( true && cache$1[cacheKey] != null) {\n    return cache$1[cacheKey];\n  } // IE can even throw an error in some cases, for e.g. style.content = 'bar'.\n\n\n  try {\n    // Test value as it is.\n    el$1.style[property] = prefixedValue;\n  } catch (err) {\n    // Return false if value not supported.\n    cache$1[cacheKey] = false;\n    return false;\n  } // If 'transition' or 'transition-property' property.\n\n\n  if (transitionProperties[property]) {\n    prefixedValue = prefixedValue.replace(transPropsRegExp, prefixTransitionCallback);\n  } else if (el$1.style[property] === '') {\n    // Value with a vendor prefix.\n    prefixedValue = prefix.css + prefixedValue; // Hardcode test to convert \"flex\" to \"-ms-flexbox\" for IE10.\n\n    if (prefixedValue === '-ms-flex') el$1.style[property] = '-ms-flexbox'; // Test prefixed value.\n\n    el$1.style[property] = prefixedValue; // Return false if value not supported.\n\n    if (el$1.style[property] === '') {\n      cache$1[cacheKey] = false;\n      return false;\n    }\n  } // Reset styles for current property.\n\n\n  el$1.style[property] = ''; // Write current value to cache.\n\n  cache$1[cacheKey] = prefixedValue;\n  return cache$1[cacheKey];\n}\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/debug/src/browser.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/node_modules/debug/src/browser.js ***!
-  \*******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(process) {/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\nfunction log(...args) {\n\t// This hackery is required for IE8/9, where\n\t// the `console.log` function doesn't have 'apply'\n\treturn typeof console === 'object' &&\n\t\tconsole.log &&\n\t\tconsole.log(...args);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = __webpack_require__(/*! ./common */ \"./jaas-client/node_modules/debug/src/common.js\")(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/debug/src/browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/debug/src/common.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/debug/src/common.js ***!
-  \******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = __webpack_require__(/*! ms */ \"./jaas-client/node_modules/ms/index.js\");\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* Active `debug` instances.\n\t*/\n\tcreateDebug.instances = [];\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.enabled = createDebug.enabled(namespace);\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = selectColor(namespace);\n\t\tdebug.destroy = destroy;\n\t\tdebug.extend = extend;\n\t\t// Debug.formatArgs = formatArgs;\n\t\t// debug.rawLog = rawLog;\n\n\t\t// env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\tcreateDebug.instances.push(debug);\n\n\t\treturn debug;\n\t}\n\n\tfunction destroy() {\n\t\tconst index = createDebug.instances.indexOf(this);\n\t\tif (index !== -1) {\n\t\t\tcreateDebug.instances.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < createDebug.instances.length; i++) {\n\t\t\tconst instance = createDebug.instances[i];\n\t\t\tinstance.enabled = createDebug.enabled(instance.namespace);\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/debug/src/common.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/dom-helpers/esm/addClass.js":
-/*!**************************************************************!*\
-  !*** ./jaas-client/node_modules/dom-helpers/esm/addClass.js ***!
-  \**************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return addClass; });\n/* harmony import */ var _hasClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hasClass */ \"./jaas-client/node_modules/dom-helpers/esm/hasClass.js\");\n\nfunction addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!Object(_hasClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/addClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/dom-helpers/esm/hasClass.js":
-/*!**************************************************************!*\
-  !*** ./jaas-client/node_modules/dom-helpers/esm/hasClass.js ***!
-  \**************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return hasClass; });\nfunction hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);\n  return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/hasClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/dom-helpers/esm/removeClass.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/dom-helpers/esm/removeClass.js ***!
-  \*****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return removeClass; });\nfunction replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nfunction removeClass(element, className) {\n  if (element.classList) {\n    element.classList.remove(className);\n  } else if (typeof element.className === 'string') {\n    ;\n    element.className = replaceClassName(element.className, className);\n  } else {\n    element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/removeClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js ***!
-  \*****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = (function () {\n  if (typeof self !== 'undefined') {\n    return self;\n  } else if (typeof window !== 'undefined') {\n    return window;\n  } else {\n    return Function('return this')(); // eslint-disable-line no-new-func\n  }\n})();\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/index.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/index.js ***!
-  \****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\nmodule.exports = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/engine.io-client/lib/socket.js\");\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/socket.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/socket.js ***!
-  \*****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar transports = __webpack_require__(/*! ./transports/index */ \"./jaas-client/node_modules/engine.io-client/lib/transports/index.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:socket');\nvar index = __webpack_require__(/*! indexof */ \"./jaas-client/node_modules/indexof/index.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar parseuri = __webpack_require__(/*! parseuri */ \"./jaas-client/node_modules/parseuri/index.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket (uri, opts) {\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' === typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.hostname = uri.host;\n    opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  } else if (opts.host) {\n    opts.hostname = parseuri(opts.host).host;\n  }\n\n  this.secure = null != opts.secure ? opts.secure\n    : (typeof location !== 'undefined' && 'https:' === location.protocol);\n\n  if (opts.hostname && !opts.port) {\n    // if no port is specified manually, use the protocol default\n    opts.port = this.secure ? '443' : '80';\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (typeof location !== 'undefined' ? location.hostname : 'localhost');\n  this.port = opts.port || (typeof location !== 'undefined' && location.port\n      ? location.port\n      : (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' === typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.withCredentials = false !== opts.withCredentials;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.transportOptions = opts.transportOptions || {};\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.prevBufferLen = 0;\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n  this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\n  if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n  if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n    this.perMessageDeflate.threshold = 1024;\n  }\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized;\n  this.forceNode = !!opts.forceNode;\n\n  // detect ReactNative environment\n  this.isReactNative = (typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative');\n\n  // other options for Node.js or ReactNative client\n  if (typeof self === 'undefined' || this.isReactNative) {\n    if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n      this.extraHeaders = opts.extraHeaders;\n    }\n\n    if (opts.localAddress) {\n      this.localAddress = opts.localAddress;\n    }\n  }\n\n  // set on handshake\n  this.id = null;\n  this.upgrades = null;\n  this.pingInterval = null;\n  this.pingTimeout = null;\n\n  // set on heartbeat\n  this.pingIntervalTimer = null;\n  this.pingTimeoutTimer = null;\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = __webpack_require__(/*! ./transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nSocket.transports = __webpack_require__(/*! ./transports/index */ \"./jaas-client/node_modules/engine.io-client/lib/transports/index.js\");\nSocket.parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // per-transport options\n  var options = this.transportOptions[name] || {};\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    query: query,\n    socket: this,\n    agent: options.agent || this.agent,\n    hostname: options.hostname || this.hostname,\n    port: options.port || this.port,\n    secure: options.secure || this.secure,\n    path: options.path || this.path,\n    forceJSONP: options.forceJSONP || this.forceJSONP,\n    jsonp: options.jsonp || this.jsonp,\n    forceBase64: options.forceBase64 || this.forceBase64,\n    enablesXDR: options.enablesXDR || this.enablesXDR,\n    withCredentials: options.withCredentials || this.withCredentials,\n    timestampRequests: options.timestampRequests || this.timestampRequests,\n    timestampParam: options.timestampParam || this.timestampParam,\n    policyPort: options.policyPort || this.policyPort,\n    pfx: options.pfx || this.pfx,\n    key: options.key || this.key,\n    passphrase: options.passphrase || this.passphrase,\n    cert: options.cert || this.cert,\n    ca: options.ca || this.ca,\n    ciphers: options.ciphers || this.ciphers,\n    rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,\n    perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,\n    extraHeaders: options.extraHeaders || this.extraHeaders,\n    forceNode: options.forceNode || this.forceNode,\n    localAddress: options.localAddress || this.localAddress,\n    requestTimeout: options.requestTimeout || this.requestTimeout,\n    protocols: options.protocols || void (0),\n    isReactNative: this.isReactNative\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {\n    transport = 'websocket';\n  } else if (0 === this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function () {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function (transport) {\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function () {\n    self.onDrain();\n  })\n  .on('packet', function (packet) {\n    self.onPacket(packet);\n  })\n  .on('error', function (e) {\n    self.onError(e);\n  })\n  .on('close', function () {\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 });\n  var failed = false;\n  var self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen () {\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' === msg.type && 'probe' === msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' === transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' === self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport () {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  // Handle any error that happens while probing\n  function onerror (err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose () {\n    onerror('transport closed');\n  }\n\n  // When the socket is closed while we're probing\n  function onclose () {\n    onerror('socket closed');\n  }\n\n  // When the socket is upgraded while we're probing\n  function onupgrade (to) {\n    if (transport && to.name !== transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  // Remove all listeners on the transport and on self\n  function cleanup () {\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' === this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' === this.readyState || 'open' === this.readyState ||\n      'closing' === this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(JSON.parse(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        this.emit('pong');\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.onError(err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if ('closed' === this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' === self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api private\n*/\n\nSocket.prototype.ping = function () {\n  var self = this;\n  this.sendPacket('ping', function () {\n    self.emit('ping');\n  });\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function () {\n  this.writeBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (0 === this.writeBuffer.length) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' !== this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @param {Object} options.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, options, fn) {\n  this.sendPacket('message', msg, options, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, options, fn) {\n  if ('function' === typeof data) {\n    fn = data;\n    data = undefined;\n  }\n\n  if ('function' === typeof options) {\n    fn = options;\n    options = null;\n  }\n\n  if ('closing' === this.readyState || 'closed' === this.readyState) {\n    return;\n  }\n\n  options = options || {};\n  options.compress = false !== options.compress;\n\n  var packet = {\n    type: type,\n    data: data,\n    options: options\n  };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  if (fn) this.once('flush', fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function () {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  function close () {\n    self.onClose('forced close');\n    debug('socket closing - telling transport to close');\n    self.transport.close();\n  }\n\n  function cleanupAndClose () {\n    self.removeListener('upgrade', cleanupAndClose);\n    self.removeListener('upgradeError', cleanupAndClose);\n    close();\n  }\n\n  function waitForUpgrade () {\n    // wait for upgrade to finish since we can't send packets while pausing a transport\n    self.once('upgrade', cleanupAndClose);\n    self.once('upgradeError', cleanupAndClose);\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n\n    // clean buffers after, so users can still\n    // grab the buffers on `close` event\n    self.writeBuffer = [];\n    self.prevBufferLen = 0;\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i < j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/socket.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transport.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transport.js ***!
-  \********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n  this.withCredentials = opts.withCredentials;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n  this.forceNode = opts.forceNode;\n\n  // results of ReactNative environment detection\n  this.isReactNative = opts.isReactNative;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n  this.localAddress = opts.localAddress;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' === this.readyState || '' === this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function (packets) {\n  if ('open' === this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function (data) {\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transport.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/index.js ***!
-  \***************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\nvar XHR = __webpack_require__(/*! ./polling-xhr */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js\");\nvar JSONP = __webpack_require__(/*! ./polling-jsonp */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js\");\nvar websocket = __webpack_require__(/*! ./websocket */ \"./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js\");\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling (opts) {\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname !== location.hostname || port !== opts.port;\n    xs = opts.secure !== isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js ***!
-  \***********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module requirements.\n */\n\nvar Polling = __webpack_require__(/*! ./polling */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar globalThis = __webpack_require__(/*! ../globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    callbacks = globalThis.___eio = (globalThis.___eio || []);\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (typeof addEventListener === 'function') {\n    addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function (e) {\n    self.onError('jsonp poll error', e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  if (insertAt) {\n    insertAt.parentNode.insertBefore(script, insertAt);\n  } else {\n    (document.head || document.body).appendChild(script);\n  }\n  this.script = script;\n\n  var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"' + self.iframeId + '\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch (e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function () {\n      if (self.iframe.readyState === 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js ***!
-  \*********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* global attachEvent */\n\n/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\nvar Polling = __webpack_require__(/*! ./polling */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:polling-xhr');\nvar globalThis = __webpack_require__(/*! ../globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty () {}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR (opts) {\n  Polling.call(this, opts);\n  this.requestTimeout = opts.requestTimeout;\n  this.extraHeaders = opts.extraHeaders;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = (typeof location !== 'undefined' && opts.hostname !== location.hostname) ||\n      port !== opts.port;\n    this.xs = opts.secure !== isSSL;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function (opts) {\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n  opts.withCredentials = this.withCredentials;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  opts.requestTimeout = this.requestTimeout;\n\n  // other options for Node.js client\n  opts.extraHeaders = this.extraHeaders;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function (data, fn) {\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function (err) {\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function () {\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function (data) {\n    self.onData(data);\n  });\n  req.on('error', function (err) {\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request (opts) {\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined !== opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n  this.withCredentials = opts.withCredentials;\n  this.requestTimeout = opts.requestTimeout;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function () {\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    try {\n      if (this.extraHeaders) {\n        xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n        for (var i in this.extraHeaders) {\n          if (this.extraHeaders.hasOwnProperty(i)) {\n            xhr.setRequestHeader(i, this.extraHeaders[i]);\n          }\n        }\n      }\n    } catch (e) {}\n\n    if ('POST' === this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    try {\n      xhr.setRequestHeader('Accept', '*/*');\n    } catch (e) {}\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = this.withCredentials;\n    }\n\n    if (this.requestTimeout) {\n      xhr.timeout = this.requestTimeout;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function () {\n        self.onLoad();\n      };\n      xhr.onerror = function () {\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState === 2) {\n          try {\n            var contentType = xhr.getResponseHeader('Content-Type');\n            if (self.supportsBinary && contentType === 'application/octet-stream' || contentType === 'application/octet-stream; charset=UTF-8') {\n              xhr.responseType = 'arraybuffer';\n            }\n          } catch (e) {}\n        }\n        if (4 !== xhr.readyState) return;\n        if (200 === xhr.status || 1223 === xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function () {\n            self.onError(typeof xhr.status === 'number' ? xhr.status : 0);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function () {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (typeof document !== 'undefined') {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function () {\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function (data) {\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function (err) {\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function (fromError) {\n  if ('undefined' === typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch (e) {}\n  }\n\n  if (typeof document !== 'undefined') {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function () {\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type');\n    } catch (e) {}\n    if (contentType === 'application/octet-stream' || contentType === 'application/octet-stream; charset=UTF-8') {\n      data = this.xhr.response || this.xhr.responseText;\n    } else {\n      data = this.xhr.responseText;\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function () {\n  return typeof XDomainRequest !== 'undefined' && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function () {\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nRequest.requestsCount = 0;\nRequest.requests = {};\n\nif (typeof document !== 'undefined') {\n  if (typeof attachEvent === 'function') {\n    attachEvent('onunload', unloadHandler);\n  } else if (typeof addEventListener === 'function') {\n    var terminationEvent = 'onpagehide' in globalThis ? 'pagehide' : 'unload';\n    addEventListener(terminationEvent, unloadHandler, false);\n  }\n}\n\nfunction unloadHandler () {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling.js ***!
-  \*****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(/*! ../transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar yeast = __webpack_require__(/*! yeast */ \"./jaas-client/node_modules/yeast/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function () {\n  var XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function () {\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function (onPause) {\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause () {\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function () {\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function () {\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function () {\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function (data) {\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function (packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' === self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' === packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' !== this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' === this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function () {\n  var self = this;\n\n  function close () {\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' === this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n  var callbackfn = function () {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  parser.encodePayload(packets, this.supportsBinary, function (data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' === schema && Number(this.port) !== 443) ||\n     ('http' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js ***!
-  \*******************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(/*! ../transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar yeast = __webpack_require__(/*! yeast */ \"./jaas-client/node_modules/yeast/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:websocket');\n\nvar BrowserWebSocket, NodeWebSocket;\n\nif (typeof WebSocket !== 'undefined') {\n  BrowserWebSocket = WebSocket;\n} else if (typeof self !== 'undefined') {\n  BrowserWebSocket = self.WebSocket || self.MozWebSocket;\n}\n\nif (typeof window === 'undefined') {\n  try {\n    NodeWebSocket = __webpack_require__(/*! ws */ 0);\n  } catch (e) { }\n}\n\n/**\n * Get either the `WebSocket` or `MozWebSocket` globals\n * in the browser or try to resolve WebSocket-compatible\n * interface exposed by `ws` for Node-like environment.\n */\n\nvar WebSocketImpl = BrowserWebSocket || NodeWebSocket;\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  this.perMessageDeflate = opts.perMessageDeflate;\n  this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;\n  this.protocols = opts.protocols;\n  if (!this.usingBrowserWebSocket) {\n    WebSocketImpl = NodeWebSocket;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function () {\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var uri = this.uri();\n  var protocols = this.protocols;\n\n  var opts = {};\n\n  if (!this.isReactNative) {\n    opts.agent = this.agent;\n    opts.perMessageDeflate = this.perMessageDeflate;\n\n    // SSL options for Node.js client\n    opts.pfx = this.pfx;\n    opts.key = this.key;\n    opts.passphrase = this.passphrase;\n    opts.cert = this.cert;\n    opts.ca = this.ca;\n    opts.ciphers = this.ciphers;\n    opts.rejectUnauthorized = this.rejectUnauthorized;\n  }\n\n  if (this.extraHeaders) {\n    opts.headers = this.extraHeaders;\n  }\n  if (this.localAddress) {\n    opts.localAddress = this.localAddress;\n  }\n\n  try {\n    this.ws =\n      this.usingBrowserWebSocket && !this.isReactNative\n        ? protocols\n          ? new WebSocketImpl(uri, protocols)\n          : new WebSocketImpl(uri)\n        : new WebSocketImpl(uri, protocols, opts);\n  } catch (err) {\n    return this.emit('error', err);\n  }\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  if (this.ws.supports && this.ws.supports.binary) {\n    this.supportsBinary = true;\n    this.ws.binaryType = 'nodebuffer';\n  } else {\n    this.ws.binaryType = 'arraybuffer';\n  }\n\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function () {\n  var self = this;\n\n  this.ws.onopen = function () {\n    self.onOpen();\n  };\n  this.ws.onclose = function () {\n    self.onClose();\n  };\n  this.ws.onmessage = function (ev) {\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function (e) {\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  var total = packets.length;\n  for (var i = 0, l = total; i < l; i++) {\n    (function (packet) {\n      parser.encodePacket(packet, self.supportsBinary, function (data) {\n        if (!self.usingBrowserWebSocket) {\n          // always create a new object (GH-437)\n          var opts = {};\n          if (packet.options) {\n            opts.compress = packet.options.compress;\n          }\n\n          if (self.perMessageDeflate) {\n            var len = 'string' === typeof data ? Buffer.byteLength(data) : data.length;\n            if (len < self.perMessageDeflate.threshold) {\n              opts.compress = false;\n            }\n          }\n        }\n\n        // Sometimes the websocket has already been closed but the browser didn't\n        // have a chance of informing us about it yet, in that case send will\n        // throw an error\n        try {\n          if (self.usingBrowserWebSocket) {\n            // TypeError is thrown when passing the second argument on Safari\n            self.ws.send(data);\n          } else {\n            self.ws.send(data, opts);\n          }\n        } catch (e) {\n          debug('websocket closed before onclose event');\n        }\n\n        --total || done();\n      });\n    })(packets[i]);\n  }\n\n  function done () {\n    self.emit('flush');\n\n    // fake drain\n    // defer to next tick to allow Socket to clear writeBuffer\n    setTimeout(function () {\n      self.writable = true;\n      self.emit('drain');\n    }, 0);\n  }\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function () {\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function () {\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' === schema && Number(this.port) !== 443) ||\n    ('ws' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function () {\n  return !!WebSocketImpl && !('__initialize' in WebSocketImpl && this.name === WS.prototype.name);\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("// browser shim for xmlhttprequest module\n\nvar hasCORS = __webpack_require__(/*! has-cors */ \"./jaas-client/node_modules/has-cors/index.js\");\nvar globalThis = __webpack_require__(/*! ./globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\nmodule.exports = function (opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new globalThis[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');\n    } catch (e) { }\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-parser/lib/browser.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-parser/lib/browser.js ***!
-  \******************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar keys = __webpack_require__(/*! ./keys */ \"./jaas-client/node_modules/engine.io-parser/lib/keys.js\");\nvar hasBinary = __webpack_require__(/*! has-binary2 */ \"./jaas-client/node_modules/has-binary2/index.js\");\nvar sliceBuffer = __webpack_require__(/*! arraybuffer.slice */ \"./jaas-client/node_modules/arraybuffer.slice/index.js\");\nvar after = __webpack_require__(/*! after */ \"./jaas-client/node_modules/after/index.js\");\nvar utf8 = __webpack_require__(/*! ./utf8 */ \"./jaas-client/node_modules/engine.io-parser/lib/utf8.js\");\n\nvar base64encoder;\nif (typeof ArrayBuffer !== 'undefined') {\n  base64encoder = __webpack_require__(/*! base64-arraybuffer */ \"./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js\");\n}\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = __webpack_require__(/*! blob */ \"./jaas-client/node_modules/blob/index.js\");\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if (typeof utf8encode === 'function') {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    exports.encodePacket({ type: packet.type, data: fr.result }, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (typeof Blob !== 'undefined' && packet.data instanceof Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  if (data === undefined) {\n    return err;\n  }\n  // String data\n  if (typeof data === 'string') {\n    if (data.charAt(0) === 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      data = tryDecode(data);\n      if (data === false) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\nfunction tryDecode(data) {\n  try {\n    data = utf8.decode(data, { strict: false });\n  } catch (e) {\n    return false;\n  }\n  return data;\n}\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!base64encoder) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data !== 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data === '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = '', n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (chr !== ':') {\n      length += chr;\n      continue;\n    }\n\n    if (length === '' || (length != (n = Number(length)))) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    msg = data.substr(i + 1, n);\n\n    if (length != msg.length) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    if (msg.length) {\n      packet = exports.decodePacket(msg, binaryType, false);\n\n      if (err.type === packet.type && err.data === packet.data) {\n        // parser error in individual packet - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      var ret = callback(packet, i + n, l);\n      if (false === ret) return;\n    }\n\n    // advance cursor\n    i += n;\n    length = '';\n  }\n\n  if (length !== '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] === 255) break;\n\n      // 310 = char length of Number.MAX_VALUE\n      if (msgLength.length > 310) {\n        return callback(err, 0, 1);\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-parser/lib/keys.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-parser/lib/keys.js ***!
-  \***************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/keys.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-parser/lib/utf8.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-parser/lib/utf8.js ***!
-  \***************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/*! https://mths.be/utf8js v2.1.2 by @mathias */\n\nvar stringFromCharCode = String.fromCharCode;\n\n// Taken from https://mths.be/punycode\nfunction ucs2decode(string) {\n\tvar output = [];\n\tvar counter = 0;\n\tvar length = string.length;\n\tvar value;\n\tvar extra;\n\twhile (counter < length) {\n\t\tvalue = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// high surrogate, and there is a next character\n\t\t\textra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n// Taken from https://mths.be/punycode\nfunction ucs2encode(array) {\n\tvar length = array.length;\n\tvar index = -1;\n\tvar value;\n\tvar output = '';\n\twhile (++index < length) {\n\t\tvalue = array[index];\n\t\tif (value > 0xFFFF) {\n\t\t\tvalue -= 0x10000;\n\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(value);\n\t}\n\treturn output;\n}\n\nfunction checkScalarValue(codePoint, strict) {\n\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\tif (strict) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\treturn true;\n}\n/*--------------------------------------------------------------------------*/\n\nfunction createByte(codePoint, shift) {\n\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n}\n\nfunction encodeCodePoint(codePoint, strict) {\n\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\treturn stringFromCharCode(codePoint);\n\t}\n\tvar symbol = '';\n\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t}\n\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\tif (!checkScalarValue(codePoint, strict)) {\n\t\t\tcodePoint = 0xFFFD;\n\t\t}\n\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\tsymbol += createByte(codePoint, 12);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\treturn symbol;\n}\n\nfunction utf8encode(string, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tvar codePoints = ucs2decode(string);\n\tvar length = codePoints.length;\n\tvar index = -1;\n\tvar codePoint;\n\tvar byteString = '';\n\twhile (++index < length) {\n\t\tcodePoint = codePoints[index];\n\t\tbyteString += encodeCodePoint(codePoint, strict);\n\t}\n\treturn byteString;\n}\n\n/*--------------------------------------------------------------------------*/\n\nfunction readContinuationByte() {\n\tif (byteIndex >= byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\tif ((continuationByte & 0xC0) == 0x80) {\n\t\treturn continuationByte & 0x3F;\n\t}\n\n\t// If we end up here, it’s not a continuation byte\n\tthrow Error('Invalid continuation byte');\n}\n\nfunction decodeSymbol(strict) {\n\tvar byte1;\n\tvar byte2;\n\tvar byte3;\n\tvar byte4;\n\tvar codePoint;\n\n\tif (byteIndex > byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tif (byteIndex == byteCount) {\n\t\treturn false;\n\t}\n\n\t// Read first byte\n\tbyte1 = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\t// 1-byte sequence (no continuation bytes)\n\tif ((byte1 & 0x80) == 0) {\n\t\treturn byte1;\n\t}\n\n\t// 2-byte sequence\n\tif ((byte1 & 0xE0) == 0xC0) {\n\t\tbyte2 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\tif (codePoint >= 0x80) {\n\t\t\treturn codePoint;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 3-byte sequence (may include unpaired surrogates)\n\tif ((byte1 & 0xF0) == 0xE0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\tif (codePoint >= 0x0800) {\n\t\t\treturn checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 4-byte sequence\n\tif ((byte1 & 0xF8) == 0xF0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tbyte4 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t(byte3 << 0x06) | byte4;\n\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\treturn codePoint;\n\t\t}\n\t}\n\n\tthrow Error('Invalid UTF-8 detected');\n}\n\nvar byteArray;\nvar byteCount;\nvar byteIndex;\nfunction utf8decode(byteString, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tbyteArray = ucs2decode(byteString);\n\tbyteCount = byteArray.length;\n\tbyteIndex = 0;\n\tvar codePoints = [];\n\tvar tmp;\n\twhile ((tmp = decodeSymbol(strict)) !== false) {\n\t\tcodePoints.push(tmp);\n\t}\n\treturn ucs2encode(codePoints);\n}\n\nmodule.exports = {\n\tversion: '2.1.2',\n\tencode: utf8encode,\n\tdecode: utf8decode\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/utf8.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/has-binary2/index.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/node_modules/has-binary2/index.js ***!
-  \*******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/* global Blob File */\n\n/*\n * Module requirements.\n */\n\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js\");\n\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' ||\n                        typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]';\nvar withNativeFile = typeof File === 'function' ||\n                        typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]';\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Supports Buffer, ArrayBuffer, Blob and File.\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary (obj) {\n  if (!obj || typeof obj !== 'object') {\n    return false;\n  }\n\n  if (isArray(obj)) {\n    for (var i = 0, l = obj.length; i < l; i++) {\n      if (hasBinary(obj[i])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  if ((typeof Buffer === 'function' && Buffer.isBuffer && Buffer.isBuffer(obj)) ||\n    (typeof ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||\n    (withNativeBlob && obj instanceof Blob) ||\n    (withNativeFile && obj instanceof File)\n  ) {\n    return true;\n  }\n\n  // see: https://github.com/Automattic/has-binary/pull/4\n  if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {\n    return hasBinary(obj.toJSON(), true);\n  }\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-binary2/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/has-cors/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/has-cors/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-cors/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/history/esm/history.js":
-/*!*********************************************************!*\
-  !*** ./jaas-client/node_modules/history/esm/history.js ***!
-  \*********************************************************/
-/*! exports provided: createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createBrowserHistory\", function() { return createBrowserHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createHashHistory\", function() { return createHashHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createMemoryHistory\", function() { return createMemoryHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createLocation\", function() { return createLocation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"locationsAreEqual\", function() { return locationsAreEqual; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parsePath\", function() { return parsePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createPath\", function() { return createPath; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var resolve_pathname__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! resolve-pathname */ \"./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js\");\n/* harmony import */ var value_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! value-equal */ \"./jaas-client/node_modules/value-equal/esm/value-equal.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n\n\n\n\n\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n  return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n  var pathname = path || '/';\n  var search = '';\n  var hash = '';\n  var hashIndex = pathname.indexOf('#');\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf('?');\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === '?' ? '' : search,\n    hash: hash === '#' ? '' : hash\n  };\n}\nfunction createPath(location) {\n  var pathname = location.pathname,\n      search = location.search,\n      hash = location.hash;\n  var path = pathname || '/';\n  if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n  return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n  var location;\n\n  if (typeof path === 'string') {\n    // Two-arg form: push(path, state)\n    location = parsePath(path);\n    location.state = state;\n  } else {\n    // One-arg form: push(location)\n    location = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, path);\n    if (location.pathname === undefined) location.pathname = '';\n\n    if (location.search) {\n      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n    } else {\n      location.search = '';\n    }\n\n    if (location.hash) {\n      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n    } else {\n      location.hash = '';\n    }\n\n    if (state !== undefined && location.state === undefined) location.state = state;\n  }\n\n  try {\n    location.pathname = decodeURI(location.pathname);\n  } catch (e) {\n    if (e instanceof URIError) {\n      throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n    } else {\n      throw e;\n    }\n  }\n\n  if (key) location.key = key;\n\n  if (currentLocation) {\n    // Resolve incomplete/relative pathname relative to current location.\n    if (!location.pathname) {\n      location.pathname = currentLocation.pathname;\n    } else if (location.pathname.charAt(0) !== '/') {\n      location.pathname = Object(resolve_pathname__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(location.pathname, currentLocation.pathname);\n    }\n  } else {\n    // When there is no prior location and pathname is empty, set it to /\n    if (!location.pathname) {\n      location.pathname = '/';\n    }\n  }\n\n  return location;\n}\nfunction locationsAreEqual(a, b) {\n  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && Object(value_equal__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n  var prompt = null;\n\n  function setPrompt(nextPrompt) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(prompt == null, 'A history supports only one prompt at a time') : undefined;\n    prompt = nextPrompt;\n    return function () {\n      if (prompt === nextPrompt) prompt = null;\n    };\n  }\n\n  function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n    // TODO: If another transition starts while we're still confirming\n    // the previous one, we may end up in a weird state. Figure out the\n    // best way to handle this.\n    if (prompt != null) {\n      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n      if (typeof result === 'string') {\n        if (typeof getUserConfirmation === 'function') {\n          getUserConfirmation(result, callback);\n        } else {\n           true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : undefined;\n          callback(true);\n        }\n      } else {\n        // Return false from a transition hook to cancel the transition.\n        callback(result !== false);\n      }\n    } else {\n      callback(true);\n    }\n  }\n\n  var listeners = [];\n\n  function appendListener(fn) {\n    var isActive = true;\n\n    function listener() {\n      if (isActive) fn.apply(void 0, arguments);\n    }\n\n    listeners.push(listener);\n    return function () {\n      isActive = false;\n      listeners = listeners.filter(function (item) {\n        return item !== listener;\n      });\n    };\n  }\n\n  function notifyListeners() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    listeners.forEach(function (listener) {\n      return listener.apply(void 0, args);\n    });\n  }\n\n  return {\n    setPrompt: setPrompt,\n    confirmTransitionTo: confirmTransitionTo,\n    appendListener: appendListener,\n    notifyListeners: notifyListeners\n  };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n  callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n  var ua = window.navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n  return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n  return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n  return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n  try {\n    return window.history.state || {};\n  } catch (e) {\n    // IE 11 sometimes throws when accessing window.history.state\n    // See https://github.com/ReactTraining/history/pull/289\n    return {};\n  }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(false, 'Browser history needs a DOM') : undefined : void 0;\n  var globalHistory = window.history;\n  var canUseHistory = supportsHistory();\n  var needsHashChangeListener = !supportsPopStateOnHashChange();\n  var _props = props,\n      _props$forceRefresh = _props.forceRefresh,\n      forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n  function getDOMLocation(historyState) {\n    var _ref = historyState || {},\n        key = _ref.key,\n        state = _ref.state;\n\n    var _window$location = window.location,\n        pathname = _window$location.pathname,\n        search = _window$location.search,\n        hash = _window$location.hash;\n    var path = pathname + search + hash;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : undefined;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path, state, key);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function handlePopState(event) {\n    // Ignore extraneous popstate events in WebKit.\n    if (isExtraneousPopstateEvent(event)) return;\n    handlePop(getDOMLocation(event.state));\n  }\n\n  function handleHashChange() {\n    handlePop(getDOMLocation(getHistoryState()));\n  }\n\n  var forceNextPop = false;\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of keys we've seen in sessionStorage.\n    // Instead, we just default to 0 for keys we don't know.\n\n    var toIndex = allKeys.indexOf(toLocation.key);\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allKeys.indexOf(fromLocation.key);\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  }\n\n  var initialLocation = getDOMLocation(getHistoryState());\n  var allKeys = [initialLocation.key]; // Public interface\n\n  function createHref(location) {\n    return basename + createPath(location);\n  }\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.pushState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.href = href;\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          var nextKeys = allKeys.slice(0, prevIndex + 1);\n          nextKeys.push(location.key);\n          allKeys = nextKeys;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : undefined;\n        window.location.href = href;\n      }\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.replaceState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.replace(href);\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : undefined;\n        window.location.replace(href);\n      }\n    });\n  }\n\n  function go(n) {\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n  hashbang: {\n    encodePath: function encodePath(path) {\n      return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n    },\n    decodePath: function decodePath(path) {\n      return path.charAt(0) === '!' ? path.substr(1) : path;\n    }\n  },\n  noslash: {\n    encodePath: stripLeadingSlash,\n    decodePath: addLeadingSlash\n  },\n  slash: {\n    encodePath: addLeadingSlash,\n    decodePath: addLeadingSlash\n  }\n};\n\nfunction stripHash(url) {\n  var hashIndex = url.indexOf('#');\n  return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var hashIndex = href.indexOf('#');\n  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n  window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n  window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(false, 'Hash history needs a DOM') : undefined : void 0;\n  var globalHistory = window.history;\n  var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n  var _props = props,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$hashType = _props.hashType,\n      hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n  var _HashPathCoders$hashT = HashPathCoders[hashType],\n      encodePath = _HashPathCoders$hashT.encodePath,\n      decodePath = _HashPathCoders$hashT.decodePath;\n\n  function getDOMLocation() {\n    var path = decodePath(getHashPath());\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : undefined;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  var forceNextPop = false;\n  var ignorePath = null;\n\n  function locationsAreEqual$$1(a, b) {\n    return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n  }\n\n  function handleHashChange() {\n    var path = getHashPath();\n    var encodedPath = encodePath(path);\n\n    if (path !== encodedPath) {\n      // Ensure we always have a properly-encoded hash.\n      replaceHashPath(encodedPath);\n    } else {\n      var location = getDOMLocation();\n      var prevLocation = history.location;\n      if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n      if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n      ignorePath = null;\n      handlePop(location);\n    }\n  }\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of paths we've seen in sessionStorage.\n    // Instead, we just default to 0 for paths we don't know.\n\n    var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  } // Ensure the hash is encoded properly before doing anything else.\n\n\n  var path = getHashPath();\n  var encodedPath = encodePath(path);\n  if (path !== encodedPath) replaceHashPath(encodedPath);\n  var initialLocation = getDOMLocation();\n  var allPaths = [createPath(initialLocation)]; // Public interface\n\n  function createHref(location) {\n    var baseTag = document.querySelector('base');\n    var href = '';\n\n    if (baseTag && baseTag.getAttribute('href')) {\n      href = stripHash(window.location.href);\n    }\n\n    return href + '#' + encodePath(basename + createPath(location));\n  }\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Hash history cannot push state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a PUSH, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        pushHashPath(encodedPath);\n        var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n        var nextPaths = allPaths.slice(0, prevIndex + 1);\n        nextPaths.push(path);\n        allPaths = nextPaths;\n        setState({\n          action: action,\n          location: location\n        });\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : undefined;\n        setState();\n      }\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Hash history cannot replace state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        replaceHashPath(encodedPath);\n      }\n\n      var prevIndex = allPaths.indexOf(createPath(history.location));\n      if (prevIndex !== -1) allPaths[prevIndex] = path;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : undefined;\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(HashChangeEvent$1, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(HashChangeEvent$1, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n  return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  var _props = props,\n      getUserConfirmation = _props.getUserConfirmation,\n      _props$initialEntries = _props.initialEntries,\n      initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n      _props$initialIndex = _props.initialIndex,\n      initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = history.entries.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var index = clamp(initialIndex, 0, initialEntries.length - 1);\n  var entries = initialEntries.map(function (entry) {\n    return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n  }); // Public interface\n\n  var createHref = createPath;\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var prevIndex = history.index;\n      var nextIndex = prevIndex + 1;\n      var nextEntries = history.entries.slice(0);\n\n      if (nextEntries.length > nextIndex) {\n        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n      } else {\n        nextEntries.push(location);\n      }\n\n      setState({\n        action: action,\n        location: location,\n        index: nextIndex,\n        entries: nextEntries\n      });\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      history.entries[history.index] = location;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n    var action = 'POP';\n    var location = history.entries[nextIndex];\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (ok) {\n        setState({\n          action: action,\n          location: location,\n          index: nextIndex\n        });\n      } else {\n        // Mimic the behavior of DOM histories by\n        // causing a render after a cancelled POP.\n        setState();\n      }\n    });\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  function canGo(n) {\n    var nextIndex = history.index + n;\n    return nextIndex >= 0 && nextIndex < history.entries.length;\n  }\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    return transitionManager.setPrompt(prompt);\n  }\n\n  function listen(listener) {\n    return transitionManager.appendListener(listener);\n  }\n\n  var history = {\n    length: entries.length,\n    action: 'POP',\n    location: entries[index],\n    index: index,\n    entries: entries,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    canGo: canGo,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/history/esm/history.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js":
-/*!**********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js ***!
-  \**********************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar reactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/hyphenate-style-name/index.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/hyphenate-style-name/index.js ***!
-  \****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* eslint-disable no-var, prefer-template */\nvar uppercasePattern = /[A-Z]/g\nvar msPattern = /^ms-/\nvar cache = {}\n\nfunction toHyphenLower(match) {\n  return '-' + match.toLowerCase()\n}\n\nfunction hyphenateStyleName(name) {\n  if (cache.hasOwnProperty(name)) {\n    return cache[name]\n  }\n\n  var hName = name.replace(uppercasePattern, toHyphenLower)\n  return (cache[name] = msPattern.test(hName) ? '-' + hName : hName)\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (hyphenateStyleName);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/hyphenate-style-name/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/indexof/index.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/node_modules/indexof/index.js ***!
-  \***************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};\n\n//# sourceURL=webpack:///./jaas-client/node_modules/indexof/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/is-in-browser/dist/module.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/is-in-browser/dist/module.js ***!
-  \***************************************************************/
-/*! exports provided: isBrowser, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isBrowser\", function() { return isBrowser; });\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar isBrowser = (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" && (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) === 'object' && document.nodeType === 9;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (isBrowser);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/is-in-browser/dist/module.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/isarray/index.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/node_modules/isarray/index.js ***!
-  \***************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js ***!
-  \******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hyphenate-style-name */ \"./jaas-client/node_modules/hyphenate-style-name/index.js\");\n\n\n/**\n * Convert camel cased property names to dash separated.\n *\n * @param {Object} style\n * @return {Object}\n */\n\nfunction convertCase(style) {\n  var converted = {};\n\n  for (var prop in style) {\n    var key = prop.indexOf('--') === 0 ? prop : Object(hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop);\n    converted[key] = style[prop];\n  }\n\n  if (style.fallbacks) {\n    if (Array.isArray(style.fallbacks)) converted.fallbacks = style.fallbacks.map(convertCase);else converted.fallbacks = convertCase(style.fallbacks);\n  }\n\n  return converted;\n}\n/**\n * Allow camel cased property names by converting them back to dasherized.\n *\n * @param {Rule} rule\n */\n\n\nfunction camelCase() {\n  function onProcessStyle(style) {\n    if (Array.isArray(style)) {\n      // Handle rules like @font-face, which can have multiple styles in an array\n      for (var index = 0; index < style.length; index++) {\n        style[index] = convertCase(style[index]);\n      }\n\n      return style;\n    }\n\n    return convertCase(style);\n  }\n\n  function onChangeValue(value, prop, rule) {\n    if (prop.indexOf('--') === 0) {\n      return value;\n    }\n\n    var hyphenatedProp = Object(hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop); // There was no camel case in place\n\n    if (prop === hyphenatedProp) return value;\n    rule.prop(hyphenatedProp, value); // Core will ignore that property value we set the proper one above.\n\n    return null;\n  }\n\n  return {\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (camelCase);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js":
-/*!**********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js ***!
-  \**********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\nvar px = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.px : 'px';\nvar ms = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.ms : 'ms';\nvar percent = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.percent : '%';\n/**\n * Generated jss-plugin-default-unit CSS property units\n *\n * @type object\n */\n\nvar defaultUnits = {\n  // Animation properties\n  'animation-delay': ms,\n  'animation-duration': ms,\n  // Background properties\n  'background-position': px,\n  'background-position-x': px,\n  'background-position-y': px,\n  'background-size': px,\n  // Border Properties\n  border: px,\n  'border-bottom': px,\n  'border-bottom-left-radius': px,\n  'border-bottom-right-radius': px,\n  'border-bottom-width': px,\n  'border-left': px,\n  'border-left-width': px,\n  'border-radius': px,\n  'border-right': px,\n  'border-right-width': px,\n  'border-top': px,\n  'border-top-left-radius': px,\n  'border-top-right-radius': px,\n  'border-top-width': px,\n  'border-width': px,\n  // Margin properties\n  margin: px,\n  'margin-bottom': px,\n  'margin-left': px,\n  'margin-right': px,\n  'margin-top': px,\n  // Padding properties\n  padding: px,\n  'padding-bottom': px,\n  'padding-left': px,\n  'padding-right': px,\n  'padding-top': px,\n  // Mask properties\n  'mask-position-x': px,\n  'mask-position-y': px,\n  'mask-size': px,\n  // Width and height properties\n  height: px,\n  width: px,\n  'min-height': px,\n  'max-height': px,\n  'min-width': px,\n  'max-width': px,\n  // Position properties\n  bottom: px,\n  left: px,\n  top: px,\n  right: px,\n  // Shadow properties\n  'box-shadow': px,\n  'text-shadow': px,\n  // Column properties\n  'column-gap': px,\n  'column-rule': px,\n  'column-rule-width': px,\n  'column-width': px,\n  // Font and text properties\n  'font-size': px,\n  'font-size-delta': px,\n  'letter-spacing': px,\n  'text-indent': px,\n  'text-stroke': px,\n  'text-stroke-width': px,\n  'word-spacing': px,\n  // Motion properties\n  motion: px,\n  'motion-offset': px,\n  // Outline properties\n  outline: px,\n  'outline-offset': px,\n  'outline-width': px,\n  // Perspective properties\n  perspective: px,\n  'perspective-origin-x': percent,\n  'perspective-origin-y': percent,\n  // Transform properties\n  'transform-origin': percent,\n  'transform-origin-x': percent,\n  'transform-origin-y': percent,\n  'transform-origin-z': percent,\n  // Transition properties\n  'transition-delay': ms,\n  'transition-duration': ms,\n  // Alignment properties\n  'vertical-align': px,\n  'flex-basis': px,\n  // Some random properties\n  'shape-margin': px,\n  size: px,\n  // Grid properties\n  grid: px,\n  'grid-gap': px,\n  'grid-row-gap': px,\n  'grid-column-gap': px,\n  'grid-template-rows': px,\n  'grid-template-columns': px,\n  'grid-auto-rows': px,\n  'grid-auto-columns': px,\n  // Not existing properties.\n  // Used to avoid issues with jss-plugin-expand integration.\n  'box-shadow-x': px,\n  'box-shadow-y': px,\n  'box-shadow-blur': px,\n  'box-shadow-spread': px,\n  'font-line-height': px,\n  'text-shadow-x': px,\n  'text-shadow-y': px,\n  'text-shadow-blur': px\n};\n\n/**\n * Clones the object and adds a camel cased property version.\n */\nfunction addCamelCasedVersion(obj) {\n  var regExp = /(-[a-z])/g;\n\n  var replace = function replace(str) {\n    return str[1].toUpperCase();\n  };\n\n  var newObj = {};\n\n  for (var _key in obj) {\n    newObj[_key] = obj[_key];\n    newObj[_key.replace(regExp, replace)] = obj[_key];\n  }\n\n  return newObj;\n}\n\nvar units = addCamelCasedVersion(defaultUnits);\n/**\n * Recursive deep style passing function\n */\n\nfunction iterate(prop, value, options) {\n  if (!value) return value;\n\n  if (Array.isArray(value)) {\n    for (var i = 0; i < value.length; i++) {\n      value[i] = iterate(prop, value[i], options);\n    }\n  } else if (typeof value === 'object') {\n    if (prop === 'fallbacks') {\n      for (var innerProp in value) {\n        value[innerProp] = iterate(innerProp, value[innerProp], options);\n      }\n    } else {\n      for (var _innerProp in value) {\n        value[_innerProp] = iterate(prop + \"-\" + _innerProp, value[_innerProp], options);\n      }\n    }\n  } else if (typeof value === 'number') {\n    var unit = options[prop] || units[prop];\n\n    if (unit) {\n      return typeof unit === 'function' ? unit(value).toString() : \"\" + value + unit;\n    }\n\n    return value.toString();\n  }\n\n  return value;\n}\n/**\n * Add unit to numeric values.\n */\n\n\nfunction defaultUnit(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var camelCasedOptions = addCamelCasedVersion(options);\n\n  function onProcessStyle(style, rule) {\n    if (rule.type !== 'style') return style;\n\n    for (var prop in style) {\n      style[prop] = iterate(prop, style[prop], camelCasedOptions);\n    }\n\n    return style;\n  }\n\n  function onChangeValue(value, prop) {\n    return iterate(prop, value, camelCasedOptions);\n  }\n\n  return {\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (defaultUnit);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\nvar at = '@global';\nvar atPrefix = '@global ';\n\nvar GlobalContainerRule =\n/*#__PURE__*/\nfunction () {\n  function GlobalContainerRule(key, styles, options) {\n    this.type = 'global';\n    this.at = at;\n    this.rules = void 0;\n    this.options = void 0;\n    this.key = void 0;\n    this.isProcessed = false;\n    this.key = key;\n    this.options = options;\n    this.rules = new jss__WEBPACK_IMPORTED_MODULE_1__[\"RuleList\"](Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var selector in styles) {\n      this.rules.add(selector, styles[selector]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Get a rule.\n   */\n\n\n  var _proto = GlobalContainerRule.prototype;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Create and register rule, run plugins.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, style, options) {\n    var rule = this.rules.add(name, style, options);\n    this.options.jss.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString() {\n    return this.rules.toString();\n  };\n\n  return GlobalContainerRule;\n}();\n\nvar GlobalPrefixedRule =\n/*#__PURE__*/\nfunction () {\n  function GlobalPrefixedRule(key, style, options) {\n    this.type = 'global';\n    this.at = at;\n    this.options = void 0;\n    this.rule = void 0;\n    this.isProcessed = false;\n    this.key = void 0;\n    this.key = key;\n    this.options = options;\n    var selector = key.substr(atPrefix.length);\n    this.rule = options.jss.createRule(selector, style, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n  }\n\n  var _proto2 = GlobalPrefixedRule.prototype;\n\n  _proto2.toString = function toString(options) {\n    return this.rule ? this.rule.toString(options) : '';\n  };\n\n  return GlobalPrefixedRule;\n}();\n\nvar separatorRegExp = /\\s*,\\s*/g;\n\nfunction addScope(selector, scope) {\n  var parts = selector.split(separatorRegExp);\n  var scoped = '';\n\n  for (var i = 0; i < parts.length; i++) {\n    scoped += scope + \" \" + parts[i].trim();\n    if (parts[i + 1]) scoped += ', ';\n  }\n\n  return scoped;\n}\n\nfunction handleNestedGlobalContainerRule(rule) {\n  var options = rule.options,\n      style = rule.style;\n  var rules = style ? style[at] : null;\n  if (!rules) return;\n\n  for (var name in rules) {\n    options.sheet.addRule(name, rules[name], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      selector: addScope(name, rule.selector)\n    }));\n  }\n\n  delete style[at];\n}\n\nfunction handlePrefixedGlobalRule(rule) {\n  var options = rule.options,\n      style = rule.style;\n\n  for (var prop in style) {\n    if (prop[0] !== '@' || prop.substr(0, at.length) !== at) continue;\n    var selector = addScope(prop.substr(at.length), rule.selector);\n    options.sheet.addRule(selector, style[prop], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      selector: selector\n    }));\n    delete style[prop];\n  }\n}\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\n\n\nfunction jssGlobal() {\n  function onCreateRule(name, styles, options) {\n    if (!name) return null;\n\n    if (name === at) {\n      return new GlobalContainerRule(name, styles, options);\n    }\n\n    if (name[0] === '@' && name.substr(0, atPrefix.length) === atPrefix) {\n      return new GlobalPrefixedRule(name, styles, options);\n    }\n\n    var parent = options.parent;\n\n    if (parent) {\n      if (parent.type === 'global' || parent.options.parent && parent.options.parent.type === 'global') {\n        options.scoped = false;\n      }\n    }\n\n    if (options.scoped === false) {\n      options.selector = name;\n    }\n\n    return null;\n  }\n\n  function onProcessRule(rule) {\n    if (rule.type !== 'style') return;\n    handleNestedGlobalContainerRule(rule);\n    handlePrefixedGlobalRule(rule);\n  }\n\n  return {\n    onCreateRule: onCreateRule,\n    onProcessRule: onProcessRule\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssGlobal);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n\n\n\nvar separatorRegExp = /\\s*,\\s*/g;\nvar parentRegExp = /&/g;\nvar refRegExp = /\\$([\\w-]+)/g;\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\n\nfunction jssNested() {\n  // Get a function to be used for $ref replacement.\n  function getReplaceRef(container, sheet) {\n    return function (match, key) {\n      var rule = container.getRule(key) || sheet && sheet.getRule(key);\n\n      if (rule) {\n        rule = rule;\n        return rule.selector;\n      }\n\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(false, \"[JSS] Could not find the referenced rule \\\"\" + key + \"\\\" in \\\"\" + (container.options.meta || container.toString()) + \"\\\".\") : undefined;\n      return key;\n    };\n  }\n\n  function replaceParentRefs(nestedProp, parentProp) {\n    var parentSelectors = parentProp.split(separatorRegExp);\n    var nestedSelectors = nestedProp.split(separatorRegExp);\n    var result = '';\n\n    for (var i = 0; i < parentSelectors.length; i++) {\n      var parent = parentSelectors[i];\n\n      for (var j = 0; j < nestedSelectors.length; j++) {\n        var nested = nestedSelectors[j];\n        if (result) result += ', '; // Replace all & by the parent or prefix & with the parent.\n\n        result += nested.indexOf('&') !== -1 ? nested.replace(parentRegExp, parent) : parent + \" \" + nested;\n      }\n    }\n\n    return result;\n  }\n\n  function getOptions(rule, container, prevOptions) {\n    // Options has been already created, now we only increase index.\n    if (prevOptions) return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, prevOptions, {\n      index: prevOptions.index + 1\n    });\n    var nestingLevel = rule.options.nestingLevel;\n    nestingLevel = nestingLevel === undefined ? 1 : nestingLevel + 1;\n\n    var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, rule.options, {\n      nestingLevel: nestingLevel,\n      index: container.indexOf(rule) + 1 // We don't need the parent name to be set options for chlid.\n\n    });\n\n    delete options.name;\n    return options;\n  }\n\n  function onProcessStyle(style, rule, sheet) {\n    if (rule.type !== 'style') return style;\n    var styleRule = rule;\n    var container = styleRule.options.parent;\n    var options;\n    var replaceRef;\n\n    for (var prop in style) {\n      var isNested = prop.indexOf('&') !== -1;\n      var isNestedConditional = prop[0] === '@';\n      if (!isNested && !isNestedConditional) continue;\n      options = getOptions(styleRule, container, options);\n\n      if (isNested) {\n        var selector = replaceParentRefs(prop, styleRule.selector); // Lazily create the ref replacer function just once for\n        // all nested rules within the sheet.\n\n        if (!replaceRef) replaceRef = getReplaceRef(container, sheet); // Replace all $refs.\n\n        selector = selector.replace(refRegExp, replaceRef);\n        container.addRule(selector, style[prop], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n          selector: selector\n        }));\n      } else if (isNestedConditional) {\n        // Place conditional right after the parent rule to ensure right ordering.\n        container.addRule(prop, {}, options) // Flow expects more options but they aren't required\n        // And flow doesn't know this will always be a StyleRule which has the addRule method\n        // $FlowFixMe\n        .addRule(styleRule.key, style[prop], {\n          selector: styleRule.selector\n        });\n      }\n\n      delete style[prop];\n    }\n\n    return style;\n  }\n\n  return {\n    onProcessStyle: onProcessStyle\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssNested);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js ***!
-  \******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Sort props by length.\n */\nfunction jssPropsSort() {\n  var sort = function sort(prop0, prop1) {\n    if (prop0.length === prop1.length) {\n      return prop0 > prop1 ? 1 : -1;\n    }\n\n    return prop0.length - prop1.length;\n  };\n\n  return {\n    onProcessStyle: function onProcessStyle(style, rule) {\n      if (rule.type !== 'style') return style;\n      var newStyle = {};\n      var props = Object.keys(style).sort(sort);\n\n      for (var i = 0; i < props.length; i++) {\n        newStyle[props[i]] = style[props[i]];\n      }\n\n      return newStyle;\n    }\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssPropsSort);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js":
-/*!************************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js ***!
-  \************************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\nvar now = Date.now();\nvar fnValuesNs = \"fnValues\" + now;\nvar fnRuleNs = \"fnStyle\" + ++now;\nfunction functionPlugin() {\n  return {\n    onCreateRule: function onCreateRule(name, decl, options) {\n      if (typeof decl !== 'function') return null;\n      var rule = Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"createRule\"])(name, {}, options);\n      rule[fnRuleNs] = decl;\n      return rule;\n    },\n    onProcessStyle: function onProcessStyle(style, rule) {\n      // We need to extract function values from the declaration, so that we can keep core unaware of them.\n      // We need to do that only once.\n      // We don't need to extract functions on each style update, since this can happen only once.\n      // We don't support function values inside of function rules.\n      if (fnValuesNs in rule || fnRuleNs in rule) return style;\n      var fnValues = {};\n\n      for (var prop in style) {\n        var value = style[prop];\n        if (typeof value !== 'function') continue;\n        delete style[prop];\n        fnValues[prop] = value;\n      } // $FlowFixMe\n\n\n      rule[fnValuesNs] = fnValues;\n      return style;\n    },\n    onUpdate: function onUpdate(data, rule, sheet, options) {\n      var styleRule = rule;\n      var fnRule = styleRule[fnRuleNs]; // If we have a style function, the entire rule is dynamic and style object\n      // will be returned from that function.\n\n      if (fnRule) {\n        // Empty object will remove all currently defined props\n        // in case function rule returns a falsy value.\n        styleRule.style = fnRule(data) || {};\n\n        if (true) {\n          for (var prop in styleRule.style) {\n            if (typeof styleRule.style[prop] === 'function') {\n               true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(false, '[JSS] Function values inside function rules are not supported.') : undefined;\n              break;\n            }\n          }\n        }\n      }\n\n      var fnValues = styleRule[fnValuesNs]; // If we have a fn values map, it is a rule with function values.\n\n      if (fnValues) {\n        for (var _prop in fnValues) {\n          styleRule.prop(_prop, fnValues[_prop](data), options);\n        }\n      }\n    }\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (functionPlugin);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js":
-/*!****************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js ***!
-  \****************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var css_vendor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! css-vendor */ \"./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\n/**\n * Add vendor prefix to a property name when needed.\n *\n * @api public\n */\n\nfunction jssVendorPrefixer() {\n  function onProcessRule(rule) {\n    if (rule.type === 'keyframes') {\n      var atRule = rule;\n      atRule.at = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedKeyframes\"])(atRule.at);\n    }\n  }\n\n  function prefixStyle(style) {\n    for (var prop in style) {\n      var value = style[prop];\n\n      if (prop === 'fallbacks' && Array.isArray(value)) {\n        style[prop] = value.map(prefixStyle);\n        continue;\n      }\n\n      var changeProp = false;\n      var supportedProp = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedProperty\"])(prop);\n      if (supportedProp && supportedProp !== prop) changeProp = true;\n      var changeValue = false;\n      var supportedValue$1 = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedValue\"])(supportedProp, Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"toCssValue\"])(value));\n      if (supportedValue$1 && supportedValue$1 !== value) changeValue = true;\n\n      if (changeProp || changeValue) {\n        if (changeProp) delete style[prop];\n        style[supportedProp || prop] = supportedValue$1 || value;\n      }\n    }\n\n    return style;\n  }\n\n  function onProcessStyle(style, rule) {\n    if (rule.type !== 'style') return style;\n    return prefixStyle(style);\n  }\n\n  function onChangeValue(value, prop) {\n    return Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedValue\"])(prop, Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"toCssValue\"])(value)) || value;\n  }\n\n  return {\n    onProcessRule: onProcessRule,\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssVendorPrefixer);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss/dist/jss.esm.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/jss/dist/jss.esm.js ***!
-  \******************************************************/
-/*! exports provided: default, RuleList, SheetsManager, SheetsRegistry, create, createGenerateId, createRule, getDynamicStyles, hasCSSTOMSupport, sheets, toCssValue */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RuleList\", function() { return RuleList; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SheetsManager\", function() { return SheetsManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SheetsRegistry\", function() { return SheetsRegistry; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"create\", function() { return create; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createGenerateId\", function() { return createGenerateId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createRule\", function() { return createRule; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getDynamicStyles\", function() { return getDynamicStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasCSSTOMSupport\", function() { return hasCSSTOMSupport; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sheets\", function() { return sheets; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toCssValue\", function() { return toCssValue; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var is_in_browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! is-in-browser */ \"./jaas-client/node_modules/is-in-browser/dist/module.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n\n\n\n\n\n\n\n\nvar plainObjectConstrurctor = {}.constructor;\nfunction cloneStyle(style) {\n  if (style == null || typeof style !== 'object') return style;\n  if (Array.isArray(style)) return style.map(cloneStyle);\n  if (style.constructor !== plainObjectConstrurctor) return style;\n  var newStyle = {};\n\n  for (var name in style) {\n    newStyle[name] = cloneStyle(style[name]);\n  }\n\n  return newStyle;\n}\n\n/**\n * Create a rule instance.\n */\n\nfunction createRule(name, decl, options) {\n  if (name === void 0) {\n    name = 'unnamed';\n  }\n\n  var jss = options.jss;\n  var declCopy = cloneStyle(decl);\n  var rule = jss.plugins.onCreateRule(name, declCopy, options);\n  if (rule) return rule; // It is an at-rule and it has no instance.\n\n  if (name[0] === '@') {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Unknown rule \" + name) : undefined;\n  }\n\n  return null;\n}\n\nvar join = function join(value, by) {\n  var result = '';\n\n  for (var i = 0; i < value.length; i++) {\n    // Remove !important from the value, it will be readded later.\n    if (value[i] === '!important') break;\n    if (result) result += by;\n    result += value[i];\n  }\n\n  return result;\n};\n/**\n * Converts array values to string.\n *\n * `margin: [['5px', '10px']]` > `margin: 5px 10px;`\n * `border: ['1px', '2px']` > `border: 1px, 2px;`\n * `margin: [['5px', '10px'], '!important']` > `margin: 5px 10px !important;`\n * `color: ['red', !important]` > `color: red !important;`\n */\n\n\nfunction toCssValue(value, ignoreImportant) {\n  if (ignoreImportant === void 0) {\n    ignoreImportant = false;\n  }\n\n  if (!Array.isArray(value)) return value;\n  var cssValue = ''; // Support space separated values via `[['5px', '10px']]`.\n\n  if (Array.isArray(value[0])) {\n    for (var i = 0; i < value.length; i++) {\n      if (value[i] === '!important') break;\n      if (cssValue) cssValue += ', ';\n      cssValue += join(value[i], ' ');\n    }\n  } else cssValue = join(value, ', '); // Add !important, because it was ignored.\n\n\n  if (!ignoreImportant && value[value.length - 1] === '!important') {\n    cssValue += ' !important';\n  }\n\n  return cssValue;\n}\n\n/**\n * Indent a string.\n * http://jsperf.com/array-join-vs-for\n */\nfunction indentStr(str, indent) {\n  var result = '';\n\n  for (var index = 0; index < indent; index++) {\n    result += '  ';\n  }\n\n  return result + str;\n}\n/**\n * Converts a Rule to CSS string.\n */\n\n\nfunction toCss(selector, style, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var result = '';\n  if (!style) return result;\n  var _options = options,\n      _options$indent = _options.indent,\n      indent = _options$indent === void 0 ? 0 : _options$indent;\n  var fallbacks = style.fallbacks;\n  if (selector) indent++; // Apply fallbacks first.\n\n  if (fallbacks) {\n    // Array syntax {fallbacks: [{prop: value}]}\n    if (Array.isArray(fallbacks)) {\n      for (var index = 0; index < fallbacks.length; index++) {\n        var fallback = fallbacks[index];\n\n        for (var prop in fallback) {\n          var value = fallback[prop];\n\n          if (value != null) {\n            if (result) result += '\\n';\n            result += \"\" + indentStr(prop + \": \" + toCssValue(value) + \";\", indent);\n          }\n        }\n      }\n    } else {\n      // Object syntax {fallbacks: {prop: value}}\n      for (var _prop in fallbacks) {\n        var _value = fallbacks[_prop];\n\n        if (_value != null) {\n          if (result) result += '\\n';\n          result += \"\" + indentStr(_prop + \": \" + toCssValue(_value) + \";\", indent);\n        }\n      }\n    }\n  }\n\n  for (var _prop2 in style) {\n    var _value2 = style[_prop2];\n\n    if (_value2 != null && _prop2 !== 'fallbacks') {\n      if (result) result += '\\n';\n      result += \"\" + indentStr(_prop2 + \": \" + toCssValue(_value2) + \";\", indent);\n    }\n  } // Allow empty style in this case, because properties will be added dynamically.\n\n\n  if (!result && !options.allowEmpty) return result; // When rule is being stringified before selector was defined.\n\n  if (!selector) return result;\n  indent--;\n  if (result) result = \"\\n\" + result + \"\\n\";\n  return indentStr(selector + \" {\" + result, indent) + indentStr('}', indent);\n}\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`\\s])/g;\nvar nativeEscape = typeof CSS !== 'undefined' && CSS.escape;\nvar escape = (function (str) {\n  return nativeEscape ? nativeEscape(str) : str.replace(escapeRegex, '\\\\$1');\n});\n\nvar BaseStyleRule =\n/*#__PURE__*/\nfunction () {\n  function BaseStyleRule(key, style, options) {\n    this.type = 'style';\n    this.key = void 0;\n    this.isProcessed = false;\n    this.style = void 0;\n    this.renderer = void 0;\n    this.renderable = void 0;\n    this.options = void 0;\n    var sheet = options.sheet,\n        Renderer = options.Renderer;\n    this.key = key;\n    this.options = options;\n    this.style = style;\n    if (sheet) this.renderer = sheet.renderer;else if (Renderer) this.renderer = new Renderer();\n  }\n  /**\n   * Get or set a style property.\n   */\n\n\n  var _proto = BaseStyleRule.prototype;\n\n  _proto.prop = function prop(name, value, options) {\n    // It's a getter.\n    if (value === undefined) return this.style[name]; // Don't do anything if the value has not changed.\n\n    var force = options ? options.force : false;\n    if (!force && this.style[name] === value) return this;\n    var newValue = value;\n\n    if (!options || options.process !== false) {\n      newValue = this.options.jss.plugins.onChangeValue(value, name, this);\n    }\n\n    var isEmpty = newValue == null || newValue === false;\n    var isDefined = name in this.style; // Value is empty and wasn't defined before.\n\n    if (isEmpty && !isDefined && !force) return this; // We are going to remove this value.\n\n    var remove = isEmpty && isDefined;\n    if (remove) delete this.style[name];else this.style[name] = newValue; // Renderable is defined if StyleSheet option `link` is true.\n\n    if (this.renderable && this.renderer) {\n      if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, newValue);\n      return this;\n    }\n\n    var sheet = this.options.sheet;\n\n    if (sheet && sheet.attached) {\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, '[JSS] Rule is not linked. Missing sheet option \"link: true\".') : undefined;\n    }\n\n    return this;\n  };\n\n  return BaseStyleRule;\n}();\nvar StyleRule =\n/*#__PURE__*/\nfunction (_BaseStyleRule) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(StyleRule, _BaseStyleRule);\n\n  function StyleRule(key, style, options) {\n    var _this;\n\n    _this = _BaseStyleRule.call(this, key, style, options) || this;\n    _this.selectorText = void 0;\n    _this.id = void 0;\n    _this.renderable = void 0;\n    var selector = options.selector,\n        scoped = options.scoped,\n        sheet = options.sheet,\n        generateId = options.generateId;\n\n    if (selector) {\n      _this.selectorText = selector;\n    } else if (scoped !== false) {\n      _this.id = generateId(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(_this)), sheet);\n      _this.selectorText = \".\" + escape(_this.id);\n    }\n\n    return _this;\n  }\n  /**\n   * Set selector string.\n   * Attention: use this with caution. Most browsers didn't implement\n   * selectorText setter, so this may result in rerendering of entire Style Sheet.\n   */\n\n\n  var _proto2 = StyleRule.prototype;\n\n  /**\n   * Apply rule to an element inline.\n   */\n  _proto2.applyTo = function applyTo(renderable) {\n    var renderer = this.renderer;\n\n    if (renderer) {\n      var json = this.toJSON();\n\n      for (var prop in json) {\n        renderer.setProperty(renderable, prop, json[prop]);\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Returns JSON representation of the rule.\n   * Fallbacks are not supported.\n   * Useful for inline styles.\n   */\n  ;\n\n  _proto2.toJSON = function toJSON() {\n    var json = {};\n\n    for (var prop in this.style) {\n      var value = this.style[prop];\n      if (typeof value !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = toCssValue(value);\n    }\n\n    return json;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto2.toString = function toString(options) {\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n    var opts = link ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      allowEmpty: true\n    }) : options;\n    return toCss(this.selectorText, this.style, opts);\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(StyleRule, [{\n    key: \"selector\",\n    set: function set(selector) {\n      if (selector === this.selectorText) return;\n      this.selectorText = selector;\n      var renderer = this.renderer,\n          renderable = this.renderable;\n      if (!renderable || !renderer) return;\n      var hasChanged = renderer.setSelector(renderable, selector); // If selector setter is not implemented, rerender the rule.\n\n      if (!hasChanged) {\n        renderer.replaceRule(renderable, this);\n      }\n    }\n    /**\n     * Get selector string.\n     */\n    ,\n    get: function get() {\n      return this.selectorText;\n    }\n  }]);\n\n  return StyleRule;\n}(BaseStyleRule);\nvar pluginStyleRule = {\n  onCreateRule: function onCreateRule(name, style, options) {\n    if (name[0] === '@' || options.parent && options.parent.type === 'keyframes') {\n      return null;\n    }\n\n    return new StyleRule(name, style, options);\n  }\n};\n\nvar defaultToStringOptions = {\n  indent: 1,\n  children: true\n};\nvar atRegExp = /@([\\w-]+)/;\n/**\n * Conditional rule for @media, @supports\n */\n\nvar ConditionalRule =\n/*#__PURE__*/\nfunction () {\n  function ConditionalRule(key, styles, options) {\n    this.type = 'conditional';\n    this.at = void 0;\n    this.key = void 0;\n    this.query = void 0;\n    this.rules = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key; // Key might contain a unique suffix in case the `name` passed by user was duplicate.\n\n    this.query = options.name;\n    var atMatch = key.match(atRegExp);\n    this.at = atMatch ? atMatch[1] : 'unknown';\n    this.options = options;\n    this.rules = new RuleList(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var name in styles) {\n      this.rules.add(name, styles[name]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Get a rule.\n   */\n\n\n  var _proto = ConditionalRule.prototype;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Create and register rule, run plugins.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, style, options) {\n    var rule = this.rules.add(name, style, options);\n    if (!rule) return null;\n    this.options.jss.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    if (options === void 0) {\n      options = defaultToStringOptions;\n    }\n\n    if (options.indent == null) options.indent = defaultToStringOptions.indent;\n    if (options.children == null) options.children = defaultToStringOptions.children;\n\n    if (options.children === false) {\n      return this.query + \" {}\";\n    }\n\n    var children = this.rules.toString(options);\n    return children ? this.query + \" {\\n\" + children + \"\\n}\" : '';\n  };\n\n  return ConditionalRule;\n}();\nvar keyRegExp = /@media|@supports\\s+/;\nvar pluginConditionalRule = {\n  onCreateRule: function onCreateRule(key, styles, options) {\n    return keyRegExp.test(key) ? new ConditionalRule(key, styles, options) : null;\n  }\n};\n\nvar defaultToStringOptions$1 = {\n  indent: 1,\n  children: true\n};\nvar nameRegExp = /@keyframes\\s+([\\w-]+)/;\n/**\n * Rule for @keyframes\n */\n\nvar KeyframesRule =\n/*#__PURE__*/\nfunction () {\n  function KeyframesRule(key, frames, options) {\n    this.type = 'keyframes';\n    this.at = '@keyframes';\n    this.key = void 0;\n    this.name = void 0;\n    this.id = void 0;\n    this.rules = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    var nameMatch = key.match(nameRegExp);\n\n    if (nameMatch && nameMatch[1]) {\n      this.name = nameMatch[1];\n    } else {\n      this.name = 'noname';\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Bad keyframes name \" + key) : undefined;\n    }\n\n    this.key = this.type + \"-\" + this.name;\n    this.options = options;\n    var scoped = options.scoped,\n        sheet = options.sheet,\n        generateId = options.generateId;\n    this.id = scoped === false ? this.name : escape(generateId(this, sheet));\n    this.rules = new RuleList(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var name in frames) {\n      this.rules.add(name, frames[name], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n        parent: this\n      }));\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = KeyframesRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (options === void 0) {\n      options = defaultToStringOptions$1;\n    }\n\n    if (options.indent == null) options.indent = defaultToStringOptions$1.indent;\n    if (options.children == null) options.children = defaultToStringOptions$1.children;\n\n    if (options.children === false) {\n      return this.at + \" \" + this.id + \" {}\";\n    }\n\n    var children = this.rules.toString(options);\n    if (children) children = \"\\n\" + children + \"\\n\";\n    return this.at + \" \" + this.id + \" {\" + children + \"}\";\n  };\n\n  return KeyframesRule;\n}();\nvar keyRegExp$1 = /@keyframes\\s+/;\nvar refRegExp = /\\$([\\w-]+)/g;\n\nvar findReferencedKeyframe = function findReferencedKeyframe(val, keyframes) {\n  if (typeof val === 'string') {\n    return val.replace(refRegExp, function (match, name) {\n      if (name in keyframes) {\n        return keyframes[name];\n      }\n\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Referenced keyframes rule \\\"\" + name + \"\\\" is not defined.\") : undefined;\n      return match;\n    });\n  }\n\n  return val;\n};\n/**\n * Replace the reference for a animation name.\n */\n\n\nvar replaceRef = function replaceRef(style, prop, keyframes) {\n  var value = style[prop];\n  var refKeyframe = findReferencedKeyframe(value, keyframes);\n\n  if (refKeyframe !== value) {\n    style[prop] = refKeyframe;\n  }\n};\n\nvar plugin = {\n  onCreateRule: function onCreateRule(key, frames, options) {\n    return typeof key === 'string' && keyRegExp$1.test(key) ? new KeyframesRule(key, frames, options) : null;\n  },\n  // Animation name ref replacer.\n  onProcessStyle: function onProcessStyle(style, rule, sheet) {\n    if (rule.type !== 'style' || !sheet) return style;\n    if ('animation-name' in style) replaceRef(style, 'animation-name', sheet.keyframes);\n    if ('animation' in style) replaceRef(style, 'animation', sheet.keyframes);\n    return style;\n  },\n  onChangeValue: function onChangeValue(val, prop, rule) {\n    var sheet = rule.options.sheet;\n\n    if (!sheet) {\n      return val;\n    }\n\n    switch (prop) {\n      case 'animation':\n        return findReferencedKeyframe(val, sheet.keyframes);\n\n      case 'animation-name':\n        return findReferencedKeyframe(val, sheet.keyframes);\n\n      default:\n        return val;\n    }\n  }\n};\n\nvar KeyframeRule =\n/*#__PURE__*/\nfunction (_BaseStyleRule) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(KeyframeRule, _BaseStyleRule);\n\n  function KeyframeRule() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _BaseStyleRule.call.apply(_BaseStyleRule, [this].concat(args)) || this;\n    _this.renderable = void 0;\n    return _this;\n  }\n\n  var _proto = KeyframeRule.prototype;\n\n  /**\n   * Generates a CSS string.\n   */\n  _proto.toString = function toString(options) {\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n    var opts = link ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      allowEmpty: true\n    }) : options;\n    return toCss(this.key, this.style, opts);\n  };\n\n  return KeyframeRule;\n}(BaseStyleRule);\nvar pluginKeyframeRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    if (options.parent && options.parent.type === 'keyframes') {\n      return new KeyframeRule(key, style, options);\n    }\n\n    return null;\n  }\n};\n\nvar FontFaceRule =\n/*#__PURE__*/\nfunction () {\n  function FontFaceRule(key, style, options) {\n    this.type = 'font-face';\n    this.at = '@font-face';\n    this.key = void 0;\n    this.style = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.style = style;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = FontFaceRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (Array.isArray(this.style)) {\n      var str = '';\n\n      for (var index = 0; index < this.style.length; index++) {\n        str += toCss(this.at, this.style[index]);\n        if (this.style[index + 1]) str += '\\n';\n      }\n\n      return str;\n    }\n\n    return toCss(this.at, this.style, options);\n  };\n\n  return FontFaceRule;\n}();\nvar keyRegExp$2 = /@font-face/;\nvar pluginFontFaceRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    return keyRegExp$2.test(key) ? new FontFaceRule(key, style, options) : null;\n  }\n};\n\nvar ViewportRule =\n/*#__PURE__*/\nfunction () {\n  function ViewportRule(key, style, options) {\n    this.type = 'viewport';\n    this.at = '@viewport';\n    this.key = void 0;\n    this.style = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.style = style;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = ViewportRule.prototype;\n\n  _proto.toString = function toString(options) {\n    return toCss(this.key, this.style, options);\n  };\n\n  return ViewportRule;\n}();\nvar pluginViewportRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    return key === '@viewport' || key === '@-ms-viewport' ? new ViewportRule(key, style, options) : null;\n  }\n};\n\nvar SimpleRule =\n/*#__PURE__*/\nfunction () {\n  function SimpleRule(key, value, options) {\n    this.type = 'simple';\n    this.key = void 0;\n    this.value = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.value = value;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  // eslint-disable-next-line no-unused-vars\n\n\n  var _proto = SimpleRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (Array.isArray(this.value)) {\n      var str = '';\n\n      for (var index = 0; index < this.value.length; index++) {\n        str += this.key + \" \" + this.value[index] + \";\";\n        if (this.value[index + 1]) str += '\\n';\n      }\n\n      return str;\n    }\n\n    return this.key + \" \" + this.value + \";\";\n  };\n\n  return SimpleRule;\n}();\nvar keysMap = {\n  '@charset': true,\n  '@import': true,\n  '@namespace': true\n};\nvar pluginSimpleRule = {\n  onCreateRule: function onCreateRule(key, value, options) {\n    return key in keysMap ? new SimpleRule(key, value, options) : null;\n  }\n};\n\nvar plugins = [pluginStyleRule, pluginConditionalRule, plugin, pluginKeyframeRule, pluginFontFaceRule, pluginViewportRule, pluginSimpleRule];\n\nvar defaultUpdateOptions = {\n  process: true\n};\nvar forceUpdateOptions = {\n  force: true,\n  process: true\n  /**\n   * Contains rules objects and allows adding/removing etc.\n   * Is used for e.g. by `StyleSheet` or `ConditionalRule`.\n   */\n\n};\n\nvar RuleList =\n/*#__PURE__*/\nfunction () {\n  // Rules registry for access by .get() method.\n  // It contains the same rule registered by name and by selector.\n  // Original styles object.\n  // Used to ensure correct rules order.\n  function RuleList(options) {\n    this.map = {};\n    this.raw = {};\n    this.index = [];\n    this.counter = 0;\n    this.options = void 0;\n    this.classes = void 0;\n    this.keyframes = void 0;\n    this.options = options;\n    this.classes = options.classes;\n    this.keyframes = options.keyframes;\n  }\n  /**\n   * Create and register rule.\n   *\n   * Will not render after Style Sheet was rendered the first time.\n   */\n\n\n  var _proto = RuleList.prototype;\n\n  _proto.add = function add(name, decl, ruleOptions) {\n    var _this$options = this.options,\n        parent = _this$options.parent,\n        sheet = _this$options.sheet,\n        jss = _this$options.jss,\n        Renderer = _this$options.Renderer,\n        generateId = _this$options.generateId,\n        scoped = _this$options.scoped;\n\n    var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      classes: this.classes,\n      parent: parent,\n      sheet: sheet,\n      jss: jss,\n      Renderer: Renderer,\n      generateId: generateId,\n      scoped: scoped,\n      name: name\n    }, ruleOptions); // When user uses .createStyleSheet(), duplicate names are not possible, but\n    // `sheet.addRule()` opens the door for any duplicate rule name. When this happens\n    // we need to make the key unique within this RuleList instance scope.\n\n\n    var key = name;\n\n    if (name in this.raw) {\n      key = name + \"-d\" + this.counter++;\n    } // We need to save the original decl before creating the rule\n    // because cache plugin needs to use it as a key to return a cached rule.\n\n\n    this.raw[key] = decl;\n\n    if (key in this.classes) {\n      // E.g. rules inside of @media container\n      options.selector = \".\" + escape(this.classes[key]);\n    }\n\n    var rule = createRule(key, decl, options);\n    if (!rule) return null;\n    this.register(rule);\n    var index = options.index === undefined ? this.index.length : options.index;\n    this.index.splice(index, 0, rule);\n    return rule;\n  }\n  /**\n   * Get a rule.\n   */\n  ;\n\n  _proto.get = function get(name) {\n    return this.map[name];\n  }\n  /**\n   * Delete a rule.\n   */\n  ;\n\n  _proto.remove = function remove(rule) {\n    this.unregister(rule);\n    delete this.raw[rule.key];\n    this.index.splice(this.index.indexOf(rule), 1);\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.index.indexOf(rule);\n  }\n  /**\n   * Run `onProcessRule()` plugins on every rule.\n   */\n  ;\n\n  _proto.process = function process() {\n    var plugins = this.options.jss.plugins; // We need to clone array because if we modify the index somewhere else during a loop\n    // we end up with very hard-to-track-down side effects.\n\n    this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n  }\n  /**\n   * Register a rule in `.map`, `.classes` and `.keyframes` maps.\n   */\n  ;\n\n  _proto.register = function register(rule) {\n    this.map[rule.key] = rule;\n\n    if (rule instanceof StyleRule) {\n      this.map[rule.selector] = rule;\n      if (rule.id) this.classes[rule.key] = rule.id;\n    } else if (rule instanceof KeyframesRule && this.keyframes) {\n      this.keyframes[rule.name] = rule.id;\n    }\n  }\n  /**\n   * Unregister a rule.\n   */\n  ;\n\n  _proto.unregister = function unregister(rule) {\n    delete this.map[rule.key];\n\n    if (rule instanceof StyleRule) {\n      delete this.map[rule.selector];\n      delete this.classes[rule.key];\n    } else if (rule instanceof KeyframesRule) {\n      delete this.keyframes[rule.name];\n    }\n  }\n  /**\n   * Update the function values with a new data.\n   */\n  ;\n\n  _proto.update = function update() {\n    var name;\n    var data;\n    var options;\n\n    if (typeof (arguments.length <= 0 ? undefined : arguments[0]) === 'string') {\n      name = arguments.length <= 0 ? undefined : arguments[0]; // $FlowFixMe\n\n      data = arguments.length <= 1 ? undefined : arguments[1]; // $FlowFixMe\n\n      options = arguments.length <= 2 ? undefined : arguments[2];\n    } else {\n      data = arguments.length <= 0 ? undefined : arguments[0]; // $FlowFixMe\n\n      options = arguments.length <= 1 ? undefined : arguments[1];\n      name = null;\n    }\n\n    if (name) {\n      this.updateOne(this.map[name], data, options);\n    } else {\n      for (var index = 0; index < this.index.length; index++) {\n        this.updateOne(this.index[index], data, options);\n      }\n    }\n  }\n  /**\n   * Execute plugins, update rule props.\n   */\n  ;\n\n  _proto.updateOne = function updateOne(rule, data, options) {\n    if (options === void 0) {\n      options = defaultUpdateOptions;\n    }\n\n    var _this$options2 = this.options,\n        plugins = _this$options2.jss.plugins,\n        sheet = _this$options2.sheet; // It is a rules container like for e.g. ConditionalRule.\n\n    if (rule.rules instanceof RuleList) {\n      rule.rules.update(data, options);\n      return;\n    }\n\n    var styleRule = rule;\n    var style = styleRule.style;\n    plugins.onUpdate(data, rule, sheet, options); // We rely on a new `style` ref in case it was mutated during onUpdate hook.\n\n    if (options.process && style && style !== styleRule.style) {\n      // We need to run the plugins in case new `style` relies on syntax plugins.\n      plugins.onProcessStyle(styleRule.style, styleRule, sheet); // Update and add props.\n\n      for (var prop in styleRule.style) {\n        var nextValue = styleRule.style[prop];\n        var prevValue = style[prop]; // We need to use `force: true` because `rule.style` has been updated during onUpdate hook, so `rule.prop()` will not update the CSSOM rule.\n        // We do this comparison to avoid unneeded `rule.prop()` calls, since we have the old `style` object here.\n\n        if (nextValue !== prevValue) {\n          styleRule.prop(prop, nextValue, forceUpdateOptions);\n        }\n      } // Remove props.\n\n\n      for (var _prop in style) {\n        var _nextValue = styleRule.style[_prop];\n        var _prevValue = style[_prop]; // We need to use `force: true` because `rule.style` has been updated during onUpdate hook, so `rule.prop()` will not update the CSSOM rule.\n        // We do this comparison to avoid unneeded `rule.prop()` calls, since we have the old `style` object here.\n\n        if (_nextValue == null && _nextValue !== _prevValue) {\n          styleRule.prop(_prop, null, forceUpdateOptions);\n        }\n      }\n    }\n  }\n  /**\n   * Convert rules to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    var str = '';\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n\n    for (var index = 0; index < this.index.length; index++) {\n      var rule = this.index[index];\n      var css = rule.toString(options); // No need to render an empty rule.\n\n      if (!css && !link) continue;\n      if (str) str += '\\n';\n      str += css;\n    }\n\n    return str;\n  };\n\n  return RuleList;\n}();\n\nvar StyleSheet =\n/*#__PURE__*/\nfunction () {\n  function StyleSheet(styles, options) {\n    this.options = void 0;\n    this.deployed = void 0;\n    this.attached = void 0;\n    this.rules = void 0;\n    this.renderer = void 0;\n    this.classes = void 0;\n    this.keyframes = void 0;\n    this.queue = void 0;\n    this.attached = false;\n    this.deployed = false;\n    this.classes = {};\n    this.keyframes = {};\n    this.options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      sheet: this,\n      parent: this,\n      classes: this.classes,\n      keyframes: this.keyframes\n    });\n\n    if (options.Renderer) {\n      this.renderer = new options.Renderer(this);\n    }\n\n    this.rules = new RuleList(this.options);\n\n    for (var name in styles) {\n      this.rules.add(name, styles[name]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Attach renderable to the render tree.\n   */\n\n\n  var _proto = StyleSheet.prototype;\n\n  _proto.attach = function attach() {\n    if (this.attached) return this;\n    if (this.renderer) this.renderer.attach();\n    this.attached = true; // Order is important, because we can't use insertRule API if style element is not attached.\n\n    if (!this.deployed) this.deploy();\n    return this;\n  }\n  /**\n   * Remove renderable from render tree.\n   */\n  ;\n\n  _proto.detach = function detach() {\n    if (!this.attached) return this;\n    if (this.renderer) this.renderer.detach();\n    this.attached = false;\n    return this;\n  }\n  /**\n   * Add a rule to the current stylesheet.\n   * Will insert a rule also after the stylesheet has been rendered first time.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, decl, options) {\n    var queue = this.queue; // Plugins can create rules.\n    // In order to preserve the right order, we need to queue all `.addRule` calls,\n    // which happen after the first `rules.add()` call.\n\n    if (this.attached && !queue) this.queue = [];\n    var rule = this.rules.add(name, decl, options);\n    if (!rule) return null;\n    this.options.jss.plugins.onProcessRule(rule);\n\n    if (this.attached) {\n      if (!this.deployed) return rule; // Don't insert rule directly if there is no stringified version yet.\n      // It will be inserted all together when .attach is called.\n\n      if (queue) queue.push(rule);else {\n        this.insertRule(rule);\n\n        if (this.queue) {\n          this.queue.forEach(this.insertRule, this);\n          this.queue = undefined;\n        }\n      }\n      return rule;\n    } // We can't add rules to a detached style node.\n    // We will redeploy the sheet once user will attach it.\n\n\n    this.deployed = false;\n    return rule;\n  }\n  /**\n   * Insert rule into the StyleSheet\n   */\n  ;\n\n  _proto.insertRule = function insertRule(rule) {\n    if (this.renderer) {\n      this.renderer.insertRule(rule);\n    }\n  }\n  /**\n   * Create and add rules.\n   * Will render also after Style Sheet was rendered the first time.\n   */\n  ;\n\n  _proto.addRules = function addRules(styles, options) {\n    var added = [];\n\n    for (var name in styles) {\n      var rule = this.addRule(name, styles[name], options);\n      if (rule) added.push(rule);\n    }\n\n    return added;\n  }\n  /**\n   * Get a rule by name.\n   */\n  ;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Delete a rule by name.\n   * Returns `true`: if rule has been deleted from the DOM.\n   */\n  ;\n\n  _proto.deleteRule = function deleteRule(name) {\n    var rule = typeof name === 'object' ? name : this.rules.get(name);\n    if (!rule) return false;\n    this.rules.remove(rule);\n\n    if (this.attached && rule.renderable && this.renderer) {\n      return this.renderer.deleteRule(rule.renderable);\n    }\n\n    return true;\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Deploy pure CSS string to a renderable.\n   */\n  ;\n\n  _proto.deploy = function deploy() {\n    if (this.renderer) this.renderer.deploy();\n    this.deployed = true;\n    return this;\n  }\n  /**\n   * Update the function values with a new data.\n   */\n  ;\n\n  _proto.update = function update() {\n    var _this$rules;\n\n    (_this$rules = this.rules).update.apply(_this$rules, arguments);\n\n    return this;\n  }\n  /**\n   * Updates a single rule.\n   */\n  ;\n\n  _proto.updateOne = function updateOne(rule, data, options) {\n    this.rules.updateOne(rule, data, options);\n    return this;\n  }\n  /**\n   * Convert rules to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    return this.rules.toString(options);\n  };\n\n  return StyleSheet;\n}();\n\nvar PluginsRegistry =\n/*#__PURE__*/\nfunction () {\n  function PluginsRegistry() {\n    this.plugins = {\n      internal: [],\n      external: []\n    };\n    this.registry = void 0;\n  }\n\n  var _proto = PluginsRegistry.prototype;\n\n  /**\n   * Call `onCreateRule` hooks and return an object if returned by a hook.\n   */\n  _proto.onCreateRule = function onCreateRule(name, decl, options) {\n    for (var i = 0; i < this.registry.onCreateRule.length; i++) {\n      var rule = this.registry.onCreateRule[i](name, decl, options);\n      if (rule) return rule;\n    }\n\n    return null;\n  }\n  /**\n   * Call `onProcessRule` hooks.\n   */\n  ;\n\n  _proto.onProcessRule = function onProcessRule(rule) {\n    if (rule.isProcessed) return;\n    var sheet = rule.options.sheet;\n\n    for (var i = 0; i < this.registry.onProcessRule.length; i++) {\n      this.registry.onProcessRule[i](rule, sheet);\n    }\n\n    if (rule.style) this.onProcessStyle(rule.style, rule, sheet);\n    rule.isProcessed = true;\n  }\n  /**\n   * Call `onProcessStyle` hooks.\n   */\n  ;\n\n  _proto.onProcessStyle = function onProcessStyle(style, rule, sheet) {\n    for (var i = 0; i < this.registry.onProcessStyle.length; i++) {\n      // $FlowFixMe\n      rule.style = this.registry.onProcessStyle[i](rule.style, rule, sheet);\n    }\n  }\n  /**\n   * Call `onProcessSheet` hooks.\n   */\n  ;\n\n  _proto.onProcessSheet = function onProcessSheet(sheet) {\n    for (var i = 0; i < this.registry.onProcessSheet.length; i++) {\n      this.registry.onProcessSheet[i](sheet);\n    }\n  }\n  /**\n   * Call `onUpdate` hooks.\n   */\n  ;\n\n  _proto.onUpdate = function onUpdate(data, rule, sheet, options) {\n    for (var i = 0; i < this.registry.onUpdate.length; i++) {\n      this.registry.onUpdate[i](data, rule, sheet, options);\n    }\n  }\n  /**\n   * Call `onChangeValue` hooks.\n   */\n  ;\n\n  _proto.onChangeValue = function onChangeValue(value, prop, rule) {\n    var processedValue = value;\n\n    for (var i = 0; i < this.registry.onChangeValue.length; i++) {\n      processedValue = this.registry.onChangeValue[i](processedValue, prop, rule);\n    }\n\n    return processedValue;\n  }\n  /**\n   * Register a plugin.\n   */\n  ;\n\n  _proto.use = function use(newPlugin, options) {\n    if (options === void 0) {\n      options = {\n        queue: 'external'\n      };\n    }\n\n    var plugins = this.plugins[options.queue]; // Avoids applying same plugin twice, at least based on ref.\n\n    if (plugins.indexOf(newPlugin) !== -1) {\n      return;\n    }\n\n    plugins.push(newPlugin);\n    this.registry = [].concat(this.plugins.external, this.plugins.internal).reduce(function (registry, plugin) {\n      for (var name in plugin) {\n        if (name in registry) {\n          registry[name].push(plugin[name]);\n        } else {\n           true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Unknown hook \\\"\" + name + \"\\\".\") : undefined;\n        }\n      }\n\n      return registry;\n    }, {\n      onCreateRule: [],\n      onProcessRule: [],\n      onProcessStyle: [],\n      onProcessSheet: [],\n      onChangeValue: [],\n      onUpdate: []\n    });\n  };\n\n  return PluginsRegistry;\n}();\n\n/**\n * Sheets registry to access them all at one place.\n */\nvar SheetsRegistry =\n/*#__PURE__*/\nfunction () {\n  function SheetsRegistry() {\n    this.registry = [];\n  }\n\n  var _proto = SheetsRegistry.prototype;\n\n  /**\n   * Register a Style Sheet.\n   */\n  _proto.add = function add(sheet) {\n    var registry = this.registry;\n    var index = sheet.options.index;\n    if (registry.indexOf(sheet) !== -1) return;\n\n    if (registry.length === 0 || index >= this.index) {\n      registry.push(sheet);\n      return;\n    } // Find a position.\n\n\n    for (var i = 0; i < registry.length; i++) {\n      if (registry[i].options.index > index) {\n        registry.splice(i, 0, sheet);\n        return;\n      }\n    }\n  }\n  /**\n   * Reset the registry.\n   */\n  ;\n\n  _proto.reset = function reset() {\n    this.registry = [];\n  }\n  /**\n   * Remove a Style Sheet.\n   */\n  ;\n\n  _proto.remove = function remove(sheet) {\n    var index = this.registry.indexOf(sheet);\n    this.registry.splice(index, 1);\n  }\n  /**\n   * Convert all attached sheets to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n        attached = _ref.attached,\n        options = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(_ref, [\"attached\"]);\n\n    var css = '';\n\n    for (var i = 0; i < this.registry.length; i++) {\n      var sheet = this.registry[i];\n\n      if (attached != null && sheet.attached !== attached) {\n        continue;\n      }\n\n      if (css) css += '\\n';\n      css += sheet.toString(options);\n    }\n\n    return css;\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(SheetsRegistry, [{\n    key: \"index\",\n\n    /**\n     * Current highest index number.\n     */\n    get: function get() {\n      return this.registry.length === 0 ? 0 : this.registry[this.registry.length - 1].options.index;\n    }\n  }]);\n\n  return SheetsRegistry;\n}();\n\n/**\n * This is a global sheets registry. Only DomRenderer will add sheets to it.\n * On the server one should use an own SheetsRegistry instance and add the\n * sheets to it, because you need to make sure to create a new registry for\n * each request in order to not leak sheets across requests.\n */\n\nvar sheets = new SheetsRegistry();\n\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar globalThis = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\n\nvar ns = '2f1acc6c3a606b082e5eef5e54414ffb';\nif (globalThis[ns] == null) globalThis[ns] = 0; // Bundle may contain multiple JSS versions at the same time. In order to identify\n// the current version with just one short number and use it for classes generation\n// we use a counter. Also it is more accurate, because user can manually reevaluate\n// the module.\n\nvar moduleId = globalThis[ns]++;\n\nvar maxRules = 1e10;\n\n/**\n * Returns a function which generates unique class names based on counters.\n * When new generator function is created, rule counter is reseted.\n * We need to reset the rule counter for SSR for each request.\n */\nvar createGenerateId = function createGenerateId(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var ruleCounter = 0;\n  return function (rule, sheet) {\n    ruleCounter += 1;\n\n    if (ruleCounter > maxRules) {\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] You might have a memory leak. Rule counter is at \" + ruleCounter + \".\") : undefined;\n    }\n\n    var jssId = '';\n    var prefix = '';\n\n    if (sheet) {\n      if (sheet.options.classNamePrefix) {\n        prefix = sheet.options.classNamePrefix;\n      }\n\n      if (sheet.options.jss.id != null) {\n        jssId = String(sheet.options.jss.id);\n      }\n    }\n\n    if (options.minify) {\n      // Using \"c\" because a number can't be the first char in a class name.\n      return \"\" + (prefix || 'c') + moduleId + jssId + ruleCounter;\n    }\n\n    return prefix + rule.key + \"-\" + moduleId + (jssId ? \"-\" + jssId : '') + \"-\" + ruleCounter;\n  };\n};\n\n/**\n * Cache the value from the first time a function is called.\n */\nvar memoize = function memoize(fn) {\n  var value;\n  return function () {\n    if (!value) value = fn();\n    return value;\n  };\n};\n/**\n * Get a style property value.\n */\n\n\nfunction getPropertyValue(cssRule, prop) {\n  try {\n    // Support CSSTOM.\n    if (cssRule.attributeStyleMap) {\n      return cssRule.attributeStyleMap.get(prop);\n    }\n\n    return cssRule.style.getPropertyValue(prop);\n  } catch (err) {\n    // IE may throw if property is unknown.\n    return '';\n  }\n}\n/**\n * Set a style property.\n */\n\n\nfunction setProperty(cssRule, prop, value) {\n  try {\n    var cssValue = value;\n\n    if (Array.isArray(value)) {\n      cssValue = toCssValue(value, true);\n\n      if (value[value.length - 1] === '!important') {\n        cssRule.style.setProperty(prop, cssValue, 'important');\n        return true;\n      }\n    } // Support CSSTOM.\n\n\n    if (cssRule.attributeStyleMap) {\n      cssRule.attributeStyleMap.set(prop, cssValue);\n    } else {\n      cssRule.style.setProperty(prop, cssValue);\n    }\n  } catch (err) {\n    // IE may throw if property is unknown.\n    return false;\n  }\n\n  return true;\n}\n/**\n * Remove a style property.\n */\n\n\nfunction removeProperty(cssRule, prop) {\n  try {\n    // Support CSSTOM.\n    if (cssRule.attributeStyleMap) {\n      cssRule.attributeStyleMap.delete(prop);\n    } else {\n      cssRule.style.removeProperty(prop);\n    }\n  } catch (err) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] DOMException \\\"\" + err.message + \"\\\" was thrown. Tried to remove property \\\"\" + prop + \"\\\".\") : undefined;\n  }\n}\n/**\n * Set the selector.\n */\n\n\nfunction setSelector(cssRule, selectorText) {\n  cssRule.selectorText = selectorText; // Return false if setter was not successful.\n  // Currently works in chrome only.\n\n  return cssRule.selectorText === selectorText;\n}\n/**\n * Gets the `head` element upon the first call and caches it.\n * We assume it can't be null.\n */\n\n\nvar getHead = memoize(function () {\n  return document.querySelector('head');\n});\n/**\n * Find attached sheet with an index higher than the passed one.\n */\n\nfunction findHigherSheet(registry, options) {\n  for (var i = 0; i < registry.length; i++) {\n    var sheet = registry[i];\n\n    if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) {\n      return sheet;\n    }\n  }\n\n  return null;\n}\n/**\n * Find attached sheet with the highest index.\n */\n\n\nfunction findHighestSheet(registry, options) {\n  for (var i = registry.length - 1; i >= 0; i--) {\n    var sheet = registry[i];\n\n    if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) {\n      return sheet;\n    }\n  }\n\n  return null;\n}\n/**\n * Find a comment with \"jss\" inside.\n */\n\n\nfunction findCommentNode(text) {\n  var head = getHead();\n\n  for (var i = 0; i < head.childNodes.length; i++) {\n    var node = head.childNodes[i];\n\n    if (node.nodeType === 8 && node.nodeValue.trim() === text) {\n      return node;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Find a node before which we can insert the sheet.\n */\nfunction findPrevNode(options) {\n  var registry = sheets.registry;\n\n  if (registry.length > 0) {\n    // Try to insert before the next higher sheet.\n    var sheet = findHigherSheet(registry, options);\n\n    if (sheet && sheet.renderer) {\n      return {\n        parent: sheet.renderer.element.parentNode,\n        node: sheet.renderer.element\n      };\n    } // Otherwise insert after the last attached.\n\n\n    sheet = findHighestSheet(registry, options);\n\n    if (sheet && sheet.renderer) {\n      return {\n        parent: sheet.renderer.element.parentNode,\n        node: sheet.renderer.element.nextSibling\n      };\n    }\n  } // Try to find a comment placeholder if registry is empty.\n\n\n  var insertionPoint = options.insertionPoint;\n\n  if (insertionPoint && typeof insertionPoint === 'string') {\n    var comment = findCommentNode(insertionPoint);\n\n    if (comment) {\n      return {\n        parent: comment.parentNode,\n        node: comment.nextSibling\n      };\n    } // If user specifies an insertion point and it can't be found in the document -\n    // bad specificity issues may appear.\n\n\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Insertion point \\\"\" + insertionPoint + \"\\\" not found.\") : undefined;\n  }\n\n  return false;\n}\n/**\n * Insert style element into the DOM.\n */\n\n\nfunction insertStyle(style, options) {\n  var insertionPoint = options.insertionPoint;\n  var nextNode = findPrevNode(options);\n\n  if (nextNode !== false && nextNode.parent) {\n    nextNode.parent.insertBefore(style, nextNode.node);\n    return;\n  } // Works with iframes and any node types.\n\n\n  if (insertionPoint && typeof insertionPoint.nodeType === 'number') {\n    // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n    var insertionPointElement = insertionPoint;\n    var parentNode = insertionPointElement.parentNode;\n    if (parentNode) parentNode.insertBefore(style, insertionPointElement.nextSibling);else  true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, '[JSS] Insertion point is not in the DOM.') : undefined;\n    return;\n  }\n\n  getHead().appendChild(style);\n}\n/**\n * Read jss nonce setting from the page if the user has set it.\n */\n\n\nvar getNonce = memoize(function () {\n  var node = document.querySelector('meta[property=\"csp-nonce\"]');\n  return node ? node.getAttribute('content') : null;\n});\n\nvar _insertRule = function insertRule(container, rule, index) {\n  var maxIndex = container.cssRules.length; // In case previous insertion fails, passed index might be wrong\n\n  if (index === undefined || index > maxIndex) {\n    // eslint-disable-next-line no-param-reassign\n    index = maxIndex;\n  }\n\n  try {\n    if ('insertRule' in container) {\n      var c = container;\n      c.insertRule(rule, index);\n    } // Keyframes rule.\n    else if ('appendRule' in container) {\n        var _c = container;\n\n        _c.appendRule(rule);\n      }\n  } catch (err) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] \" + err.message) : undefined;\n    return false;\n  }\n\n  return container.cssRules[index];\n};\n\nvar createStyle = function createStyle() {\n  var el = document.createElement('style'); // Without it, IE will have a broken source order specificity if we\n  // insert rules after we insert the style tag.\n  // It seems to kick-off the source order specificity algorithm.\n\n  el.textContent = '\\n';\n  return el;\n};\n\nvar DomRenderer =\n/*#__PURE__*/\nfunction () {\n  // HTMLStyleElement needs fixing https://github.com/facebook/flow/issues/2696\n  function DomRenderer(sheet) {\n    this.getPropertyValue = getPropertyValue;\n    this.setProperty = setProperty;\n    this.removeProperty = removeProperty;\n    this.setSelector = setSelector;\n    this.element = void 0;\n    this.sheet = void 0;\n    this.hasInsertedRules = false;\n    // There is no sheet when the renderer is used from a standalone StyleRule.\n    if (sheet) sheets.add(sheet);\n    this.sheet = sheet;\n\n    var _ref = this.sheet ? this.sheet.options : {},\n        media = _ref.media,\n        meta = _ref.meta,\n        element = _ref.element;\n\n    this.element = element || createStyle();\n    this.element.setAttribute('data-jss', '');\n    if (media) this.element.setAttribute('media', media);\n    if (meta) this.element.setAttribute('data-meta', meta);\n    var nonce = getNonce();\n    if (nonce) this.element.setAttribute('nonce', nonce);\n  }\n  /**\n   * Insert style element into render tree.\n   */\n\n\n  var _proto = DomRenderer.prototype;\n\n  _proto.attach = function attach() {\n    // In the case the element node is external and it is already in the DOM.\n    if (this.element.parentNode || !this.sheet) return;\n    insertStyle(this.element, this.sheet.options); // When rules are inserted using `insertRule` API, after `sheet.detach().attach()`\n    // most browsers create a new CSSStyleSheet, except of all IEs.\n\n    var deployed = Boolean(this.sheet && this.sheet.deployed);\n\n    if (this.hasInsertedRules && deployed) {\n      this.hasInsertedRules = false;\n      this.deploy();\n    }\n  }\n  /**\n   * Remove style element from render tree.\n   */\n  ;\n\n  _proto.detach = function detach() {\n    var parentNode = this.element.parentNode;\n    if (parentNode) parentNode.removeChild(this.element);\n  }\n  /**\n   * Inject CSS string into element.\n   */\n  ;\n\n  _proto.deploy = function deploy() {\n    var sheet = this.sheet;\n    if (!sheet) return;\n\n    if (sheet.options.link) {\n      this.insertRules(sheet.rules);\n      return;\n    }\n\n    this.element.textContent = \"\\n\" + sheet.toString() + \"\\n\";\n  }\n  /**\n   * Insert RuleList into an element.\n   */\n  ;\n\n  _proto.insertRules = function insertRules(rules, nativeParent) {\n    for (var i = 0; i < rules.index.length; i++) {\n      this.insertRule(rules.index[i], i, nativeParent);\n    }\n  }\n  /**\n   * Insert a rule into element.\n   */\n  ;\n\n  _proto.insertRule = function insertRule(rule, index, nativeParent) {\n    if (nativeParent === void 0) {\n      nativeParent = this.element.sheet;\n    }\n\n    if (rule.rules) {\n      var parent = rule;\n      var latestNativeParent = nativeParent;\n\n      if (rule.type === 'conditional' || rule.type === 'keyframes') {\n        // We need to render the container without children first.\n        latestNativeParent = _insertRule(nativeParent, parent.toString({\n          children: false\n        }), index);\n\n        if (latestNativeParent === false) {\n          return false;\n        }\n      }\n\n      this.insertRules(parent.rules, latestNativeParent);\n      return latestNativeParent;\n    } // IE keeps the CSSStyleSheet after style node has been reattached,\n    // so we need to check if the `renderable` reference the right style sheet and not\n    // rerender those rules.\n\n\n    if (rule.renderable && rule.renderable.parentStyleSheet === this.element.sheet) {\n      return rule.renderable;\n    }\n\n    var ruleStr = rule.toString();\n    if (!ruleStr) return false;\n\n    var nativeRule = _insertRule(nativeParent, ruleStr, index);\n\n    if (nativeRule === false) {\n      return false;\n    }\n\n    this.hasInsertedRules = true;\n    rule.renderable = nativeRule;\n    return nativeRule;\n  }\n  /**\n   * Delete a rule.\n   */\n  ;\n\n  _proto.deleteRule = function deleteRule(cssRule) {\n    var sheet = this.element.sheet;\n    var index = this.indexOf(cssRule);\n    if (index === -1) return false;\n    sheet.deleteRule(index);\n    return true;\n  }\n  /**\n   * Get index of a CSS Rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(cssRule) {\n    var cssRules = this.element.sheet.cssRules;\n\n    for (var index = 0; index < cssRules.length; index++) {\n      if (cssRule === cssRules[index]) return index;\n    }\n\n    return -1;\n  }\n  /**\n   * Generate a new CSS rule and replace the existing one.\n   *\n   * Only used for some old browsers because they can't set a selector.\n   */\n  ;\n\n  _proto.replaceRule = function replaceRule(cssRule, rule) {\n    var index = this.indexOf(cssRule);\n    if (index === -1) return false;\n    this.element.sheet.deleteRule(index);\n    return this.insertRule(rule, index);\n  }\n  /**\n   * Get all rules elements.\n   */\n  ;\n\n  _proto.getRules = function getRules() {\n    return this.element.sheet.cssRules;\n  };\n\n  return DomRenderer;\n}();\n\nvar instanceCounter = 0;\n\nvar Jss =\n/*#__PURE__*/\nfunction () {\n  function Jss(options) {\n    this.id = instanceCounter++;\n    this.version = \"10.3.0\";\n    this.plugins = new PluginsRegistry();\n    this.options = {\n      id: {\n        minify: false\n      },\n      createGenerateId: createGenerateId,\n      Renderer: is_in_browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"] ? DomRenderer : null,\n      plugins: []\n    };\n    this.generateId = createGenerateId({\n      minify: false\n    });\n\n    for (var i = 0; i < plugins.length; i++) {\n      this.plugins.use(plugins[i], {\n        queue: 'internal'\n      });\n    }\n\n    this.setup(options);\n  }\n  /**\n   * Prepares various options, applies plugins.\n   * Should not be used twice on the same instance, because there is no plugins\n   * deduplication logic.\n   */\n\n\n  var _proto = Jss.prototype;\n\n  _proto.setup = function setup(options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    if (options.createGenerateId) {\n      this.options.createGenerateId = options.createGenerateId;\n    }\n\n    if (options.id) {\n      this.options.id = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, this.options.id, options.id);\n    }\n\n    if (options.createGenerateId || options.id) {\n      this.generateId = this.options.createGenerateId(this.options.id);\n    }\n\n    if (options.insertionPoint != null) this.options.insertionPoint = options.insertionPoint;\n\n    if ('Renderer' in options) {\n      this.options.Renderer = options.Renderer;\n    } // eslint-disable-next-line prefer-spread\n\n\n    if (options.plugins) this.use.apply(this, options.plugins);\n    return this;\n  }\n  /**\n   * Create a Style Sheet.\n   */\n  ;\n\n  _proto.createStyleSheet = function createStyleSheet(styles, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        index = _options.index;\n\n    if (typeof index !== 'number') {\n      index = sheets.index === 0 ? 0 : sheets.index + 1;\n    }\n\n    var sheet = new StyleSheet(styles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      jss: this,\n      generateId: options.generateId || this.generateId,\n      insertionPoint: this.options.insertionPoint,\n      Renderer: this.options.Renderer,\n      index: index\n    }));\n    this.plugins.onProcessSheet(sheet);\n    return sheet;\n  }\n  /**\n   * Detach the Style Sheet and remove it from the registry.\n   */\n  ;\n\n  _proto.removeStyleSheet = function removeStyleSheet(sheet) {\n    sheet.detach();\n    sheets.remove(sheet);\n    return this;\n  }\n  /**\n   * Create a rule without a Style Sheet.\n   * [Deprecated] will be removed in the next major version.\n   */\n  ;\n\n  _proto.createRule = function createRule$1(name, style, options) {\n    if (style === void 0) {\n      style = {};\n    }\n\n    if (options === void 0) {\n      options = {};\n    }\n\n    // Enable rule without name for inline styles.\n    if (typeof name === 'object') {\n      return this.createRule(undefined, name, style);\n    }\n\n    var ruleOptions = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      name: name,\n      jss: this,\n      Renderer: this.options.Renderer\n    });\n\n    if (!ruleOptions.generateId) ruleOptions.generateId = this.generateId;\n    if (!ruleOptions.classes) ruleOptions.classes = {};\n    if (!ruleOptions.keyframes) ruleOptions.keyframes = {};\n\n    var rule = createRule(name, style, ruleOptions);\n\n    if (rule) this.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Register plugin. Passed function will be invoked with a rule instance.\n   */\n  ;\n\n  _proto.use = function use() {\n    var _this = this;\n\n    for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n      plugins[_key] = arguments[_key];\n    }\n\n    plugins.forEach(function (plugin) {\n      _this.plugins.use(plugin);\n    });\n    return this;\n  };\n\n  return Jss;\n}();\n\n/**\n * Extracts a styles object with only props that contain function values.\n */\nfunction getDynamicStyles(styles) {\n  var to = null;\n\n  for (var key in styles) {\n    var value = styles[key];\n    var type = typeof value;\n\n    if (type === 'function') {\n      if (!to) to = {};\n      to[key] = value;\n    } else if (type === 'object' && value !== null && !Array.isArray(value)) {\n      var extracted = getDynamicStyles(value);\n\n      if (extracted) {\n        if (!to) to = {};\n        to[key] = extracted;\n      }\n    }\n  }\n\n  return to;\n}\n\n/**\n * SheetsManager is like a WeakMap which is designed to count StyleSheet\n * instances and attach/detach automatically.\n */\nvar SheetsManager =\n/*#__PURE__*/\nfunction () {\n  function SheetsManager() {\n    this.length = 0;\n    this.sheets = new WeakMap();\n  }\n\n  var _proto = SheetsManager.prototype;\n\n  _proto.get = function get(key) {\n    var entry = this.sheets.get(key);\n    return entry && entry.sheet;\n  };\n\n  _proto.add = function add(key, sheet) {\n    if (this.sheets.has(key)) return;\n    this.length++;\n    this.sheets.set(key, {\n      sheet: sheet,\n      refs: 0\n    });\n  };\n\n  _proto.manage = function manage(key) {\n    var entry = this.sheets.get(key);\n\n    if (entry) {\n      if (entry.refs === 0) {\n        entry.sheet.attach();\n      }\n\n      entry.refs++;\n      return entry.sheet;\n    }\n\n    Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] SheetsManager: can't find sheet to manage\");\n    return undefined;\n  };\n\n  _proto.unmanage = function unmanage(key) {\n    var entry = this.sheets.get(key);\n\n    if (entry) {\n      if (entry.refs > 0) {\n        entry.refs--;\n        if (entry.refs === 0) entry.sheet.detach();\n      }\n    } else {\n      Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"SheetsManager: can't find sheet to unmanage\");\n    }\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(SheetsManager, [{\n    key: \"size\",\n    get: function get() {\n      return this.length;\n    }\n  }]);\n\n  return SheetsManager;\n}();\n\n/**\n * A better abstraction over CSS.\n *\n * @copyright Oleg Isonen (Slobodskoi) / Isonen 2014-present\n * @website https://github.com/cssinjs/jss\n * @license MIT\n */\n\n/**\n * Export a constant indicating if this browser has CSSTOM support.\n * https://developers.google.com/web/updates/2018/03/cssom\n */\nvar hasCSSTOMSupport = typeof CSS !== 'undefined' && CSS && 'number' in CSS;\n/**\n * Creates a new instance of Jss.\n */\n\nvar create = function create(options) {\n  return new Jss(options);\n};\n/**\n * A global Jss instance.\n */\n\nvar index = create();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss/dist/jss.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n\n\n\n\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {};\n\nfunction getUniqueId() {\n  var key = '__global_unique_id__';\n  return commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1;\n}\n\nfunction objectIs(x, y) {\n  if (x === y) {\n    return x !== 0 || 1 / x === 1 / y;\n  } else {\n    return x !== x && y !== y;\n  }\n}\n\nfunction createEventEmitter(value) {\n  var handlers = [];\n  return {\n    on: function on(handler) {\n      handlers.push(handler);\n    },\n    off: function off(handler) {\n      handlers = handlers.filter(function (h) {\n        return h !== handler;\n      });\n    },\n    get: function get() {\n      return value;\n    },\n    set: function set(newValue, changedBits) {\n      value = newValue;\n      handlers.forEach(function (handler) {\n        return handler(value, changedBits);\n      });\n    }\n  };\n}\n\nfunction onlyChild(children) {\n  return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n  var _Provider$childContex, _Consumer$contextType;\n\n  var contextProp = '__create-react-context-' + getUniqueId() + '__';\n\n  var Provider = /*#__PURE__*/function (_Component) {\n    Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Provider, _Component);\n\n    function Provider() {\n      var _this;\n\n      _this = _Component.apply(this, arguments) || this;\n      _this.emitter = createEventEmitter(_this.props.value);\n      return _this;\n    }\n\n    var _proto = Provider.prototype;\n\n    _proto.getChildContext = function getChildContext() {\n      var _ref;\n\n      return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n    };\n\n    _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      if (this.props.value !== nextProps.value) {\n        var oldValue = this.props.value;\n        var newValue = nextProps.value;\n        var changedBits;\n\n        if (objectIs(oldValue, newValue)) {\n          changedBits = 0;\n        } else {\n          changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n          if (true) {\n            Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: ' + changedBits);\n          }\n\n          changedBits |= 0;\n\n          if (changedBits !== 0) {\n            this.emitter.set(nextProps.value, changedBits);\n          }\n        }\n      }\n    };\n\n    _proto.render = function render() {\n      return this.props.children;\n    };\n\n    return Provider;\n  }(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n  Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object.isRequired, _Provider$childContex);\n\n  var Consumer = /*#__PURE__*/function (_Component2) {\n    Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Consumer, _Component2);\n\n    function Consumer() {\n      var _this2;\n\n      _this2 = _Component2.apply(this, arguments) || this;\n      _this2.state = {\n        value: _this2.getValue()\n      };\n\n      _this2.onUpdate = function (newValue, changedBits) {\n        var observedBits = _this2.observedBits | 0;\n\n        if ((observedBits & changedBits) !== 0) {\n          _this2.setState({\n            value: _this2.getValue()\n          });\n        }\n      };\n\n      return _this2;\n    }\n\n    var _proto2 = Consumer.prototype;\n\n    _proto2.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      var observedBits = nextProps.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentDidMount = function componentDidMount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].on(this.onUpdate);\n      }\n\n      var observedBits = this.props.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentWillUnmount = function componentWillUnmount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].off(this.onUpdate);\n      }\n    };\n\n    _proto2.getValue = function getValue() {\n      if (this.context[contextProp]) {\n        return this.context[contextProp].get();\n      } else {\n        return defaultValue;\n      }\n    };\n\n    _proto2.render = function render() {\n      return onlyChild(this.props.children)(this.state.value);\n    };\n\n    return Consumer;\n  }(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n  Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object, _Consumer$contextType);\n  return {\n    Provider: Provider,\n    Consumer: Consumer\n  };\n}\n\nvar index = react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext || createReactContext;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/ms/index.js":
-/*!**********************************************!*\
-  !*** ./jaas-client/node_modules/ms/index.js ***!
-  \**********************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/ms/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/object-assign/index.js":
-/*!*********************************************************!*\
-  !*** ./jaas-client/node_modules/object-assign/index.js ***!
-  \*********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/object-assign/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/parseqs/index.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/node_modules/parseqs/index.js ***!
-  \***************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\r\n * Compiles a querystring\r\n * Returns string representation of the object\r\n *\r\n * @param {Object}\r\n * @api private\r\n */\r\n\r\nexports.encode = function (obj) {\r\n  var str = '';\r\n\r\n  for (var i in obj) {\r\n    if (obj.hasOwnProperty(i)) {\r\n      if (str.length) str += '&';\r\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\r\n    }\r\n  }\r\n\r\n  return str;\r\n};\r\n\r\n/**\r\n * Parses a simple querystring into an object\r\n *\r\n * @param {String} qs\r\n * @api private\r\n */\r\n\r\nexports.decode = function(qs){\r\n  var qry = {};\r\n  var pairs = qs.split('&');\r\n  for (var i = 0, l = pairs.length; i < l; i++) {\r\n    var pair = pairs[i].split('=');\r\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n  }\r\n  return qry;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/parseqs/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/parseuri/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/parseuri/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\r\n * Parses an URI\r\n *\r\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\r\n * @api private\r\n */\r\n\r\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\r\n\r\nvar parts = [\r\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\r\n];\r\n\r\nmodule.exports = function parseuri(str) {\r\n    var src = str,\r\n        b = str.indexOf('['),\r\n        e = str.indexOf(']');\r\n\r\n    if (b != -1 && e != -1) {\r\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\r\n    }\r\n\r\n    var m = re.exec(str || ''),\r\n        uri = {},\r\n        i = 14;\r\n\r\n    while (i--) {\r\n        uri[parts[i]] = m[i] || '';\r\n    }\r\n\r\n    if (b != -1 && e != -1) {\r\n        uri.source = src;\r\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\r\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\r\n        uri.ipv6uri = true;\r\n    }\r\n\r\n    return uri;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/parseuri/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/path-to-regexp/index.js":
-/*!**********************************************************!*\
-  !*** ./jaas-client/node_modules/path-to-regexp/index.js ***!
-  \**********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("var isarray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/isarray/index.js\")\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = []\n  var key = 0\n  var index = 0\n  var path = ''\n  var defaultDelimiter = options && options.delimiter || '/'\n  var res\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0]\n    var escaped = res[1]\n    var offset = res.index\n    path += str.slice(index, offset)\n    index = offset + m.length\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1]\n      continue\n    }\n\n    var next = str[index]\n    var prefix = res[2]\n    var name = res[3]\n    var capture = res[4]\n    var group = res[5]\n    var modifier = res[6]\n    var asterisk = res[7]\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path)\n      path = ''\n    }\n\n    var partial = prefix != null && next != null && next !== prefix\n    var repeat = modifier === '+' || modifier === '*'\n    var optional = modifier === '?' || modifier === '*'\n    var delimiter = res[2] || defaultDelimiter\n    var pattern = capture || group\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n    })\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index)\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path)\n  }\n\n  return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length)\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))\n    }\n  }\n\n  return function (obj, opts) {\n    var path = ''\n    var data = obj || {}\n    var options = opts || {}\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i]\n\n      if (typeof token === 'string') {\n        path += token\n\n        continue\n      }\n\n      var value = data[token.name]\n      var segment\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j])\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g)\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      })\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = []\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source)\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  var strict = options.strict\n  var end = options.end !== false\n  var route = ''\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i]\n\n    if (typeof token === 'string') {\n      route += escapeString(token)\n    } else {\n      var prefix = escapeString(token.prefix)\n      var capture = '(?:' + token.pattern + ')'\n\n      keys.push(token)\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*'\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?'\n        } else {\n          capture = prefix + '(' + capture + ')?'\n        }\n      } else {\n        capture = prefix + '(' + capture + ')'\n      }\n\n      route += capture\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/')\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n  }\n\n  if (end) {\n    route += '$'\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/path-to-regexp/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/checkPropTypes.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/checkPropTypes.js ***!
-  \***************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar printWarning = function() {};\n\nif (true) {\n  var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ \"./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js\");\n  var loggedTypeFailures = {};\n  var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n  printWarning = function(text) {\n    var message = 'Warning: ' + text;\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n  if (true) {\n    for (var typeSpecName in typeSpecs) {\n      if (has(typeSpecs, typeSpecName)) {\n        var error;\n        // Prop type validation may throw. In case they do, we don't want to\n        // fail the render phase where it didn't fail before. So we log it.\n        // After these have been cleaned up, we'll let them throw.\n        try {\n          // This is intentionally an invariant that gets caught. It's the same\n          // behavior as without this statement except with a better message.\n          if (typeof typeSpecs[typeSpecName] !== 'function') {\n            var err = Error(\n              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n            );\n            err.name = 'Invariant Violation';\n            throw err;\n          }\n          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n        } catch (ex) {\n          error = ex;\n        }\n        if (error && !(error instanceof Error)) {\n          printWarning(\n            (componentName || 'React class') + ': type specification of ' +\n            location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n            'You may have forgotten to pass an argument to the type checker ' +\n            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n            'shape all require an argument).'\n          );\n        }\n        if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n          // Only monitor this failure once because there tends to be a lot of the\n          // same error.\n          loggedTypeFailures[error.message] = true;\n\n          var stack = getStack ? getStack() : '';\n\n          printWarning(\n            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n          );\n        }\n      }\n    }\n  }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n  if (true) {\n    loggedTypeFailures = {};\n  }\n}\n\nmodule.exports = checkPropTypes;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/checkPropTypes.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js ***!
-  \************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\nvar assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\n\nvar ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ \"./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js\");\nvar checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\n\nvar has = Function.call.bind(Object.prototype.hasOwnProperty);\nvar printWarning = function() {};\n\nif (true) {\n  printWarning = function(text) {\n    var message = 'Warning: ' + text;\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n  return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n  /* global Symbol */\n  var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n  var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n  /**\n   * Returns the iterator method function contained on the iterable object.\n   *\n   * Be sure to invoke the function with the iterable as context:\n   *\n   *     var iteratorFn = getIteratorFn(myIterable);\n   *     if (iteratorFn) {\n   *       var iterator = iteratorFn.call(myIterable);\n   *       ...\n   *     }\n   *\n   * @param {?object} maybeIterable\n   * @return {?function}\n   */\n  function getIteratorFn(maybeIterable) {\n    var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n    if (typeof iteratorFn === 'function') {\n      return iteratorFn;\n    }\n  }\n\n  /**\n   * Collection of methods that allow declaration and validation of props that are\n   * supplied to React components. Example usage:\n   *\n   *   var Props = require('ReactPropTypes');\n   *   var MyArticle = React.createClass({\n   *     propTypes: {\n   *       // An optional string prop named \"description\".\n   *       description: Props.string,\n   *\n   *       // A required enum prop named \"category\".\n   *       category: Props.oneOf(['News','Photos']).isRequired,\n   *\n   *       // A prop named \"dialog\" that requires an instance of Dialog.\n   *       dialog: Props.instanceOf(Dialog).isRequired\n   *     },\n   *     render: function() { ... }\n   *   });\n   *\n   * A more formal specification of how these methods are used:\n   *\n   *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n   *   decl := ReactPropTypes.{type}(.isRequired)?\n   *\n   * Each and every declaration produces a function with the same signature. This\n   * allows the creation of custom validation functions. For example:\n   *\n   *  var MyLink = React.createClass({\n   *    propTypes: {\n   *      // An optional string or URI prop named \"href\".\n   *      href: function(props, propName, componentName) {\n   *        var propValue = props[propName];\n   *        if (propValue != null && typeof propValue !== 'string' &&\n   *            !(propValue instanceof URI)) {\n   *          return new Error(\n   *            'Expected a string or an URI for ' + propName + ' in ' +\n   *            componentName\n   *          );\n   *        }\n   *      }\n   *    },\n   *    render: function() {...}\n   *  });\n   *\n   * @internal\n   */\n\n  var ANONYMOUS = '<<anonymous>>';\n\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n  var ReactPropTypes = {\n    array: createPrimitiveTypeChecker('array'),\n    bool: createPrimitiveTypeChecker('boolean'),\n    func: createPrimitiveTypeChecker('function'),\n    number: createPrimitiveTypeChecker('number'),\n    object: createPrimitiveTypeChecker('object'),\n    string: createPrimitiveTypeChecker('string'),\n    symbol: createPrimitiveTypeChecker('symbol'),\n\n    any: createAnyTypeChecker(),\n    arrayOf: createArrayOfTypeChecker,\n    element: createElementTypeChecker(),\n    elementType: createElementTypeTypeChecker(),\n    instanceOf: createInstanceTypeChecker,\n    node: createNodeChecker(),\n    objectOf: createObjectOfTypeChecker,\n    oneOf: createEnumTypeChecker,\n    oneOfType: createUnionTypeChecker,\n    shape: createShapeTypeChecker,\n    exact: createStrictShapeTypeChecker,\n  };\n\n  /**\n   * inlined Object.is polyfill to avoid requiring consumers ship their own\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n   */\n  /*eslint-disable no-self-compare*/\n  function is(x, y) {\n    // SameValue algorithm\n    if (x === y) {\n      // Steps 1-5, 7-10\n      // Steps 6.b-6.e: +0 != -0\n      return x !== 0 || 1 / x === 1 / y;\n    } else {\n      // Step 6.a: NaN == NaN\n      return x !== x && y !== y;\n    }\n  }\n  /*eslint-enable no-self-compare*/\n\n  /**\n   * We use an Error-like object for backward compatibility as people may call\n   * PropTypes directly and inspect their output. However, we don't use real\n   * Errors anymore. We don't inspect their stack anyway, and creating them\n   * is prohibitively expensive if they are created too often, such as what\n   * happens in oneOfType() for any type before the one that matched.\n   */\n  function PropTypeError(message) {\n    this.message = message;\n    this.stack = '';\n  }\n  // Make `instanceof Error` still work for returned errors.\n  PropTypeError.prototype = Error.prototype;\n\n  function createChainableTypeChecker(validate) {\n    if (true) {\n      var manualPropTypeCallCache = {};\n      var manualPropTypeWarningCount = 0;\n    }\n    function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n      componentName = componentName || ANONYMOUS;\n      propFullName = propFullName || propName;\n\n      if (secret !== ReactPropTypesSecret) {\n        if (throwOnDirectAccess) {\n          // New behavior only for users of `prop-types` package\n          var err = new Error(\n            'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n            'Use `PropTypes.checkPropTypes()` to call them. ' +\n            'Read more at http://fb.me/use-check-prop-types'\n          );\n          err.name = 'Invariant Violation';\n          throw err;\n        } else if ( true && typeof console !== 'undefined') {\n          // Old behavior for people using React.PropTypes\n          var cacheKey = componentName + ':' + propName;\n          if (\n            !manualPropTypeCallCache[cacheKey] &&\n            // Avoid spamming the console because they are often not actionable except for lib authors\n            manualPropTypeWarningCount < 3\n          ) {\n            printWarning(\n              'You are manually calling a React.PropTypes validation ' +\n              'function for the `' + propFullName + '` prop on `' + componentName  + '`. This is deprecated ' +\n              'and will throw in the standalone `prop-types` package. ' +\n              'You may be seeing this warning due to a third-party PropTypes ' +\n              'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n            );\n            manualPropTypeCallCache[cacheKey] = true;\n            manualPropTypeWarningCount++;\n          }\n        }\n      }\n      if (props[propName] == null) {\n        if (isRequired) {\n          if (props[propName] === null) {\n            return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n          }\n          return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n        }\n        return null;\n      } else {\n        return validate(props, propName, componentName, location, propFullName);\n      }\n    }\n\n    var chainedCheckType = checkType.bind(null, false);\n    chainedCheckType.isRequired = checkType.bind(null, true);\n\n    return chainedCheckType;\n  }\n\n  function createPrimitiveTypeChecker(expectedType) {\n    function validate(props, propName, componentName, location, propFullName, secret) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== expectedType) {\n        // `propValue` being instance of, say, date/regexp, pass the 'object'\n        // check, but we can offer a more precise error message here rather than\n        // 'of type `object`'.\n        var preciseType = getPreciseType(propValue);\n\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createAnyTypeChecker() {\n    return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n  }\n\n  function createArrayOfTypeChecker(typeChecker) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (typeof typeChecker !== 'function') {\n        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n      }\n      var propValue = props[propName];\n      if (!Array.isArray(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n      }\n      for (var i = 0; i < propValue.length; i++) {\n        var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n        if (error instanceof Error) {\n          return error;\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createElementTypeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      if (!isValidElement(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createElementTypeTypeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      if (!ReactIs.isValidElementType(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createInstanceTypeChecker(expectedClass) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (!(props[propName] instanceof expectedClass)) {\n        var expectedClassName = expectedClass.name || ANONYMOUS;\n        var actualClassName = getClassName(props[propName]);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createEnumTypeChecker(expectedValues) {\n    if (!Array.isArray(expectedValues)) {\n      if (true) {\n        if (arguments.length > 1) {\n          printWarning(\n            'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n            'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n          );\n        } else {\n          printWarning('Invalid argument supplied to oneOf, expected an array.');\n        }\n      }\n      return emptyFunctionThatReturnsNull;\n    }\n\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      for (var i = 0; i < expectedValues.length; i++) {\n        if (is(propValue, expectedValues[i])) {\n          return null;\n        }\n      }\n\n      var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n        var type = getPreciseType(value);\n        if (type === 'symbol') {\n          return String(value);\n        }\n        return value;\n      });\n      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createObjectOfTypeChecker(typeChecker) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (typeof typeChecker !== 'function') {\n        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n      }\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n      }\n      for (var key in propValue) {\n        if (has(propValue, key)) {\n          var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n          if (error instanceof Error) {\n            return error;\n          }\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createUnionTypeChecker(arrayOfTypeCheckers) {\n    if (!Array.isArray(arrayOfTypeCheckers)) {\n       true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : undefined;\n      return emptyFunctionThatReturnsNull;\n    }\n\n    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n      var checker = arrayOfTypeCheckers[i];\n      if (typeof checker !== 'function') {\n        printWarning(\n          'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n          'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n        );\n        return emptyFunctionThatReturnsNull;\n      }\n    }\n\n    function validate(props, propName, componentName, location, propFullName) {\n      for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n        var checker = arrayOfTypeCheckers[i];\n        if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {\n          return null;\n        }\n      }\n\n      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createNodeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (!isNode(props[propName])) {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createShapeTypeChecker(shapeTypes) {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n      }\n      for (var key in shapeTypes) {\n        var checker = shapeTypes[key];\n        if (!checker) {\n          continue;\n        }\n        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error) {\n          return error;\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createStrictShapeTypeChecker(shapeTypes) {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n      }\n      // We need to check all keys in case some are required but missing from\n      // props.\n      var allKeys = assign({}, props[propName], shapeTypes);\n      for (var key in allKeys) {\n        var checker = shapeTypes[key];\n        if (!checker) {\n          return new PropTypeError(\n            'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n            '\\nBad object: ' + JSON.stringify(props[propName], null, '  ') +\n            '\\nValid keys: ' +  JSON.stringify(Object.keys(shapeTypes), null, '  ')\n          );\n        }\n        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error) {\n          return error;\n        }\n      }\n      return null;\n    }\n\n    return createChainableTypeChecker(validate);\n  }\n\n  function isNode(propValue) {\n    switch (typeof propValue) {\n      case 'number':\n      case 'string':\n      case 'undefined':\n        return true;\n      case 'boolean':\n        return !propValue;\n      case 'object':\n        if (Array.isArray(propValue)) {\n          return propValue.every(isNode);\n        }\n        if (propValue === null || isValidElement(propValue)) {\n          return true;\n        }\n\n        var iteratorFn = getIteratorFn(propValue);\n        if (iteratorFn) {\n          var iterator = iteratorFn.call(propValue);\n          var step;\n          if (iteratorFn !== propValue.entries) {\n            while (!(step = iterator.next()).done) {\n              if (!isNode(step.value)) {\n                return false;\n              }\n            }\n          } else {\n            // Iterator will provide entry [k,v] tuples rather than values.\n            while (!(step = iterator.next()).done) {\n              var entry = step.value;\n              if (entry) {\n                if (!isNode(entry[1])) {\n                  return false;\n                }\n              }\n            }\n          }\n        } else {\n          return false;\n        }\n\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  function isSymbol(propType, propValue) {\n    // Native Symbol.\n    if (propType === 'symbol') {\n      return true;\n    }\n\n    // falsy value can't be a Symbol\n    if (!propValue) {\n      return false;\n    }\n\n    // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n    if (propValue['@@toStringTag'] === 'Symbol') {\n      return true;\n    }\n\n    // Fallback for non-spec compliant Symbols which are polyfilled.\n    if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n      return true;\n    }\n\n    return false;\n  }\n\n  // Equivalent of `typeof` but with special handling for array and regexp.\n  function getPropType(propValue) {\n    var propType = typeof propValue;\n    if (Array.isArray(propValue)) {\n      return 'array';\n    }\n    if (propValue instanceof RegExp) {\n      // Old webkits (at least until Android 4.0) return 'function' rather than\n      // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n      // passes PropTypes.object.\n      return 'object';\n    }\n    if (isSymbol(propType, propValue)) {\n      return 'symbol';\n    }\n    return propType;\n  }\n\n  // This handles more types than `getPropType`. Only used for error messages.\n  // See `createPrimitiveTypeChecker`.\n  function getPreciseType(propValue) {\n    if (typeof propValue === 'undefined' || propValue === null) {\n      return '' + propValue;\n    }\n    var propType = getPropType(propValue);\n    if (propType === 'object') {\n      if (propValue instanceof Date) {\n        return 'date';\n      } else if (propValue instanceof RegExp) {\n        return 'regexp';\n      }\n    }\n    return propType;\n  }\n\n  // Returns a string that is postfixed to a warning about an invalid type.\n  // For example, \"undefined\" or \"of type array\"\n  function getPostfixForTypeWarning(value) {\n    var type = getPreciseType(value);\n    switch (type) {\n      case 'array':\n      case 'object':\n        return 'an ' + type;\n      case 'boolean':\n      case 'date':\n      case 'regexp':\n        return 'a ' + type;\n      default:\n        return type;\n    }\n  }\n\n  // Returns class name of the object, if any.\n  function getClassName(propValue) {\n    if (!propValue.constructor || !propValue.constructor.name) {\n      return ANONYMOUS;\n    }\n    return propValue.constructor.name;\n  }\n\n  ReactPropTypes.checkPropTypes = checkPropTypes;\n  ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/index.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/index.js ***!
-  \******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (true) {\n  var ReactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = __webpack_require__(/*! ./factoryWithTypeCheckers */ \"./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js\")(ReactIs.isElement, throwOnDirectAccess);\n} else {}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-dom/cjs/react-dom.development.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-dom/cjs/react-dom.development.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v16.13.1\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar React = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\nvar _assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\nvar Scheduler = __webpack_require__(/*! scheduler */ \"./jaas-client/node_modules/scheduler/index.js\");\nvar checkPropTypes = __webpack_require__(/*! prop-types/checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\nvar tracing = __webpack_require__(/*! scheduler/tracing */ \"./jaas-client/node_modules/scheduler/tracing.js\");\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.\n// Current owner and dispatcher used to share the same ref,\n// but PR #14548 split them out to better support the react-debug-tools package.\n\nif (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {\n  ReactSharedInternals.ReactCurrentDispatcher = {\n    current: null\n  };\n}\n\nif (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {\n  ReactSharedInternals.ReactCurrentBatchConfig = {\n    suspense: null\n  };\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n  {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    printWarning('warn', format, args);\n  }\n}\nfunction error(format) {\n  {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    printWarning('error', format, args);\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n    if (!hasExistingStack) {\n      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n      var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n      if (stack !== '') {\n        format += '%s';\n        args = args.concat([stack]);\n      }\n    }\n\n    var argsWithFormat = args.map(function (item) {\n      return '' + item;\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      throw new Error(message);\n    } catch (x) {}\n  }\n}\n\nif (!React) {\n  {\n    throw Error( \"ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.\" );\n  }\n}\n\nvar invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {\n  var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n  try {\n    func.apply(context, funcArgs);\n  } catch (error) {\n    this.onError(error);\n  }\n};\n\n{\n  // In DEV mode, we swap out invokeGuardedCallback for a special version\n  // that plays more nicely with the browser's DevTools. The idea is to preserve\n  // \"Pause on exceptions\" behavior. Because React wraps all user-provided\n  // functions in invokeGuardedCallback, and the production version of\n  // invokeGuardedCallback uses a try-catch, all user exceptions are treated\n  // like caught exceptions, and the DevTools won't pause unless the developer\n  // takes the extra step of enabling pause on caught exceptions. This is\n  // unintuitive, though, because even though React has caught the error, from\n  // the developer's perspective, the error is uncaught.\n  //\n  // To preserve the expected \"Pause on exceptions\" behavior, we don't use a\n  // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake\n  // DOM node, and call the user-provided callback from inside an event handler\n  // for that fake event. If the callback throws, the error is \"captured\" using\n  // a global event handler. But because the error happens in a different\n  // event loop context, it does not interrupt the normal program flow.\n  // Effectively, this gives us try-catch behavior without actually using\n  // try-catch. Neat!\n  // Check that the browser supports the APIs we need to implement our special\n  // DEV version of invokeGuardedCallback\n  if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n    var fakeNode = document.createElement('react');\n\n    var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {\n      // If document doesn't exist we know for sure we will crash in this method\n      // when we call document.createEvent(). However this can cause confusing\n      // errors: https://github.com/facebookincubator/create-react-app/issues/3482\n      // So we preemptively throw with a better message instead.\n      if (!(typeof document !== 'undefined')) {\n        {\n          throw Error( \"The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.\" );\n        }\n      }\n\n      var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We\n      // set this to true at the beginning, then set it to false right after\n      // calling the function. If the function errors, `didError` will never be\n      // set to false. This strategy works even if the browser is flaky and\n      // fails to call our global error handler, because it doesn't rely on\n      // the error event at all.\n\n      var didError = true; // Keeps track of the value of window.event so that we can reset it\n      // during the callback to let user code access window.event in the\n      // browsers that support it.\n\n      var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event\n      // dispatching: https://github.com/facebook/react/issues/13688\n\n      var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously\n      // dispatch our fake event using `dispatchEvent`. Inside the handler, we\n      // call the user-provided callback.\n\n      var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n      function callCallback() {\n        // We immediately remove the callback from event listeners so that\n        // nested `invokeGuardedCallback` calls do not clash. Otherwise, a\n        // nested call would trigger the fake event handlers of any call higher\n        // in the stack.\n        fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the\n        // window.event assignment in both IE <= 10 as they throw an error\n        // \"Member not found\" in strict mode, and in Firefox which does not\n        // support window.event.\n\n        if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {\n          window.event = windowEvent;\n        }\n\n        func.apply(context, funcArgs);\n        didError = false;\n      } // Create a global error event handler. We use this to capture the value\n      // that was thrown. It's possible that this error handler will fire more\n      // than once; for example, if non-React code also calls `dispatchEvent`\n      // and a handler for that event throws. We should be resilient to most of\n      // those cases. Even if our error event handler fires more than once, the\n      // last error event is always used. If the callback actually does error,\n      // we know that the last error event is the correct one, because it's not\n      // possible for anything else to have happened in between our callback\n      // erroring and the code that follows the `dispatchEvent` call below. If\n      // the callback doesn't error, but the error event was fired, we know to\n      // ignore it because `didError` will be false, as described above.\n\n\n      var error; // Use this to track whether the error event is ever called.\n\n      var didSetError = false;\n      var isCrossOriginError = false;\n\n      function handleWindowError(event) {\n        error = event.error;\n        didSetError = true;\n\n        if (error === null && event.colno === 0 && event.lineno === 0) {\n          isCrossOriginError = true;\n        }\n\n        if (event.defaultPrevented) {\n          // Some other error handler has prevented default.\n          // Browsers silence the error report if this happens.\n          // We'll remember this to later decide whether to log it or not.\n          if (error != null && typeof error === 'object') {\n            try {\n              error._suppressLogging = true;\n            } catch (inner) {// Ignore.\n            }\n          }\n        }\n      } // Create a fake event type.\n\n\n      var evtType = \"react-\" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers\n\n      window.addEventListener('error', handleWindowError);\n      fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function\n      // errors, it will trigger our global error handler.\n\n      evt.initEvent(evtType, false, false);\n      fakeNode.dispatchEvent(evt);\n\n      if (windowEventDescriptor) {\n        Object.defineProperty(window, 'event', windowEventDescriptor);\n      }\n\n      if (didError) {\n        if (!didSetError) {\n          // The callback errored, but the error event never fired.\n          error = new Error('An error was thrown inside one of your components, but React ' + \"doesn't know what it was. This is likely due to browser \" + 'flakiness. React does its best to preserve the \"Pause on ' + 'exceptions\" behavior of the DevTools, which requires some ' + \"DEV-mode only tricks. It's possible that these don't work in \" + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');\n        } else if (isCrossOriginError) {\n          error = new Error(\"A cross-origin error was thrown. React doesn't have access to \" + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');\n        }\n\n        this.onError(error);\n      } // Remove our event listeners\n\n\n      window.removeEventListener('error', handleWindowError);\n    };\n\n    invokeGuardedCallbackImpl = invokeGuardedCallbackDev;\n  }\n}\n\nvar invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;\n\nvar hasError = false;\nvar caughtError = null; // Used by event system to capture/rethrow the first error.\n\nvar hasRethrowError = false;\nvar rethrowError = null;\nvar reporter = {\n  onError: function (error) {\n    hasError = true;\n    caughtError = error;\n  }\n};\n/**\n * Call a function while guarding against errors that happens within it.\n * Returns an error if it throws, otherwise null.\n *\n * In production, this is implemented using a try-catch. The reason we don't\n * use a try-catch directly is so that we can swap out a different\n * implementation in DEV mode.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n\nfunction invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {\n  hasError = false;\n  caughtError = null;\n  invokeGuardedCallbackImpl$1.apply(reporter, arguments);\n}\n/**\n * Same as invokeGuardedCallback, but instead of returning an error, it stores\n * it in a global so it can be rethrown by `rethrowCaughtError` later.\n * TODO: See if caughtError and rethrowError can be unified.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n\nfunction invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {\n  invokeGuardedCallback.apply(this, arguments);\n\n  if (hasError) {\n    var error = clearCaughtError();\n\n    if (!hasRethrowError) {\n      hasRethrowError = true;\n      rethrowError = error;\n    }\n  }\n}\n/**\n * During execution of guarded functions we will capture the first error which\n * we will rethrow to be handled by the top level error handler.\n */\n\nfunction rethrowCaughtError() {\n  if (hasRethrowError) {\n    var error = rethrowError;\n    hasRethrowError = false;\n    rethrowError = null;\n    throw error;\n  }\n}\nfunction hasCaughtError() {\n  return hasError;\n}\nfunction clearCaughtError() {\n  if (hasError) {\n    var error = caughtError;\n    hasError = false;\n    caughtError = null;\n    return error;\n  } else {\n    {\n      {\n        throw Error( \"clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n}\n\nvar getFiberCurrentPropsFromNode = null;\nvar getInstanceFromNode = null;\nvar getNodeFromInstance = null;\nfunction setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {\n  getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;\n  getInstanceFromNode = getInstanceFromNodeImpl;\n  getNodeFromInstance = getNodeFromInstanceImpl;\n\n  {\n    if (!getNodeFromInstance || !getInstanceFromNode) {\n      error('EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.');\n    }\n  }\n}\nvar validateEventDispatches;\n\n{\n  validateEventDispatches = function (event) {\n    var dispatchListeners = event._dispatchListeners;\n    var dispatchInstances = event._dispatchInstances;\n    var listenersIsArr = Array.isArray(dispatchListeners);\n    var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n    var instancesIsArr = Array.isArray(dispatchInstances);\n    var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n\n    if (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) {\n      error('EventPluginUtils: Invalid `event`.');\n    }\n  };\n}\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {function} listener Application-level callback\n * @param {*} inst Internal component instance\n */\n\n\nfunction executeDispatch(event, listener, inst) {\n  var type = event.type || 'unknown-event';\n  event.currentTarget = getNodeFromInstance(inst);\n  invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);\n  event.currentTarget = null;\n}\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\n\nfunction executeDispatchesInOrder(event) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchInstances = event._dispatchInstances;\n\n  {\n    validateEventDispatches(event);\n  }\n\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      } // Listeners and Instances are two parallel arrays that are always in sync.\n\n\n      executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);\n    }\n  } else if (dispatchListeners) {\n    executeDispatch(event, dispatchListeners, dispatchInstances);\n  }\n\n  event._dispatchListeners = null;\n  event._dispatchInstances = null;\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar FundamentalComponent = 20;\nvar ScopeComponent = 21;\nvar Block = 22;\n\n/**\n * Injectable ordering of event plugins.\n */\nvar eventPluginOrder = null;\n/**\n * Injectable mapping from names to event plugin modules.\n */\n\nvar namesToPlugins = {};\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\n\nfunction recomputePluginOrdering() {\n  if (!eventPluginOrder) {\n    // Wait until an `eventPluginOrder` is injected.\n    return;\n  }\n\n  for (var pluginName in namesToPlugins) {\n    var pluginModule = namesToPlugins[pluginName];\n    var pluginIndex = eventPluginOrder.indexOf(pluginName);\n\n    if (!(pluginIndex > -1)) {\n      {\n        throw Error( \"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `\" + pluginName + \"`.\" );\n      }\n    }\n\n    if (plugins[pluginIndex]) {\n      continue;\n    }\n\n    if (!pluginModule.extractEvents) {\n      {\n        throw Error( \"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `\" + pluginName + \"` does not.\" );\n      }\n    }\n\n    plugins[pluginIndex] = pluginModule;\n    var publishedEvents = pluginModule.eventTypes;\n\n    for (var eventName in publishedEvents) {\n      if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) {\n        {\n          throw Error( \"EventPluginRegistry: Failed to publish event `\" + eventName + \"` for plugin `\" + pluginName + \"`.\" );\n        }\n      }\n    }\n  }\n}\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\n\n\nfunction publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n  if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n    {\n      throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same event name, `\" + eventName + \"`.\" );\n    }\n  }\n\n  eventNameDispatchConfigs[eventName] = dispatchConfig;\n  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n\n  if (phasedRegistrationNames) {\n    for (var phaseName in phasedRegistrationNames) {\n      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n        var phasedRegistrationName = phasedRegistrationNames[phaseName];\n        publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n      }\n    }\n\n    return true;\n  } else if (dispatchConfig.registrationName) {\n    publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);\n    return true;\n  }\n\n  return false;\n}\n/**\n * Publishes a registration name that is used to identify dispatched events.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\n\n\nfunction publishRegistrationName(registrationName, pluginModule, eventName) {\n  if (!!registrationNameModules[registrationName]) {\n    {\n      throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same registration name, `\" + registrationName + \"`.\" );\n    }\n  }\n\n  registrationNameModules[registrationName] = pluginModule;\n  registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n\n  {\n    var lowerCasedName = registrationName.toLowerCase();\n    possibleRegistrationNames[lowerCasedName] = registrationName;\n\n    if (registrationName === 'onDoubleClick') {\n      possibleRegistrationNames.ondblclick = registrationName;\n    }\n  }\n}\n/**\n * Registers plugins so that they can extract and dispatch events.\n */\n\n/**\n * Ordered list of injected plugins.\n */\n\n\nvar plugins = [];\n/**\n * Mapping from event name to dispatch config\n */\n\nvar eventNameDispatchConfigs = {};\n/**\n * Mapping from registration name to plugin module\n */\n\nvar registrationNameModules = {};\n/**\n * Mapping from registration name to event name\n */\n\nvar registrationNameDependencies = {};\n/**\n * Mapping from lowercase registration names to the properly cased version,\n * used to warn in the case of missing event handlers. Available\n * only in true.\n * @type {Object}\n */\n\nvar possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true\n\n/**\n * Injects an ordering of plugins (by plugin name). This allows the ordering\n * to be decoupled from injection of the actual plugins so that ordering is\n * always deterministic regardless of packaging, on-the-fly injection, etc.\n *\n * @param {array} InjectedEventPluginOrder\n * @internal\n */\n\nfunction injectEventPluginOrder(injectedEventPluginOrder) {\n  if (!!eventPluginOrder) {\n    {\n      throw Error( \"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\" );\n    }\n  } // Clone the ordering so it cannot be dynamically mutated.\n\n\n  eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);\n  recomputePluginOrdering();\n}\n/**\n * Injects plugins to be used by plugin event system. The plugin names must be\n * in the ordering injected by `injectEventPluginOrder`.\n *\n * Plugins can be injected as part of page initialization or on-the-fly.\n *\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n * @internal\n */\n\nfunction injectEventPluginsByName(injectedNamesToPlugins) {\n  var isOrderingDirty = false;\n\n  for (var pluginName in injectedNamesToPlugins) {\n    if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n      continue;\n    }\n\n    var pluginModule = injectedNamesToPlugins[pluginName];\n\n    if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {\n      if (!!namesToPlugins[pluginName]) {\n        {\n          throw Error( \"EventPluginRegistry: Cannot inject two different event plugins using the same name, `\" + pluginName + \"`.\" );\n        }\n      }\n\n      namesToPlugins[pluginName] = pluginModule;\n      isOrderingDirty = true;\n    }\n  }\n\n  if (isOrderingDirty) {\n    recomputePluginOrdering();\n  }\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\nvar PLUGIN_EVENT_SYSTEM = 1;\nvar IS_REPLAYED = 1 << 5;\nvar IS_FIRST_ANCESTOR = 1 << 6;\n\nvar restoreImpl = null;\nvar restoreTarget = null;\nvar restoreQueue = null;\n\nfunction restoreStateOfTarget(target) {\n  // We perform this translation at the end of the event loop so that we\n  // always receive the correct fiber here\n  var internalInstance = getInstanceFromNode(target);\n\n  if (!internalInstance) {\n    // Unmounted\n    return;\n  }\n\n  if (!(typeof restoreImpl === 'function')) {\n    {\n      throw Error( \"setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.\n\n  if (stateNode) {\n    var _props = getFiberCurrentPropsFromNode(stateNode);\n\n    restoreImpl(internalInstance.stateNode, internalInstance.type, _props);\n  }\n}\n\nfunction setRestoreImplementation(impl) {\n  restoreImpl = impl;\n}\nfunction enqueueStateRestore(target) {\n  if (restoreTarget) {\n    if (restoreQueue) {\n      restoreQueue.push(target);\n    } else {\n      restoreQueue = [target];\n    }\n  } else {\n    restoreTarget = target;\n  }\n}\nfunction needsStateRestore() {\n  return restoreTarget !== null || restoreQueue !== null;\n}\nfunction restoreStateIfNeeded() {\n  if (!restoreTarget) {\n    return;\n  }\n\n  var target = restoreTarget;\n  var queuedTargets = restoreQueue;\n  restoreTarget = null;\n  restoreQueue = null;\n  restoreStateOfTarget(target);\n\n  if (queuedTargets) {\n    for (var i = 0; i < queuedTargets.length; i++) {\n      restoreStateOfTarget(queuedTargets[i]);\n    }\n  }\n}\n\nvar enableProfilerTimer = true; // Trace which interactions trigger each commit.\n\nvar enableDeprecatedFlareAPI = false; // Experimental Host Component support.\n\nvar enableFundamentalAPI = false; // Experimental Scope support.\nvar warnAboutStringRefs = false;\n\n// the renderer. Such as when we're dispatching events or if third party\n// libraries need to call batchedUpdates. Eventually, this API will go away when\n// everything is batched by default. We'll then have a similar API to opt-out of\n// scheduled work and instead do synchronous work.\n// Defaults\n\nvar batchedUpdatesImpl = function (fn, bookkeeping) {\n  return fn(bookkeeping);\n};\n\nvar discreteUpdatesImpl = function (fn, a, b, c, d) {\n  return fn(a, b, c, d);\n};\n\nvar flushDiscreteUpdatesImpl = function () {};\n\nvar batchedEventUpdatesImpl = batchedUpdatesImpl;\nvar isInsideEventHandler = false;\nvar isBatchingEventUpdates = false;\n\nfunction finishEventHandler() {\n  // Here we wait until all updates have propagated, which is important\n  // when using controlled components within layers:\n  // https://github.com/facebook/react/issues/1698\n  // Then we restore state of any controlled component.\n  var controlledComponentsHavePendingUpdates = needsStateRestore();\n\n  if (controlledComponentsHavePendingUpdates) {\n    // If a controlled event was fired, we may need to restore the state of\n    // the DOM node back to the controlled value. This is necessary when React\n    // bails out of the update without touching the DOM.\n    flushDiscreteUpdatesImpl();\n    restoreStateIfNeeded();\n  }\n}\n\nfunction batchedUpdates(fn, bookkeeping) {\n  if (isInsideEventHandler) {\n    // If we are currently inside another batch, we need to wait until it\n    // fully completes before restoring state.\n    return fn(bookkeeping);\n  }\n\n  isInsideEventHandler = true;\n\n  try {\n    return batchedUpdatesImpl(fn, bookkeeping);\n  } finally {\n    isInsideEventHandler = false;\n    finishEventHandler();\n  }\n}\nfunction batchedEventUpdates(fn, a, b) {\n  if (isBatchingEventUpdates) {\n    // If we are currently inside another batch, we need to wait until it\n    // fully completes before restoring state.\n    return fn(a, b);\n  }\n\n  isBatchingEventUpdates = true;\n\n  try {\n    return batchedEventUpdatesImpl(fn, a, b);\n  } finally {\n    isBatchingEventUpdates = false;\n    finishEventHandler();\n  }\n} // This is for the React Flare event system\nfunction discreteUpdates(fn, a, b, c, d) {\n  var prevIsInsideEventHandler = isInsideEventHandler;\n  isInsideEventHandler = true;\n\n  try {\n    return discreteUpdatesImpl(fn, a, b, c, d);\n  } finally {\n    isInsideEventHandler = prevIsInsideEventHandler;\n\n    if (!isInsideEventHandler) {\n      finishEventHandler();\n    }\n  }\n}\nfunction flushDiscreteUpdatesIfNeeded(timeStamp) {\n  // event.timeStamp isn't overly reliable due to inconsistencies in\n  // how different browsers have historically provided the time stamp.\n  // Some browsers provide high-resolution time stamps for all events,\n  // some provide low-resolution time stamps for all events. FF < 52\n  // even mixes both time stamps together. Some browsers even report\n  // negative time stamps or time stamps that are 0 (iOS9) in some cases.\n  // Given we are only comparing two time stamps with equality (!==),\n  // we are safe from the resolution differences. If the time stamp is 0\n  // we bail-out of preventing the flush, which can affect semantics,\n  // such as if an earlier flush removes or adds event listeners that\n  // are fired in the subsequent flush. However, this is the same\n  // behaviour as we had before this change, so the risks are low.\n  if (!isInsideEventHandler && (!enableDeprecatedFlareAPI  )) {\n    flushDiscreteUpdatesImpl();\n  }\n}\nfunction setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) {\n  batchedUpdatesImpl = _batchedUpdatesImpl;\n  discreteUpdatesImpl = _discreteUpdatesImpl;\n  flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl;\n  batchedEventUpdatesImpl = _batchedEventUpdatesImpl;\n}\n\nvar DiscreteEvent = 0;\nvar UserBlockingEvent = 1;\nvar ContinuousEvent = 2;\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nvar RESERVED = 0; // A simple string attribute.\n// Attributes that aren't in the whitelist are presumed to have this type.\n\nvar STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\n\nvar BOOLEANISH_STRING = 2; // A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n\nvar BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\n\nvar OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\n\nvar NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\n\nvar POSITIVE_NUMERIC = 6;\n\n/* eslint-disable max-len */\nvar ATTRIBUTE_NAME_START_CHAR = \":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n/* eslint-enable max-len */\n\nvar ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\nvar ROOT_ATTRIBUTE_NAME = 'data-reactroot';\nvar VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {\n    return true;\n  }\n\n  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {\n    return false;\n  }\n\n  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n    validatedAttributeNameCache[attributeName] = true;\n    return true;\n  }\n\n  illegalAttributeNameCache[attributeName] = true;\n\n  {\n    error('Invalid attribute name: `%s`', attributeName);\n  }\n\n  return false;\n}\nfunction shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {\n  if (propertyInfo !== null) {\n    return propertyInfo.type === RESERVED;\n  }\n\n  if (isCustomComponentTag) {\n    return false;\n  }\n\n  if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {\n    return true;\n  }\n\n  return false;\n}\nfunction shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {\n  if (propertyInfo !== null && propertyInfo.type === RESERVED) {\n    return false;\n  }\n\n  switch (typeof value) {\n    case 'function': // $FlowIssue symbol is perfectly valid here\n\n    case 'symbol':\n      // eslint-disable-line\n      return true;\n\n    case 'boolean':\n      {\n        if (isCustomComponentTag) {\n          return false;\n        }\n\n        if (propertyInfo !== null) {\n          return !propertyInfo.acceptsBooleans;\n        } else {\n          var prefix = name.toLowerCase().slice(0, 5);\n          return prefix !== 'data-' && prefix !== 'aria-';\n        }\n      }\n\n    default:\n      return false;\n  }\n}\nfunction shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {\n  if (value === null || typeof value === 'undefined') {\n    return true;\n  }\n\n  if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {\n    return true;\n  }\n\n  if (isCustomComponentTag) {\n    return false;\n  }\n\n  if (propertyInfo !== null) {\n    switch (propertyInfo.type) {\n      case BOOLEAN:\n        return !value;\n\n      case OVERLOADED_BOOLEAN:\n        return value === false;\n\n      case NUMERIC:\n        return isNaN(value);\n\n      case POSITIVE_NUMERIC:\n        return isNaN(value) || value < 1;\n    }\n  }\n\n  return false;\n}\nfunction getPropertyInfo(name) {\n  return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {\n  this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;\n  this.attributeName = attributeName;\n  this.attributeNamespace = attributeNamespace;\n  this.mustUseProperty = mustUseProperty;\n  this.propertyName = name;\n  this.type = type;\n  this.sanitizeURL = sanitizeURL;\n} // When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\n\n\nvar properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.\n\nvar reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular\n// elements (not just inputs). Now that ReactDOMInput assigns to the\n// defaultValue property -- do we need this?\n'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];\n\nreservedProps.forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n\n[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {\n  var name = _ref[0],\n      attributeName = _ref[1];\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n\n['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML boolean attributes.\n\n['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM\n// on the client side because the browsers are inconsistent. Instead we call focus().\n'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata\n'itemScope'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n\n['checked', // Note: `option.selected` is not updated if `select.multiple` is\n// disabled with `removeAttribute`. We have special logic for handling this.\n'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n\n['capture', 'download' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that must be positive numbers.\n\n['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that must be numbers.\n\n['rowSpan', 'start'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n});\nvar CAMELIZE = /[\\-\\:]([a-z])/g;\n\nvar capitalize = function (token) {\n  return token[1].toUpperCase();\n}; // This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML whitelist.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n\n\n['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, null, // attributeNamespace\n  false);\n}); // String SVG attributes with the xlink namespace.\n\n['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, 'http://www.w3.org/1999/xlink', false);\n}); // String SVG attributes with the xml namespace.\n\n['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, 'http://www.w3.org/XML/1998/namespace', false);\n}); // These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n\n['tabIndex', 'crossOrigin'].forEach(function (attributeName) {\n  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n  attributeName.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\n\nvar xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty\n'xlink:href', 'http://www.w3.org/1999/xlink', true);\n['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {\n  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n  attributeName.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  true);\n});\n\nvar ReactDebugCurrentFrame = null;\n\n{\n  ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n} // A javascript: URL can contain leading C0 control or \\u0020 SPACE,\n// and any newline or tab are filtered out as if they're not part of the URL.\n// https://url.spec.whatwg.org/#url-parsing\n// Tab or newline are defined as \\r\\n\\t:\n// https://infra.spec.whatwg.org/#ascii-tab-or-newline\n// A C0 control is a code point in the range \\u0000 NULL to \\u001F\n// INFORMATION SEPARATOR ONE, inclusive:\n// https://infra.spec.whatwg.org/#c0-control-or-space\n\n/* eslint-disable max-len */\n\n\nvar isJavaScriptProtocol = /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*\\:/i;\nvar didWarn = false;\n\nfunction sanitizeURL(url) {\n  {\n    if (!didWarn && isJavaScriptProtocol.test(url)) {\n      didWarn = true;\n\n      error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));\n    }\n  }\n}\n\n/**\n * Get the value for a property on a node. Only used in DEV for SSR validation.\n * The \"expected\" argument is used as a hint of what the expected value is.\n * Some properties have multiple equivalent values.\n */\nfunction getValueForProperty(node, name, expected, propertyInfo) {\n  {\n    if (propertyInfo.mustUseProperty) {\n      var propertyName = propertyInfo.propertyName;\n      return node[propertyName];\n    } else {\n      if ( propertyInfo.sanitizeURL) {\n        // If we haven't fully disabled javascript: URLs, and if\n        // the hydration is successful of a javascript: URL, we\n        // still want to warn on the client.\n        sanitizeURL('' + expected);\n      }\n\n      var attributeName = propertyInfo.attributeName;\n      var stringValue = null;\n\n      if (propertyInfo.type === OVERLOADED_BOOLEAN) {\n        if (node.hasAttribute(attributeName)) {\n          var value = node.getAttribute(attributeName);\n\n          if (value === '') {\n            return true;\n          }\n\n          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n            return value;\n          }\n\n          if (value === '' + expected) {\n            return expected;\n          }\n\n          return value;\n        }\n      } else if (node.hasAttribute(attributeName)) {\n        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n          // We had an attribute but shouldn't have had one, so read it\n          // for the error message.\n          return node.getAttribute(attributeName);\n        }\n\n        if (propertyInfo.type === BOOLEAN) {\n          // If this was a boolean, it doesn't matter what the value is\n          // the fact that we have it is the same as the expected.\n          return expected;\n        } // Even if this property uses a namespace we use getAttribute\n        // because we assume its namespaced name is the same as our config.\n        // To use getAttributeNS we need the local name which we don't have\n        // in our config atm.\n\n\n        stringValue = node.getAttribute(attributeName);\n      }\n\n      if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n        return stringValue === null ? expected : stringValue;\n      } else if (stringValue === '' + expected) {\n        return expected;\n      } else {\n        return stringValue;\n      }\n    }\n  }\n}\n/**\n * Get the value for a attribute on a node. Only used in DEV for SSR validation.\n * The third argument is used as a hint of what the expected value is. Some\n * attributes have multiple equivalent values.\n */\n\nfunction getValueForAttribute(node, name, expected) {\n  {\n    if (!isAttributeNameSafe(name)) {\n      return;\n    }\n\n    if (!node.hasAttribute(name)) {\n      return expected === undefined ? undefined : null;\n    }\n\n    var value = node.getAttribute(name);\n\n    if (value === '' + expected) {\n      return expected;\n    }\n\n    return value;\n  }\n}\n/**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\n\nfunction setValueForProperty(node, name, value, isCustomComponentTag) {\n  var propertyInfo = getPropertyInfo(name);\n\n  if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {\n    return;\n  }\n\n  if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {\n    value = null;\n  } // If the prop isn't in the special list, treat it as a simple attribute.\n\n\n  if (isCustomComponentTag || propertyInfo === null) {\n    if (isAttributeNameSafe(name)) {\n      var _attributeName = name;\n\n      if (value === null) {\n        node.removeAttribute(_attributeName);\n      } else {\n        node.setAttribute(_attributeName,  '' + value);\n      }\n    }\n\n    return;\n  }\n\n  var mustUseProperty = propertyInfo.mustUseProperty;\n\n  if (mustUseProperty) {\n    var propertyName = propertyInfo.propertyName;\n\n    if (value === null) {\n      var type = propertyInfo.type;\n      node[propertyName] = type === BOOLEAN ? false : '';\n    } else {\n      // Contrary to `setAttribute`, object properties are properly\n      // `toString`ed by IE8/9.\n      node[propertyName] = value;\n    }\n\n    return;\n  } // The rest are treated as attributes with special cases.\n\n\n  var attributeName = propertyInfo.attributeName,\n      attributeNamespace = propertyInfo.attributeNamespace;\n\n  if (value === null) {\n    node.removeAttribute(attributeName);\n  } else {\n    var _type = propertyInfo.type;\n    var attributeValue;\n\n    if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {\n      // If attribute type is boolean, we know for sure it won't be an execution sink\n      // and we won't require Trusted Type here.\n      attributeValue = '';\n    } else {\n      // `setAttribute` with objects becomes only `[object]` in IE8/9,\n      // ('' + value) makes it output the correct toString()-value.\n      {\n        attributeValue = '' + value;\n      }\n\n      if (propertyInfo.sanitizeURL) {\n        sanitizeURL(attributeValue.toString());\n      }\n    }\n\n    if (attributeNamespace) {\n      node.setAttributeNS(attributeNamespace, attributeName, attributeValue);\n    } else {\n      node.setAttribute(attributeName, attributeValue);\n    }\n  }\n}\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n  var sourceInfo = '';\n\n  if (source) {\n    var path = source.fileName;\n    var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n    {\n      // In DEV, include code for a common special case:\n      // prefer \"folder/index.js\" instead of just \"index.js\".\n      if (/^index\\./.test(fileName)) {\n        var match = path.match(BEFORE_SLASH_RE);\n\n        if (match) {\n          var pathBeforeSlash = match[1];\n\n          if (pathBeforeSlash) {\n            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n            fileName = folderName + '/' + fileName;\n          }\n        }\n      }\n    }\n\n    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n  } else if (ownerName) {\n    sourceInfo = ' (created by ' + ownerName + ')';\n  }\n\n  return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n}\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\nvar Uninitialized = -1;\nvar Pending = 0;\nvar Resolved = 1;\nvar Rejected = 2;\nfunction refineResolvedLazyComponent(lazyComponent) {\n  return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\nfunction initializeLazyComponentType(lazyComponent) {\n  if (lazyComponent._status === Uninitialized) {\n    lazyComponent._status = Pending;\n    var ctor = lazyComponent._ctor;\n    var thenable = ctor();\n    lazyComponent._result = thenable;\n    thenable.then(function (moduleObject) {\n      if (lazyComponent._status === Pending) {\n        var defaultExport = moduleObject.default;\n\n        {\n          if (defaultExport === undefined) {\n            error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\\n\\nYour code should look like: \\n  ' + \"const MyComponent = lazy(() => import('./MyComponent'))\", moduleObject);\n          }\n        }\n\n        lazyComponent._status = Resolved;\n        lazyComponent._result = defaultExport;\n      }\n    }, function (error) {\n      if (lazyComponent._status === Pending) {\n        lazyComponent._status = Rejected;\n        lazyComponent._result = error;\n      }\n    });\n  }\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = innerType.displayName || innerType.name || '';\n  return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        return 'Context.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        return 'Context.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        return getComponentName(type.type);\n\n      case REACT_BLOCK_TYPE:\n        return getComponentName(type.render);\n\n      case REACT_LAZY_TYPE:\n        {\n          var thenable = type;\n          var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n          if (resolvedThenable) {\n            return getComponentName(resolvedThenable);\n          }\n\n          break;\n        }\n    }\n  }\n\n  return null;\n}\n\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction describeFiber(fiber) {\n  switch (fiber.tag) {\n    case HostRoot:\n    case HostPortal:\n    case HostText:\n    case Fragment:\n    case ContextProvider:\n    case ContextConsumer:\n      return '';\n\n    default:\n      var owner = fiber._debugOwner;\n      var source = fiber._debugSource;\n      var name = getComponentName(fiber.type);\n      var ownerName = null;\n\n      if (owner) {\n        ownerName = getComponentName(owner.type);\n      }\n\n      return describeComponentFrame(name, source, ownerName);\n  }\n}\n\nfunction getStackByFiberInDevAndProd(workInProgress) {\n  var info = '';\n  var node = workInProgress;\n\n  do {\n    info += describeFiber(node);\n    node = node.return;\n  } while (node);\n\n  return info;\n}\nvar current = null;\nvar isRendering = false;\nfunction getCurrentFiberOwnerNameInDevOrNull() {\n  {\n    if (current === null) {\n      return null;\n    }\n\n    var owner = current._debugOwner;\n\n    if (owner !== null && typeof owner !== 'undefined') {\n      return getComponentName(owner.type);\n    }\n  }\n\n  return null;\n}\nfunction getCurrentFiberStackInDev() {\n  {\n    if (current === null) {\n      return '';\n    } // Safe because if current fiber exists, we are reconciling,\n    // and it is guaranteed to be the work-in-progress version.\n\n\n    return getStackByFiberInDevAndProd(current);\n  }\n}\nfunction resetCurrentFiber() {\n  {\n    ReactDebugCurrentFrame$1.getCurrentStack = null;\n    current = null;\n    isRendering = false;\n  }\n}\nfunction setCurrentFiber(fiber) {\n  {\n    ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackInDev;\n    current = fiber;\n    isRendering = false;\n  }\n}\nfunction setIsRendering(rendering) {\n  {\n    isRendering = rendering;\n  }\n}\n\n// Flow does not allow string concatenation of most non-string types. To work\n// around this limitation, we use an opaque type that can only be obtained by\n// passing the value through getToStringValue first.\nfunction toString(value) {\n  return '' + value;\n}\nfunction getToStringValue(value) {\n  switch (typeof value) {\n    case 'boolean':\n    case 'number':\n    case 'object':\n    case 'string':\n    case 'undefined':\n      return value;\n\n    default:\n      // function, symbol are assigned as empty strings\n      return '';\n  }\n}\n\nvar ReactDebugCurrentFrame$2 = null;\nvar ReactControlledValuePropTypes = {\n  checkPropTypes: null\n};\n\n{\n  ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;\n  var hasReadOnlyValue = {\n    button: true,\n    checkbox: true,\n    image: true,\n    hidden: true,\n    radio: true,\n    reset: true,\n    submit: true\n  };\n  var propTypes = {\n    value: function (props, propName, componentName) {\n      if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n        return null;\n      }\n\n      return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n    },\n    checked: function (props, propName, componentName) {\n      if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n        return null;\n      }\n\n      return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n    }\n  };\n  /**\n   * Provide a linked `value` attribute for controlled forms. You should not use\n   * this outside of the ReactDOM controlled form components.\n   */\n\n  ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {\n    checkPropTypes(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);\n  };\n}\n\nfunction isCheckable(elem) {\n  var type = elem.type;\n  var nodeName = elem.nodeName;\n  return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');\n}\n\nfunction getTracker(node) {\n  return node._valueTracker;\n}\n\nfunction detachTracker(node) {\n  node._valueTracker = null;\n}\n\nfunction getValueFromNode(node) {\n  var value = '';\n\n  if (!node) {\n    return value;\n  }\n\n  if (isCheckable(node)) {\n    value = node.checked ? 'true' : 'false';\n  } else {\n    value = node.value;\n  }\n\n  return value;\n}\n\nfunction trackValueOnNode(node) {\n  var valueField = isCheckable(node) ? 'checked' : 'value';\n  var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);\n  var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail\n  // and don't track value will cause over reporting of changes,\n  // but it's better then a hard failure\n  // (needed for certain tests that spyOn input values and Safari)\n\n  if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {\n    return;\n  }\n\n  var get = descriptor.get,\n      set = descriptor.set;\n  Object.defineProperty(node, valueField, {\n    configurable: true,\n    get: function () {\n      return get.call(this);\n    },\n    set: function (value) {\n      currentValue = '' + value;\n      set.call(this, value);\n    }\n  }); // We could've passed this the first time\n  // but it triggers a bug in IE11 and Edge 14/15.\n  // Calling defineProperty() again should be equivalent.\n  // https://github.com/facebook/react/issues/11768\n\n  Object.defineProperty(node, valueField, {\n    enumerable: descriptor.enumerable\n  });\n  var tracker = {\n    getValue: function () {\n      return currentValue;\n    },\n    setValue: function (value) {\n      currentValue = '' + value;\n    },\n    stopTracking: function () {\n      detachTracker(node);\n      delete node[valueField];\n    }\n  };\n  return tracker;\n}\n\nfunction track(node) {\n  if (getTracker(node)) {\n    return;\n  } // TODO: Once it's just Fiber we can move this to node._wrapperState\n\n\n  node._valueTracker = trackValueOnNode(node);\n}\nfunction updateValueIfChanged(node) {\n  if (!node) {\n    return false;\n  }\n\n  var tracker = getTracker(node); // if there is no tracker at this point it's unlikely\n  // that trying again will succeed\n\n  if (!tracker) {\n    return true;\n  }\n\n  var lastValue = tracker.getValue();\n  var nextValue = getValueFromNode(node);\n\n  if (nextValue !== lastValue) {\n    tracker.setValue(nextValue);\n    return true;\n  }\n\n  return false;\n}\n\nvar didWarnValueDefaultValue = false;\nvar didWarnCheckedDefaultChecked = false;\nvar didWarnControlledToUncontrolled = false;\nvar didWarnUncontrolledToControlled = false;\n\nfunction isControlled(props) {\n  var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n  return usesChecked ? props.checked != null : props.value != null;\n}\n/**\n * Implements an <input> host component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\n\n\nfunction getHostProps(element, props) {\n  var node = element;\n  var checked = props.checked;\n\n  var hostProps = _assign({}, props, {\n    defaultChecked: undefined,\n    defaultValue: undefined,\n    value: undefined,\n    checked: checked != null ? checked : node._wrapperState.initialChecked\n  });\n\n  return hostProps;\n}\nfunction initWrapperState(element, props) {\n  {\n    ReactControlledValuePropTypes.checkPropTypes('input', props);\n\n    if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n      error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n      didWarnCheckedDefaultChecked = true;\n    }\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n      error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n      didWarnValueDefaultValue = true;\n    }\n  }\n\n  var node = element;\n  var defaultValue = props.defaultValue == null ? '' : props.defaultValue;\n  node._wrapperState = {\n    initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n    initialValue: getToStringValue(props.value != null ? props.value : defaultValue),\n    controlled: isControlled(props)\n  };\n}\nfunction updateChecked(element, props) {\n  var node = element;\n  var checked = props.checked;\n\n  if (checked != null) {\n    setValueForProperty(node, 'checked', checked, false);\n  }\n}\nfunction updateWrapper(element, props) {\n  var node = element;\n\n  {\n    var controlled = isControlled(props);\n\n    if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n      error('A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n      didWarnUncontrolledToControlled = true;\n    }\n\n    if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n      error('A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n      didWarnControlledToUncontrolled = true;\n    }\n  }\n\n  updateChecked(element, props);\n  var value = getToStringValue(props.value);\n  var type = props.type;\n\n  if (value != null) {\n    if (type === 'number') {\n      if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.\n      // eslint-disable-next-line\n      node.value != value) {\n        node.value = toString(value);\n      }\n    } else if (node.value !== toString(value)) {\n      node.value = toString(value);\n    }\n  } else if (type === 'submit' || type === 'reset') {\n    // Submit/reset inputs need the attribute removed completely to avoid\n    // blank-text buttons.\n    node.removeAttribute('value');\n    return;\n  }\n\n  {\n    // When syncing the value attribute, the value comes from a cascade of\n    // properties:\n    //  1. The value React property\n    //  2. The defaultValue React property\n    //  3. Otherwise there should be no change\n    if (props.hasOwnProperty('value')) {\n      setDefaultValue(node, props.type, value);\n    } else if (props.hasOwnProperty('defaultValue')) {\n      setDefaultValue(node, props.type, getToStringValue(props.defaultValue));\n    }\n  }\n\n  {\n    // When syncing the checked attribute, it only changes when it needs\n    // to be removed, such as transitioning from a checkbox into a text input\n    if (props.checked == null && props.defaultChecked != null) {\n      node.defaultChecked = !!props.defaultChecked;\n    }\n  }\n}\nfunction postMountWrapper(element, props, isHydrating) {\n  var node = element; // Do not assign value if it is already set. This prevents user text input\n  // from being lost during SSR hydration.\n\n  if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {\n    var type = props.type;\n    var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the\n    // default value provided by the browser. See: #12872\n\n    if (isButton && (props.value === undefined || props.value === null)) {\n      return;\n    }\n\n    var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input\n    // from being lost during SSR hydration.\n\n    if (!isHydrating) {\n      {\n        // When syncing the value attribute, the value property should use\n        // the wrapperState._initialValue property. This uses:\n        //\n        //   1. The value React property when present\n        //   2. The defaultValue React property when present\n        //   3. An empty string\n        if (initialValue !== node.value) {\n          node.value = initialValue;\n        }\n      }\n    }\n\n    {\n      // Otherwise, the value attribute is synchronized to the property,\n      // so we assign defaultValue to the same thing as the value property\n      // assignment step above.\n      node.defaultValue = initialValue;\n    }\n  } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n  // this is needed to work around a chrome bug where setting defaultChecked\n  // will sometimes influence the value of checked (even after detachment).\n  // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n  // We need to temporarily unset name to avoid disrupting radio button groups.\n\n\n  var name = node.name;\n\n  if (name !== '') {\n    node.name = '';\n  }\n\n  {\n    // When syncing the checked attribute, both the checked property and\n    // attribute are assigned at the same time using defaultChecked. This uses:\n    //\n    //   1. The checked React property when present\n    //   2. The defaultChecked React property when present\n    //   3. Otherwise, false\n    node.defaultChecked = !node.defaultChecked;\n    node.defaultChecked = !!node._wrapperState.initialChecked;\n  }\n\n  if (name !== '') {\n    node.name = name;\n  }\n}\nfunction restoreControlledState(element, props) {\n  var node = element;\n  updateWrapper(node, props);\n  updateNamedCousins(node, props);\n}\n\nfunction updateNamedCousins(rootNode, props) {\n  var name = props.name;\n\n  if (props.type === 'radio' && name != null) {\n    var queryRoot = rootNode;\n\n    while (queryRoot.parentNode) {\n      queryRoot = queryRoot.parentNode;\n    } // If `rootNode.form` was non-null, then we could try `form.elements`,\n    // but that sometimes behaves strangely in IE8. We could also try using\n    // `form.getElementsByName`, but that will only return direct children\n    // and won't include inputs that use the HTML5 `form=` attribute. Since\n    // the input might not even be in a form. It might not even be in the\n    // document. Let's just use the local `querySelectorAll` to ensure we don't\n    // miss anything.\n\n\n    var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n    for (var i = 0; i < group.length; i++) {\n      var otherNode = group[i];\n\n      if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n        continue;\n      } // This will throw if radio buttons rendered by different copies of React\n      // and the same name are rendered into the same form (same as #1939).\n      // That's probably okay; we don't support it just as we don't support\n      // mixing React radio buttons with non-React ones.\n\n\n      var otherProps = getFiberCurrentPropsFromNode$1(otherNode);\n\n      if (!otherProps) {\n        {\n          throw Error( \"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\" );\n        }\n      } // We need update the tracked value on the named cousin since the value\n      // was changed but the input saw no event or value set\n\n\n      updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that\n      // was previously checked to update will cause it to be come re-checked\n      // as appropriate.\n\n      updateWrapper(otherNode, otherProps);\n    }\n  }\n} // In Chrome, assigning defaultValue to certain input types triggers input validation.\n// For number inputs, the display value loses trailing decimal points. For email inputs,\n// Chrome raises \"The specified value <x> is not a valid email address\".\n//\n// Here we check to see if the defaultValue has actually changed, avoiding these problems\n// when the user is inputting text\n//\n// https://github.com/facebook/react/issues/7253\n\n\nfunction setDefaultValue(node, type, value) {\n  if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js\n  type !== 'number' || node.ownerDocument.activeElement !== node) {\n    if (value == null) {\n      node.defaultValue = toString(node._wrapperState.initialValue);\n    } else if (node.defaultValue !== toString(value)) {\n      node.defaultValue = toString(value);\n    }\n  }\n}\n\nvar didWarnSelectedSetOnOption = false;\nvar didWarnInvalidChild = false;\n\nfunction flattenChildren(children) {\n  var content = ''; // Flatten children. We'll warn if they are invalid\n  // during validateProps() which runs for hydration too.\n  // Note that this would throw on non-element objects.\n  // Elements are stringified (which is normally irrelevant\n  // but matters for <fbt>).\n\n  React.Children.forEach(children, function (child) {\n    if (child == null) {\n      return;\n    }\n\n    content += child; // Note: we don't warn about invalid children here.\n    // Instead, this is done separately below so that\n    // it happens during the hydration codepath too.\n  });\n  return content;\n}\n/**\n * Implements an <option> host component that warns when `selected` is set.\n */\n\n\nfunction validateProps(element, props) {\n  {\n    // This mirrors the codepath above, but runs for hydration too.\n    // Warn about invalid children here so that client and hydration are consistent.\n    // TODO: this seems like it could cause a DEV-only throw for hydration\n    // if children contains a non-element object. We should try to avoid that.\n    if (typeof props.children === 'object' && props.children !== null) {\n      React.Children.forEach(props.children, function (child) {\n        if (child == null) {\n          return;\n        }\n\n        if (typeof child === 'string' || typeof child === 'number') {\n          return;\n        }\n\n        if (typeof child.type !== 'string') {\n          return;\n        }\n\n        if (!didWarnInvalidChild) {\n          didWarnInvalidChild = true;\n\n          error('Only strings and numbers are supported as <option> children.');\n        }\n      });\n    } // TODO: Remove support for `selected` in <option>.\n\n\n    if (props.selected != null && !didWarnSelectedSetOnOption) {\n      error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');\n\n      didWarnSelectedSetOnOption = true;\n    }\n  }\n}\nfunction postMountWrapper$1(element, props) {\n  // value=\"\" should make a value attribute (#6219)\n  if (props.value != null) {\n    element.setAttribute('value', toString(getToStringValue(props.value)));\n  }\n}\nfunction getHostProps$1(element, props) {\n  var hostProps = _assign({\n    children: undefined\n  }, props);\n\n  var content = flattenChildren(props.children);\n\n  if (content) {\n    hostProps.children = content;\n  }\n\n  return hostProps;\n}\n\nvar didWarnValueDefaultValue$1;\n\n{\n  didWarnValueDefaultValue$1 = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n  var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n  if (ownerName) {\n    return '\\n\\nCheck the render method of `' + ownerName + '`.';\n  }\n\n  return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n/**\n * Validation function for `value` and `defaultValue`.\n */\n\nfunction checkSelectPropTypes(props) {\n  {\n    ReactControlledValuePropTypes.checkPropTypes('select', props);\n\n    for (var i = 0; i < valuePropNames.length; i++) {\n      var propName = valuePropNames[i];\n\n      if (props[propName] == null) {\n        continue;\n      }\n\n      var isArray = Array.isArray(props[propName]);\n\n      if (props.multiple && !isArray) {\n        error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());\n      } else if (!props.multiple && isArray) {\n        error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());\n      }\n    }\n  }\n}\n\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n  var options = node.options;\n\n  if (multiple) {\n    var selectedValues = propValue;\n    var selectedValue = {};\n\n    for (var i = 0; i < selectedValues.length; i++) {\n      // Prefix to avoid chaos with special keys.\n      selectedValue['$' + selectedValues[i]] = true;\n    }\n\n    for (var _i = 0; _i < options.length; _i++) {\n      var selected = selectedValue.hasOwnProperty('$' + options[_i].value);\n\n      if (options[_i].selected !== selected) {\n        options[_i].selected = selected;\n      }\n\n      if (selected && setDefaultSelected) {\n        options[_i].defaultSelected = true;\n      }\n    }\n  } else {\n    // Do not set `select.value` as exact behavior isn't consistent across all\n    // browsers for all cases.\n    var _selectedValue = toString(getToStringValue(propValue));\n\n    var defaultSelected = null;\n\n    for (var _i2 = 0; _i2 < options.length; _i2++) {\n      if (options[_i2].value === _selectedValue) {\n        options[_i2].selected = true;\n\n        if (setDefaultSelected) {\n          options[_i2].defaultSelected = true;\n        }\n\n        return;\n      }\n\n      if (defaultSelected === null && !options[_i2].disabled) {\n        defaultSelected = options[_i2];\n      }\n    }\n\n    if (defaultSelected !== null) {\n      defaultSelected.selected = true;\n    }\n  }\n}\n/**\n * Implements a <select> host component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\n\n\nfunction getHostProps$2(element, props) {\n  return _assign({}, props, {\n    value: undefined\n  });\n}\nfunction initWrapperState$1(element, props) {\n  var node = element;\n\n  {\n    checkSelectPropTypes(props);\n  }\n\n  node._wrapperState = {\n    wasMultiple: !!props.multiple\n  };\n\n  {\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {\n      error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');\n\n      didWarnValueDefaultValue$1 = true;\n    }\n  }\n}\nfunction postMountWrapper$2(element, props) {\n  var node = element;\n  node.multiple = !!props.multiple;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  } else if (props.defaultValue != null) {\n    updateOptions(node, !!props.multiple, props.defaultValue, true);\n  }\n}\nfunction postUpdateWrapper(element, props) {\n  var node = element;\n  var wasMultiple = node._wrapperState.wasMultiple;\n  node._wrapperState.wasMultiple = !!props.multiple;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  } else if (wasMultiple !== !!props.multiple) {\n    // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n    if (props.defaultValue != null) {\n      updateOptions(node, !!props.multiple, props.defaultValue, true);\n    } else {\n      // Revert the select back to its default unselected state.\n      updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);\n    }\n  }\n}\nfunction restoreControlledState$1(element, props) {\n  var node = element;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  }\n}\n\nvar didWarnValDefaultVal = false;\n\n/**\n * Implements a <textarea> host component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nfunction getHostProps$3(element, props) {\n  var node = element;\n\n  if (!(props.dangerouslySetInnerHTML == null)) {\n    {\n      throw Error( \"`dangerouslySetInnerHTML` does not make sense on <textarea>.\" );\n    }\n  } // Always set children to the same thing. In IE9, the selection range will\n  // get reset if `textContent` is mutated.  We could add a check in setTextContent\n  // to only set the value if/when the value differs from the node value (which would\n  // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this\n  // solution. The value can be a boolean or object so that's why it's forced\n  // to be a string.\n\n\n  var hostProps = _assign({}, props, {\n    value: undefined,\n    defaultValue: undefined,\n    children: toString(node._wrapperState.initialValue)\n  });\n\n  return hostProps;\n}\nfunction initWrapperState$2(element, props) {\n  var node = element;\n\n  {\n    ReactControlledValuePropTypes.checkPropTypes('textarea', props);\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {\n      error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');\n\n      didWarnValDefaultVal = true;\n    }\n  }\n\n  var initialValue = props.value; // Only bother fetching default value if we're going to use it\n\n  if (initialValue == null) {\n    var children = props.children,\n        defaultValue = props.defaultValue;\n\n    if (children != null) {\n      {\n        error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');\n      }\n\n      {\n        if (!(defaultValue == null)) {\n          {\n            throw Error( \"If you supply `defaultValue` on a <textarea>, do not pass children.\" );\n          }\n        }\n\n        if (Array.isArray(children)) {\n          if (!(children.length <= 1)) {\n            {\n              throw Error( \"<textarea> can only have at most one child.\" );\n            }\n          }\n\n          children = children[0];\n        }\n\n        defaultValue = children;\n      }\n    }\n\n    if (defaultValue == null) {\n      defaultValue = '';\n    }\n\n    initialValue = defaultValue;\n  }\n\n  node._wrapperState = {\n    initialValue: getToStringValue(initialValue)\n  };\n}\nfunction updateWrapper$1(element, props) {\n  var node = element;\n  var value = getToStringValue(props.value);\n  var defaultValue = getToStringValue(props.defaultValue);\n\n  if (value != null) {\n    // Cast `value` to a string to ensure the value is set correctly. While\n    // browsers typically do this as necessary, jsdom doesn't.\n    var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed\n\n    if (newValue !== node.value) {\n      node.value = newValue;\n    }\n\n    if (props.defaultValue == null && node.defaultValue !== newValue) {\n      node.defaultValue = newValue;\n    }\n  }\n\n  if (defaultValue != null) {\n    node.defaultValue = toString(defaultValue);\n  }\n}\nfunction postMountWrapper$3(element, props) {\n  var node = element; // This is in postMount because we need access to the DOM node, which is not\n  // available until after the component has mounted.\n\n  var textContent = node.textContent; // Only set node.value if textContent is equal to the expected\n  // initial value. In IE10/IE11 there is a bug where the placeholder attribute\n  // will populate textContent as well.\n  // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/\n\n  if (textContent === node._wrapperState.initialValue) {\n    if (textContent !== '' && textContent !== null) {\n      node.value = textContent;\n    }\n  }\n}\nfunction restoreControlledState$2(element, props) {\n  // DOM component is still mounted; update\n  updateWrapper$1(element, props);\n}\n\nvar HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nvar MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\nvar SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nvar Namespaces = {\n  html: HTML_NAMESPACE,\n  mathml: MATH_NAMESPACE,\n  svg: SVG_NAMESPACE\n}; // Assumes there is no parent namespace.\n\nfunction getIntrinsicNamespace(type) {\n  switch (type) {\n    case 'svg':\n      return SVG_NAMESPACE;\n\n    case 'math':\n      return MATH_NAMESPACE;\n\n    default:\n      return HTML_NAMESPACE;\n  }\n}\nfunction getChildNamespace(parentNamespace, type) {\n  if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {\n    // No (or default) parent namespace: potential entry point.\n    return getIntrinsicNamespace(type);\n  }\n\n  if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {\n    // We're leaving SVG.\n    return HTML_NAMESPACE;\n  } // By default, pass namespace below.\n\n\n  return parentNamespace;\n}\n\n/* globals MSApp */\n\n/**\n * Create a function which has 'unsafe' privileges (required by windows8 apps)\n */\nvar createMicrosoftUnsafeLocalFunction = function (func) {\n  if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n    return function (arg0, arg1, arg2, arg3) {\n      MSApp.execUnsafeLocalFunction(function () {\n        return func(arg0, arg1, arg2, arg3);\n      });\n    };\n  } else {\n    return func;\n  }\n};\n\nvar reusableSVGContainer;\n/**\n * Set the innerHTML property of a node\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\n\nvar setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {\n  if (node.namespaceURI === Namespaces.svg) {\n\n    if (!('innerHTML' in node)) {\n      // IE does not have innerHTML for SVG nodes, so instead we inject the\n      // new markup in a temp node and then move the child nodes across into\n      // the target node\n      reusableSVGContainer = reusableSVGContainer || document.createElement('div');\n      reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';\n      var svgNode = reusableSVGContainer.firstChild;\n\n      while (node.firstChild) {\n        node.removeChild(node.firstChild);\n      }\n\n      while (svgNode.firstChild) {\n        node.appendChild(svgNode.firstChild);\n      }\n\n      return;\n    }\n  }\n\n  node.innerHTML = html;\n});\n\n/**\n * HTML nodeType values that represent the type of the node\n */\nvar ELEMENT_NODE = 1;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\nvar DOCUMENT_NODE = 9;\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\n/**\n * Set the textContent property of a node. For text updates, it's faster\n * to set the `nodeValue` of the Text node directly instead of using\n * `.textContent` which will remove the existing node and create a new one.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\n\nvar setTextContent = function (node, text) {\n  if (text) {\n    var firstChild = node.firstChild;\n\n    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {\n      firstChild.nodeValue = text;\n      return;\n    }\n  }\n\n  node.textContent = text;\n};\n\n// Do not use the below two methods directly!\n// Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.\n// (It is the only module that is allowed to access these methods.)\nfunction unsafeCastStringToDOMTopLevelType(topLevelType) {\n  return topLevelType;\n}\nfunction unsafeCastDOMTopLevelTypeToString(topLevelType) {\n  return topLevelType;\n}\n\n/**\n * Generate a mapping of standard vendor prefixes using the defined style property and event name.\n *\n * @param {string} styleProp\n * @param {string} eventName\n * @returns {object}\n */\n\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes['Webkit' + styleProp] = 'webkit' + eventName;\n  prefixes['Moz' + styleProp] = 'moz' + eventName;\n  return prefixes;\n}\n/**\n * A list of event names to a configurable list of vendor prefixes.\n */\n\n\nvar vendorPrefixes = {\n  animationend: makePrefixMap('Animation', 'AnimationEnd'),\n  animationiteration: makePrefixMap('Animation', 'AnimationIteration'),\n  animationstart: makePrefixMap('Animation', 'AnimationStart'),\n  transitionend: makePrefixMap('Transition', 'TransitionEnd')\n};\n/**\n * Event names that have already been detected and prefixed (if applicable).\n */\n\nvar prefixedEventNames = {};\n/**\n * Element to check for prefixes on.\n */\n\nvar style = {};\n/**\n * Bootstrap if a DOM exists.\n */\n\nif (canUseDOM) {\n  style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,\n  // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n  // style object but the events that fire will still be prefixed, so we need\n  // to check if the un-prefixed events are usable, and if not remove them from the map.\n\n  if (!('AnimationEvent' in window)) {\n    delete vendorPrefixes.animationend.animation;\n    delete vendorPrefixes.animationiteration.animation;\n    delete vendorPrefixes.animationstart.animation;\n  } // Same as above\n\n\n  if (!('TransitionEvent' in window)) {\n    delete vendorPrefixes.transitionend.transition;\n  }\n}\n/**\n * Attempts to determine the correct vendor prefixed event name.\n *\n * @param {string} eventName\n * @returns {string}\n */\n\n\nfunction getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) {\n    return prefixedEventNames[eventName];\n  } else if (!vendorPrefixes[eventName]) {\n    return eventName;\n  }\n\n  var prefixMap = vendorPrefixes[eventName];\n\n  for (var styleProp in prefixMap) {\n    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {\n      return prefixedEventNames[eventName] = prefixMap[styleProp];\n    }\n  }\n\n  return eventName;\n}\n\n/**\n * To identify top level events in ReactDOM, we use constants defined by this\n * module. This is the only module that uses the unsafe* methods to express\n * that the constants actually correspond to the browser event names. This lets\n * us save some bundle size by avoiding a top level type -> event name map.\n * The rest of ReactDOM code should import top level types from this file.\n */\n\nvar TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');\nvar TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));\nvar TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));\nvar TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));\nvar TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');\nvar TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');\nvar TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');\nvar TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');\nvar TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');\nvar TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');\nvar TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');\nvar TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');\nvar TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');\nvar TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');\nvar TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');\nvar TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');\nvar TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');\nvar TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');\nvar TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');\nvar TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');\nvar TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');\nvar TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');\nvar TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');\nvar TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');\nvar TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');\nvar TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');\nvar TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');\nvar TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');\nvar TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');\nvar TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');\nvar TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');\nvar TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');\nvar TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');\nvar TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');\nvar TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');\nvar TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');\nvar TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');\nvar TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');\nvar TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');\nvar TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');\nvar TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');\nvar TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');\nvar TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');\nvar TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');\nvar TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');\nvar TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');\nvar TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');\nvar TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');\nvar TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');\nvar TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');\nvar TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');\nvar TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');\nvar TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');\nvar TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');\nvar TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');\nvar TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');\nvar TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');\nvar TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');\nvar TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');\nvar TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');\nvar TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');\nvar TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');\nvar TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');\nvar TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');\nvar TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');\nvar TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');\nvar TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');\nvar TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');\nvar TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');\nvar TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');\nvar TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');\nvar TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');\nvar TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');\nvar TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');\nvar TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');\nvar TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');\nvar TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));\nvar TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');\nvar TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');\nvar TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements.\n// Note that events in this list will *not* be listened to at the top level\n// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.\n\nvar mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];\nfunction getRawEventName(topLevelType) {\n  return unsafeCastDOMTopLevelTypeToString(topLevelType);\n}\n\nvar PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // prettier-ignore\n\nvar elementListenerMap = new PossiblyWeakMap();\nfunction getListenerMapForElement(element) {\n  var listenerMap = elementListenerMap.get(element);\n\n  if (listenerMap === undefined) {\n    listenerMap = new Map();\n    elementListenerMap.set(element, listenerMap);\n  }\n\n  return listenerMap;\n}\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n *\n * Note that this module is currently shared and assumed to be stateless.\n * If this becomes an actual Map, that will break.\n */\nfunction get(key) {\n  return key._reactInternalFiber;\n}\nfunction has(key) {\n  return key._reactInternalFiber !== undefined;\n}\nfunction set(key, value) {\n  key._reactInternalFiber = value;\n}\n\n// Don't change these two values. They're used by React Dev Tools.\nvar NoEffect =\n/*              */\n0;\nvar PerformedWork =\n/*         */\n1; // You can change the rest (and add more).\n\nvar Placement =\n/*             */\n2;\nvar Update =\n/*                */\n4;\nvar PlacementAndUpdate =\n/*    */\n6;\nvar Deletion =\n/*              */\n8;\nvar ContentReset =\n/*          */\n16;\nvar Callback =\n/*              */\n32;\nvar DidCapture =\n/*            */\n64;\nvar Ref =\n/*                   */\n128;\nvar Snapshot =\n/*              */\n256;\nvar Passive =\n/*               */\n512;\nvar Hydrating =\n/*             */\n1024;\nvar HydratingAndUpdate =\n/*    */\n1028; // Passive & Update & Callback & Ref & Snapshot\n\nvar LifecycleEffectMask =\n/*   */\n932; // Union of all host effects\n\nvar HostEffectMask =\n/*        */\n2047;\nvar Incomplete =\n/*            */\n2048;\nvar ShouldCapture =\n/*         */\n4096;\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nfunction getNearestMountedFiber(fiber) {\n  var node = fiber;\n  var nearestMounted = fiber;\n\n  if (!fiber.alternate) {\n    // If there is no alternate, this might be a new tree that isn't inserted\n    // yet. If it is, then it will have a pending insertion effect on it.\n    var nextNode = node;\n\n    do {\n      node = nextNode;\n\n      if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) {\n        // This is an insertion or in-progress hydration. The nearest possible\n        // mounted fiber is the parent but we need to continue to figure out\n        // if that one is still mounted.\n        nearestMounted = node.return;\n      }\n\n      nextNode = node.return;\n    } while (nextNode);\n  } else {\n    while (node.return) {\n      node = node.return;\n    }\n  }\n\n  if (node.tag === HostRoot) {\n    // TODO: Check if this was a nested HostRoot when used with\n    // renderContainerIntoSubtree.\n    return nearestMounted;\n  } // If we didn't hit the root, that means that we're in an disconnected tree\n  // that has been unmounted.\n\n\n  return null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n  if (fiber.tag === SuspenseComponent) {\n    var suspenseState = fiber.memoizedState;\n\n    if (suspenseState === null) {\n      var current = fiber.alternate;\n\n      if (current !== null) {\n        suspenseState = current.memoizedState;\n      }\n    }\n\n    if (suspenseState !== null) {\n      return suspenseState.dehydrated;\n    }\n  }\n\n  return null;\n}\nfunction getContainerFromFiber(fiber) {\n  return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;\n}\nfunction isFiberMounted(fiber) {\n  return getNearestMountedFiber(fiber) === fiber;\n}\nfunction isMounted(component) {\n  {\n    var owner = ReactCurrentOwner.current;\n\n    if (owner !== null && owner.tag === ClassComponent) {\n      var ownerFiber = owner;\n      var instance = ownerFiber.stateNode;\n\n      if (!instance._warnedAboutRefsInRender) {\n        error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component');\n      }\n\n      instance._warnedAboutRefsInRender = true;\n    }\n  }\n\n  var fiber = get(component);\n\n  if (!fiber) {\n    return false;\n  }\n\n  return getNearestMountedFiber(fiber) === fiber;\n}\n\nfunction assertIsMounted(fiber) {\n  if (!(getNearestMountedFiber(fiber) === fiber)) {\n    {\n      throw Error( \"Unable to find node on an unmounted component.\" );\n    }\n  }\n}\n\nfunction findCurrentFiberUsingSlowPath(fiber) {\n  var alternate = fiber.alternate;\n\n  if (!alternate) {\n    // If there is no alternate, then we only need to check if it is mounted.\n    var nearestMounted = getNearestMountedFiber(fiber);\n\n    if (!(nearestMounted !== null)) {\n      {\n        throw Error( \"Unable to find node on an unmounted component.\" );\n      }\n    }\n\n    if (nearestMounted !== fiber) {\n      return null;\n    }\n\n    return fiber;\n  } // If we have two possible branches, we'll walk backwards up to the root\n  // to see what path the root points to. On the way we may hit one of the\n  // special cases and we'll deal with them.\n\n\n  var a = fiber;\n  var b = alternate;\n\n  while (true) {\n    var parentA = a.return;\n\n    if (parentA === null) {\n      // We're at the root.\n      break;\n    }\n\n    var parentB = parentA.alternate;\n\n    if (parentB === null) {\n      // There is no alternate. This is an unusual case. Currently, it only\n      // happens when a Suspense component is hidden. An extra fragment fiber\n      // is inserted in between the Suspense fiber and its children. Skip\n      // over this extra fragment fiber and proceed to the next parent.\n      var nextParent = parentA.return;\n\n      if (nextParent !== null) {\n        a = b = nextParent;\n        continue;\n      } // If there's no parent, we're at the root.\n\n\n      break;\n    } // If both copies of the parent fiber point to the same child, we can\n    // assume that the child is current. This happens when we bailout on low\n    // priority: the bailed out fiber's child reuses the current child.\n\n\n    if (parentA.child === parentB.child) {\n      var child = parentA.child;\n\n      while (child) {\n        if (child === a) {\n          // We've determined that A is the current branch.\n          assertIsMounted(parentA);\n          return fiber;\n        }\n\n        if (child === b) {\n          // We've determined that B is the current branch.\n          assertIsMounted(parentA);\n          return alternate;\n        }\n\n        child = child.sibling;\n      } // We should never have an alternate for any mounting node. So the only\n      // way this could possibly happen is if this was unmounted, if at all.\n\n\n      {\n        {\n          throw Error( \"Unable to find node on an unmounted component.\" );\n        }\n      }\n    }\n\n    if (a.return !== b.return) {\n      // The return pointer of A and the return pointer of B point to different\n      // fibers. We assume that return pointers never criss-cross, so A must\n      // belong to the child set of A.return, and B must belong to the child\n      // set of B.return.\n      a = parentA;\n      b = parentB;\n    } else {\n      // The return pointers point to the same fiber. We'll have to use the\n      // default, slow path: scan the child sets of each parent alternate to see\n      // which child belongs to which set.\n      //\n      // Search parent A's child set\n      var didFindChild = false;\n      var _child = parentA.child;\n\n      while (_child) {\n        if (_child === a) {\n          didFindChild = true;\n          a = parentA;\n          b = parentB;\n          break;\n        }\n\n        if (_child === b) {\n          didFindChild = true;\n          b = parentA;\n          a = parentB;\n          break;\n        }\n\n        _child = _child.sibling;\n      }\n\n      if (!didFindChild) {\n        // Search parent B's child set\n        _child = parentB.child;\n\n        while (_child) {\n          if (_child === a) {\n            didFindChild = true;\n            a = parentB;\n            b = parentA;\n            break;\n          }\n\n          if (_child === b) {\n            didFindChild = true;\n            b = parentB;\n            a = parentA;\n            break;\n          }\n\n          _child = _child.sibling;\n        }\n\n        if (!didFindChild) {\n          {\n            throw Error( \"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.\" );\n          }\n        }\n      }\n    }\n\n    if (!(a.alternate === b)) {\n      {\n        throw Error( \"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  } // If the root is not a host container, we're in a disconnected tree. I.e.\n  // unmounted.\n\n\n  if (!(a.tag === HostRoot)) {\n    {\n      throw Error( \"Unable to find node on an unmounted component.\" );\n    }\n  }\n\n  if (a.stateNode.current === a) {\n    // We've determined that A is the current branch.\n    return fiber;\n  } // Otherwise B has to be current branch.\n\n\n  return alternate;\n}\nfunction findCurrentHostFiber(parent) {\n  var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n  if (!currentParent) {\n    return null;\n  } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n  var node = currentParent;\n\n  while (true) {\n    if (node.tag === HostComponent || node.tag === HostText) {\n      return node;\n    } else if (node.child) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === currentParent) {\n      return null;\n    }\n\n    while (!node.sibling) {\n      if (!node.return || node.return === currentParent) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  } // Flow needs the return null here, but ESLint complains about it.\n  // eslint-disable-next-line no-unreachable\n\n\n  return null;\n}\nfunction findCurrentHostFiberWithNoPortals(parent) {\n  var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n  if (!currentParent) {\n    return null;\n  } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n  var node = currentParent;\n\n  while (true) {\n    if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) {\n      return node;\n    } else if (node.child && node.tag !== HostPortal) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === currentParent) {\n      return null;\n    }\n\n    while (!node.sibling) {\n      if (!node.return || node.return === currentParent) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  } // Flow needs the return null here, but ESLint complains about it.\n  // eslint-disable-next-line no-unreachable\n\n\n  return null;\n}\n\n/**\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n  if (!(next != null)) {\n    {\n      throw Error( \"accumulateInto(...): Accumulated items must not be null or undefined.\" );\n    }\n  }\n\n  if (current == null) {\n    return next;\n  } // Both are not empty. Warning: Never call x.concat(y) when you are not\n  // certain that x is an Array (x could be a string with concat method).\n\n\n  if (Array.isArray(current)) {\n    if (Array.isArray(next)) {\n      current.push.apply(current, next);\n      return current;\n    }\n\n    current.push(next);\n    return current;\n  }\n\n  if (Array.isArray(next)) {\n    // A bit too dangerous to mutate `next`.\n    return [current].concat(next);\n  }\n\n  return [current, next];\n}\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n * @param {function} cb Callback invoked with each element or a collection.\n * @param {?} [scope] Scope used as `this` in a callback.\n */\nfunction forEachAccumulated(arr, cb, scope) {\n  if (Array.isArray(arr)) {\n    arr.forEach(cb, scope);\n  } else if (arr) {\n    cb.call(scope, arr);\n  }\n}\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\n\nvar eventQueue = null;\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @private\n */\n\nvar executeDispatchesAndRelease = function (event) {\n  if (event) {\n    executeDispatchesInOrder(event);\n\n    if (!event.isPersistent()) {\n      event.constructor.release(event);\n    }\n  }\n};\n\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n  return executeDispatchesAndRelease(e);\n};\n\nfunction runEventsInBatch(events) {\n  if (events !== null) {\n    eventQueue = accumulateInto(eventQueue, events);\n  } // Set `eventQueue` to null before processing it so that we can tell if more\n  // events get enqueued while processing.\n\n\n  var processingEventQueue = eventQueue;\n  eventQueue = null;\n\n  if (!processingEventQueue) {\n    return;\n  }\n\n  forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n\n  if (!!eventQueue) {\n    {\n      throw Error( \"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\" );\n    }\n  } // This would be a good time to rethrow if any of the event handlers threw.\n\n\n  rethrowCaughtError();\n}\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\n\nfunction getEventTarget(nativeEvent) {\n  // Fallback to nativeEvent.srcElement for IE9\n  // https://github.com/facebook/react/issues/12506\n  var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963\n\n  if (target.correspondingUseElement) {\n    target = target.correspondingUseElement;\n  } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n  // @see http://www.quirksmode.org/js/events_properties.html\n\n\n  return target.nodeType === TEXT_NODE ? target.parentNode : target;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\n\nfunction isEventSupported(eventNameSuffix) {\n  if (!canUseDOM) {\n    return false;\n  }\n\n  var eventName = 'on' + eventNameSuffix;\n  var isSupported = eventName in document;\n\n  if (!isSupported) {\n    var element = document.createElement('div');\n    element.setAttribute(eventName, 'return;');\n    isSupported = typeof element[eventName] === 'function';\n  }\n\n  return isSupported;\n}\n\n/**\n * Summary of `DOMEventPluginSystem` event handling:\n *\n *  - Top-level delegation is used to trap most native browser events. This\n *    may only occur in the main thread and is the responsibility of\n *    ReactDOMEventListener, which is injected and can therefore support\n *    pluggable event sources. This is the only work that occurs in the main\n *    thread.\n *\n *  - We normalize and de-duplicate events to account for browser quirks. This\n *    may be done in the worker thread.\n *\n *  - Forward these native events (with the associated top-level type used to\n *    trap it) to `EventPluginRegistry`, which in turn will ask plugins if they want\n *    to extract any synthetic events.\n *\n *  - The `EventPluginRegistry` will then process each event by annotating them with\n *    \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n *  - The `EventPluginRegistry` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+    .\n * |    DOM     |    .\n * +------------+    .\n *       |           .\n *       v           .\n * +------------+    .\n * | ReactEvent |    .\n * |  Listener  |    .\n * +------------+    .                         +-----------+\n *       |           .               +--------+|SimpleEvent|\n *       |           .               |         |Plugin     |\n * +-----|------+    .               v         +-----------+\n * |     |      |    .    +--------------+                    +------------+\n * |     +-----------.--->|PluginRegistry|                    |    Event   |\n * |            |    .    |              |     +-----------+  | Propagators|\n * | ReactEvent |    .    |              |     |TapEvent   |  |------------|\n * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|\n * |            |    .    |              |     +-----------+  |  utilities |\n * |     +-----------.--->|              |                    +------------+\n * |     |      |    .    +--------------+\n * +-----|------+    .                ^        +-----------+\n *       |           .                |        |Enter/Leave|\n *       +           .                +-------+|Plugin     |\n * +-------------+   .                         +-----------+\n * | application |   .\n * |-------------|   .\n * |             |   .\n * |             |   .\n * +-------------+   .\n *                   .\n *    React Core     .  General Purpose Event Plugin System\n */\n\nvar CALLBACK_BOOKKEEPING_POOL_SIZE = 10;\nvar callbackBookkeepingPool = [];\n\nfunction releaseTopLevelCallbackBookKeeping(instance) {\n  instance.topLevelType = null;\n  instance.nativeEvent = null;\n  instance.targetInst = null;\n  instance.ancestors.length = 0;\n\n  if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {\n    callbackBookkeepingPool.push(instance);\n  }\n} // Used to store ancestor hierarchy in top level callback\n\n\nfunction getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) {\n  if (callbackBookkeepingPool.length) {\n    var instance = callbackBookkeepingPool.pop();\n    instance.topLevelType = topLevelType;\n    instance.eventSystemFlags = eventSystemFlags;\n    instance.nativeEvent = nativeEvent;\n    instance.targetInst = targetInst;\n    return instance;\n  }\n\n  return {\n    topLevelType: topLevelType,\n    eventSystemFlags: eventSystemFlags,\n    nativeEvent: nativeEvent,\n    targetInst: targetInst,\n    ancestors: []\n  };\n}\n/**\n * Find the deepest React component completely containing the root of the\n * passed-in instance (for use when entire React trees are nested within each\n * other). If React trees are not nested, returns null.\n */\n\n\nfunction findRootContainerNode(inst) {\n  if (inst.tag === HostRoot) {\n    return inst.stateNode.containerInfo;\n  } // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n  // traversal, but caching is difficult to do correctly without using a\n  // mutation observer to listen for all DOM changes.\n\n\n  while (inst.return) {\n    inst = inst.return;\n  }\n\n  if (inst.tag !== HostRoot) {\n    // This can happen if we're in a detached tree.\n    return null;\n  }\n\n  return inst.stateNode.containerInfo;\n}\n/**\n * Allows registered plugins an opportunity to extract events from top-level\n * native browser events.\n *\n * @return {*} An accumulation of synthetic events.\n * @internal\n */\n\n\nfunction extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n  var events = null;\n\n  for (var i = 0; i < plugins.length; i++) {\n    // Not every plugin in the ordering may be loaded at runtime.\n    var possiblePlugin = plugins[i];\n\n    if (possiblePlugin) {\n      var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n\n      if (extractedEvents) {\n        events = accumulateInto(events, extractedEvents);\n      }\n    }\n  }\n\n  return events;\n}\n\nfunction runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n  var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n  runEventsInBatch(events);\n}\n\nfunction handleTopLevel(bookKeeping) {\n  var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components.\n  // It's important that we build the array of ancestors before calling any\n  // event handlers, because event handlers can modify the DOM, leading to\n  // inconsistencies with ReactMount's node cache. See #1105.\n\n  var ancestor = targetInst;\n\n  do {\n    if (!ancestor) {\n      var ancestors = bookKeeping.ancestors;\n      ancestors.push(ancestor);\n      break;\n    }\n\n    var root = findRootContainerNode(ancestor);\n\n    if (!root) {\n      break;\n    }\n\n    var tag = ancestor.tag;\n\n    if (tag === HostComponent || tag === HostText) {\n      bookKeeping.ancestors.push(ancestor);\n    }\n\n    ancestor = getClosestInstanceFromNode(root);\n  } while (ancestor);\n\n  for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n    targetInst = bookKeeping.ancestors[i];\n    var eventTarget = getEventTarget(bookKeeping.nativeEvent);\n    var topLevelType = bookKeeping.topLevelType;\n    var nativeEvent = bookKeeping.nativeEvent;\n    var eventSystemFlags = bookKeeping.eventSystemFlags; // If this is the first ancestor, we mark it on the system flags\n\n    if (i === 0) {\n      eventSystemFlags |= IS_FIRST_ANCESTOR;\n    }\n\n    runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, eventSystemFlags);\n  }\n}\n\nfunction dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) {\n  var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags);\n\n  try {\n    // Event queue being processed in the same cycle allows\n    // `preventDefault`.\n    batchedEventUpdates(handleTopLevel, bookKeeping);\n  } finally {\n    releaseTopLevelCallbackBookKeeping(bookKeeping);\n  }\n}\n/**\n * We listen for bubbled touch events on the document object.\n *\n * Firefox v8.01 (and possibly others) exhibited strange behavior when\n * mounting `onmousemove` events at some node that was not the document\n * element. The symptoms were that if your mouse is not moving over something\n * contained within that mount point (for example on the background) the\n * top-level listeners for `onmousemove` won't be called. However, if you\n * register the `mousemove` on the document object, then it will of course\n * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n * top-level listeners to the document object only, at least for these\n * movement types of events and possibly all events.\n *\n * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n *\n * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n * they bubble to document.\n *\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {object} mountAt Container where to mount the listener\n */\n\nfunction legacyListenToEvent(registrationName, mountAt) {\n  var listenerMap = getListenerMapForElement(mountAt);\n  var dependencies = registrationNameDependencies[registrationName];\n\n  for (var i = 0; i < dependencies.length; i++) {\n    var dependency = dependencies[i];\n    legacyListenToTopLevelEvent(dependency, mountAt, listenerMap);\n  }\n}\nfunction legacyListenToTopLevelEvent(topLevelType, mountAt, listenerMap) {\n  if (!listenerMap.has(topLevelType)) {\n    switch (topLevelType) {\n      case TOP_SCROLL:\n        trapCapturedEvent(TOP_SCROLL, mountAt);\n        break;\n\n      case TOP_FOCUS:\n      case TOP_BLUR:\n        trapCapturedEvent(TOP_FOCUS, mountAt);\n        trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function,\n        // but this ensures we mark both as attached rather than just one.\n\n        listenerMap.set(TOP_BLUR, null);\n        listenerMap.set(TOP_FOCUS, null);\n        break;\n\n      case TOP_CANCEL:\n      case TOP_CLOSE:\n        if (isEventSupported(getRawEventName(topLevelType))) {\n          trapCapturedEvent(topLevelType, mountAt);\n        }\n\n        break;\n\n      case TOP_INVALID:\n      case TOP_SUBMIT:\n      case TOP_RESET:\n        // We listen to them on the target DOM elements.\n        // Some of them bubble so we don't want them to fire twice.\n        break;\n\n      default:\n        // By default, listen on the top level to all non-media events.\n        // Media events don't bubble so adding the listener wouldn't do anything.\n        var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1;\n\n        if (!isMediaEvent) {\n          trapBubbledEvent(topLevelType, mountAt);\n        }\n\n        break;\n    }\n\n    listenerMap.set(topLevelType, null);\n  }\n}\nfunction isListeningToAllDependencies(registrationName, mountAt) {\n  var listenerMap = getListenerMapForElement(mountAt);\n  var dependencies = registrationNameDependencies[registrationName];\n\n  for (var i = 0; i < dependencies.length; i++) {\n    var dependency = dependencies[i];\n\n    if (!listenerMap.has(dependency)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvar attemptUserBlockingHydration;\nfunction setAttemptUserBlockingHydration(fn) {\n  attemptUserBlockingHydration = fn;\n}\nvar attemptContinuousHydration;\nfunction setAttemptContinuousHydration(fn) {\n  attemptContinuousHydration = fn;\n}\nvar attemptHydrationAtCurrentPriority;\nfunction setAttemptHydrationAtCurrentPriority(fn) {\n  attemptHydrationAtCurrentPriority = fn;\n} // TODO: Upgrade this definition once we're on a newer version of Flow that\nvar hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.\n\nvar queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.\n// if the last target was dehydrated.\n\nvar queuedFocus = null;\nvar queuedDrag = null;\nvar queuedMouse = null; // For pointer events there can be one latest event per pointerId.\n\nvar queuedPointers = new Map();\nvar queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.\n\nvar queuedExplicitHydrationTargets = [];\nfunction hasQueuedDiscreteEvents() {\n  return queuedDiscreteEvents.length > 0;\n}\nvar discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT];\nvar continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE];\nfunction isReplayableDiscreteEvent(eventType) {\n  return discreteReplayableEvents.indexOf(eventType) > -1;\n}\n\nfunction trapReplayableEventForDocument(topLevelType, document, listenerMap) {\n  legacyListenToTopLevelEvent(topLevelType, document, listenerMap);\n}\n\nfunction eagerlyTrapReplayableEvents(container, document) {\n  var listenerMapForDoc = getListenerMapForElement(document); // Discrete\n\n  discreteReplayableEvents.forEach(function (topLevelType) {\n    trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n  }); // Continuous\n\n  continuousReplayableEvents.forEach(function (topLevelType) {\n    trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n  });\n}\n\nfunction createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  return {\n    blockedOn: blockedOn,\n    topLevelType: topLevelType,\n    eventSystemFlags: eventSystemFlags | IS_REPLAYED,\n    nativeEvent: nativeEvent,\n    container: container\n  };\n}\n\nfunction queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n  queuedDiscreteEvents.push(queuedEvent);\n} // Resets the replaying for this type of continuous event to no event.\n\nfunction clearIfContinuousEvent(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_FOCUS:\n    case TOP_BLUR:\n      queuedFocus = null;\n      break;\n\n    case TOP_DRAG_ENTER:\n    case TOP_DRAG_LEAVE:\n      queuedDrag = null;\n      break;\n\n    case TOP_MOUSE_OVER:\n    case TOP_MOUSE_OUT:\n      queuedMouse = null;\n      break;\n\n    case TOP_POINTER_OVER:\n    case TOP_POINTER_OUT:\n      {\n        var pointerId = nativeEvent.pointerId;\n        queuedPointers.delete(pointerId);\n        break;\n      }\n\n    case TOP_GOT_POINTER_CAPTURE:\n    case TOP_LOST_POINTER_CAPTURE:\n      {\n        var _pointerId = nativeEvent.pointerId;\n        queuedPointerCaptures.delete(_pointerId);\n        break;\n      }\n  }\n}\n\nfunction accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {\n    var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n\n    if (blockedOn !== null) {\n      var _fiber2 = getInstanceFromNode$1(blockedOn);\n\n      if (_fiber2 !== null) {\n        // Attempt to increase the priority of this target.\n        attemptContinuousHydration(_fiber2);\n      }\n    }\n\n    return queuedEvent;\n  } // If we have already queued this exact event, then it's because\n  // the different event systems have different DOM event listeners.\n  // We can accumulate the flags and store a single event to be\n  // replayed.\n\n\n  existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n  return existingQueuedEvent;\n}\n\nfunction queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  // These set relatedTarget to null because the replayed event will be treated as if we\n  // moved from outside the window (no target) onto the target once it hydrates.\n  // Instead of mutating we could clone the event.\n  switch (topLevelType) {\n    case TOP_FOCUS:\n      {\n        var focusEvent = nativeEvent;\n        queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, container, focusEvent);\n        return true;\n      }\n\n    case TOP_DRAG_ENTER:\n      {\n        var dragEvent = nativeEvent;\n        queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, container, dragEvent);\n        return true;\n      }\n\n    case TOP_MOUSE_OVER:\n      {\n        var mouseEvent = nativeEvent;\n        queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, container, mouseEvent);\n        return true;\n      }\n\n    case TOP_POINTER_OVER:\n      {\n        var pointerEvent = nativeEvent;\n        var pointerId = pointerEvent.pointerId;\n        queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, container, pointerEvent));\n        return true;\n      }\n\n    case TOP_GOT_POINTER_CAPTURE:\n      {\n        var _pointerEvent = nativeEvent;\n        var _pointerId2 = _pointerEvent.pointerId;\n        queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, container, _pointerEvent));\n        return true;\n      }\n  }\n\n  return false;\n} // Check if this target is unblocked. Returns true if it's unblocked.\n\nfunction attemptExplicitHydrationTarget(queuedTarget) {\n  // TODO: This function shares a lot of logic with attemptToDispatchEvent.\n  // Try to unify them. It's a bit tricky since it would require two return\n  // values.\n  var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n\n  if (targetInst !== null) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n\n    if (nearestMounted !== null) {\n      var tag = nearestMounted.tag;\n\n      if (tag === SuspenseComponent) {\n        var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n        if (instance !== null) {\n          // We're blocked on hydrating this boundary.\n          // Increase its priority.\n          queuedTarget.blockedOn = instance;\n          Scheduler.unstable_runWithPriority(queuedTarget.priority, function () {\n            attemptHydrationAtCurrentPriority(nearestMounted);\n          });\n          return;\n        }\n      } else if (tag === HostRoot) {\n        var root = nearestMounted.stateNode;\n\n        if (root.hydrate) {\n          queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of\n          // a root other than sync.\n\n          return;\n        }\n      }\n    }\n  }\n\n  queuedTarget.blockedOn = null;\n}\n\nfunction attemptReplayContinuousQueuedEvent(queuedEvent) {\n  if (queuedEvent.blockedOn !== null) {\n    return false;\n  }\n\n  var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.container, queuedEvent.nativeEvent);\n\n  if (nextBlockedOn !== null) {\n    // We're still blocked. Try again later.\n    var _fiber3 = getInstanceFromNode$1(nextBlockedOn);\n\n    if (_fiber3 !== null) {\n      attemptContinuousHydration(_fiber3);\n    }\n\n    queuedEvent.blockedOn = nextBlockedOn;\n    return false;\n  }\n\n  return true;\n}\n\nfunction attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n  if (attemptReplayContinuousQueuedEvent(queuedEvent)) {\n    map.delete(key);\n  }\n}\n\nfunction replayUnblockedEvents() {\n  hasScheduledReplayAttempt = false; // First replay discrete events.\n\n  while (queuedDiscreteEvents.length > 0) {\n    var nextDiscreteEvent = queuedDiscreteEvents[0];\n\n    if (nextDiscreteEvent.blockedOn !== null) {\n      // We're still blocked.\n      // Increase the priority of this boundary to unblock\n      // the next discrete event.\n      var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn);\n\n      if (_fiber4 !== null) {\n        attemptUserBlockingHydration(_fiber4);\n      }\n\n      break;\n    }\n\n    var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.container, nextDiscreteEvent.nativeEvent);\n\n    if (nextBlockedOn !== null) {\n      // We're still blocked. Try again later.\n      nextDiscreteEvent.blockedOn = nextBlockedOn;\n    } else {\n      // We've successfully replayed the first event. Let's try the next one.\n      queuedDiscreteEvents.shift();\n    }\n  } // Next replay any continuous events.\n\n\n  if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {\n    queuedFocus = null;\n  }\n\n  if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {\n    queuedDrag = null;\n  }\n\n  if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {\n    queuedMouse = null;\n  }\n\n  queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n  queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n}\n\nfunction scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n  if (queuedEvent.blockedOn === unblocked) {\n    queuedEvent.blockedOn = null;\n\n    if (!hasScheduledReplayAttempt) {\n      hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are\n      // now unblocked. This first might not actually be unblocked yet.\n      // We could check it early to avoid scheduling an unnecessary callback.\n\n      Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents);\n    }\n  }\n}\n\nfunction retryIfBlockedOn(unblocked) {\n  // Mark anything that was blocked on this as no longer blocked\n  // and eligible for a replay.\n  if (queuedDiscreteEvents.length > 0) {\n    scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's\n    // worth it because we expect very few discrete events to queue up and once\n    // we are actually fully unblocked it will be fast to replay them.\n\n    for (var i = 1; i < queuedDiscreteEvents.length; i++) {\n      var queuedEvent = queuedDiscreteEvents[i];\n\n      if (queuedEvent.blockedOn === unblocked) {\n        queuedEvent.blockedOn = null;\n      }\n    }\n  }\n\n  if (queuedFocus !== null) {\n    scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n  }\n\n  if (queuedDrag !== null) {\n    scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n  }\n\n  if (queuedMouse !== null) {\n    scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n  }\n\n  var unblock = function (queuedEvent) {\n    return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n  };\n\n  queuedPointers.forEach(unblock);\n  queuedPointerCaptures.forEach(unblock);\n\n  for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {\n    var queuedTarget = queuedExplicitHydrationTargets[_i];\n\n    if (queuedTarget.blockedOn === unblocked) {\n      queuedTarget.blockedOn = null;\n    }\n  }\n\n  while (queuedExplicitHydrationTargets.length > 0) {\n    var nextExplicitTarget = queuedExplicitHydrationTargets[0];\n\n    if (nextExplicitTarget.blockedOn !== null) {\n      // We're still blocked.\n      break;\n    } else {\n      attemptExplicitHydrationTarget(nextExplicitTarget);\n\n      if (nextExplicitTarget.blockedOn === null) {\n        // We're unblocked.\n        queuedExplicitHydrationTargets.shift();\n      }\n    }\n  }\n}\n\nfunction addEventBubbleListener(element, eventType, listener) {\n  element.addEventListener(eventType, listener, false);\n}\nfunction addEventCaptureListener(element, eventType, listener) {\n  element.addEventListener(eventType, listener, true);\n}\n\n// do it in two places, which duplicates logic\n// and increases the bundle size, we do it all\n// here once. If we remove or refactor the\n// SimpleEventPlugin, we should also remove or\n// update the below line.\n\nvar simpleEventPluginEventTypes = {};\nvar topLevelEventsToDispatchConfig = new Map();\nvar eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use\n// the code required to apply the same logic for event prioritization and that of the\n// SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code\n// duplication (for which there would be quite a bit). For the events that are not needed\n// for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an\n// array of top level events.\n// Lastly, we ignore prettier so we can keep the formatting sane.\n// prettier-ignore\n\nvar discreteEventPairsForSimpleEventPlugin = [TOP_BLUR, 'blur', TOP_CANCEL, 'cancel', TOP_CLICK, 'click', TOP_CLOSE, 'close', TOP_CONTEXT_MENU, 'contextMenu', TOP_COPY, 'copy', TOP_CUT, 'cut', TOP_AUX_CLICK, 'auxClick', TOP_DOUBLE_CLICK, 'doubleClick', TOP_DRAG_END, 'dragEnd', TOP_DRAG_START, 'dragStart', TOP_DROP, 'drop', TOP_FOCUS, 'focus', TOP_INPUT, 'input', TOP_INVALID, 'invalid', TOP_KEY_DOWN, 'keyDown', TOP_KEY_PRESS, 'keyPress', TOP_KEY_UP, 'keyUp', TOP_MOUSE_DOWN, 'mouseDown', TOP_MOUSE_UP, 'mouseUp', TOP_PASTE, 'paste', TOP_PAUSE, 'pause', TOP_PLAY, 'play', TOP_POINTER_CANCEL, 'pointerCancel', TOP_POINTER_DOWN, 'pointerDown', TOP_POINTER_UP, 'pointerUp', TOP_RATE_CHANGE, 'rateChange', TOP_RESET, 'reset', TOP_SEEKED, 'seeked', TOP_SUBMIT, 'submit', TOP_TOUCH_CANCEL, 'touchCancel', TOP_TOUCH_END, 'touchEnd', TOP_TOUCH_START, 'touchStart', TOP_VOLUME_CHANGE, 'volumeChange'];\nvar otherDiscreteEvents = [TOP_CHANGE, TOP_SELECTION_CHANGE, TOP_TEXT_INPUT, TOP_COMPOSITION_START, TOP_COMPOSITION_END, TOP_COMPOSITION_UPDATE]; // prettier-ignore\n\nvar userBlockingPairsForSimpleEventPlugin = [TOP_DRAG, 'drag', TOP_DRAG_ENTER, 'dragEnter', TOP_DRAG_EXIT, 'dragExit', TOP_DRAG_LEAVE, 'dragLeave', TOP_DRAG_OVER, 'dragOver', TOP_MOUSE_MOVE, 'mouseMove', TOP_MOUSE_OUT, 'mouseOut', TOP_MOUSE_OVER, 'mouseOver', TOP_POINTER_MOVE, 'pointerMove', TOP_POINTER_OUT, 'pointerOut', TOP_POINTER_OVER, 'pointerOver', TOP_SCROLL, 'scroll', TOP_TOGGLE, 'toggle', TOP_TOUCH_MOVE, 'touchMove', TOP_WHEEL, 'wheel']; // prettier-ignore\n\nvar continuousPairsForSimpleEventPlugin = [TOP_ABORT, 'abort', TOP_ANIMATION_END, 'animationEnd', TOP_ANIMATION_ITERATION, 'animationIteration', TOP_ANIMATION_START, 'animationStart', TOP_CAN_PLAY, 'canPlay', TOP_CAN_PLAY_THROUGH, 'canPlayThrough', TOP_DURATION_CHANGE, 'durationChange', TOP_EMPTIED, 'emptied', TOP_ENCRYPTED, 'encrypted', TOP_ENDED, 'ended', TOP_ERROR, 'error', TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', TOP_LOAD, 'load', TOP_LOADED_DATA, 'loadedData', TOP_LOADED_METADATA, 'loadedMetadata', TOP_LOAD_START, 'loadStart', TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', TOP_PLAYING, 'playing', TOP_PROGRESS, 'progress', TOP_SEEKING, 'seeking', TOP_STALLED, 'stalled', TOP_SUSPEND, 'suspend', TOP_TIME_UPDATE, 'timeUpdate', TOP_TRANSITION_END, 'transitionEnd', TOP_WAITING, 'waiting'];\n/**\n * Turns\n * ['abort', ...]\n * into\n * eventTypes = {\n *   'abort': {\n *     phasedRegistrationNames: {\n *       bubbled: 'onAbort',\n *       captured: 'onAbortCapture',\n *     },\n *     dependencies: [TOP_ABORT],\n *   },\n *   ...\n * };\n * topLevelEventsToDispatchConfig = new Map([\n *   [TOP_ABORT, { sameConfig }],\n * ]);\n */\n\nfunction processSimpleEventPluginPairsByPriority(eventTypes, priority) {\n  // As the event types are in pairs of two, we need to iterate\n  // through in twos. The events are in pairs of two to save code\n  // and improve init perf of processing this array, as it will\n  // result in far fewer object allocations and property accesses\n  // if we only use three arrays to process all the categories of\n  // instead of tuples.\n  for (var i = 0; i < eventTypes.length; i += 2) {\n    var topEvent = eventTypes[i];\n    var event = eventTypes[i + 1];\n    var capitalizedEvent = event[0].toUpperCase() + event.slice(1);\n    var onEvent = 'on' + capitalizedEvent;\n    var config = {\n      phasedRegistrationNames: {\n        bubbled: onEvent,\n        captured: onEvent + 'Capture'\n      },\n      dependencies: [topEvent],\n      eventPriority: priority\n    };\n    eventPriorities.set(topEvent, priority);\n    topLevelEventsToDispatchConfig.set(topEvent, config);\n    simpleEventPluginEventTypes[event] = config;\n  }\n}\n\nfunction processTopEventPairsByPriority(eventTypes, priority) {\n  for (var i = 0; i < eventTypes.length; i++) {\n    eventPriorities.set(eventTypes[i], priority);\n  }\n} // SimpleEventPlugin\n\n\nprocessSimpleEventPluginPairsByPriority(discreteEventPairsForSimpleEventPlugin, DiscreteEvent);\nprocessSimpleEventPluginPairsByPriority(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent);\nprocessSimpleEventPluginPairsByPriority(continuousPairsForSimpleEventPlugin, ContinuousEvent); // Not used by SimpleEventPlugin\n\nprocessTopEventPairsByPriority(otherDiscreteEvents, DiscreteEvent);\nfunction getEventPriorityForPluginSystem(topLevelType) {\n  var priority = eventPriorities.get(topLevelType); // Default to a ContinuousEvent. Note: we might\n  // want to warn if we can't detect the priority\n  // for the event.\n\n  return priority === undefined ? ContinuousEvent : priority;\n}\n\n// Intentionally not named imports because Rollup would use dynamic dispatch for\nvar UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n    runWithPriority = Scheduler.unstable_runWithPriority; // TODO: can we stop exporting these?\n\nvar _enabled = true;\nfunction setEnabled(enabled) {\n  _enabled = !!enabled;\n}\nfunction isEnabled() {\n  return _enabled;\n}\nfunction trapBubbledEvent(topLevelType, element) {\n  trapEventForPluginEventSystem(element, topLevelType, false);\n}\nfunction trapCapturedEvent(topLevelType, element) {\n  trapEventForPluginEventSystem(element, topLevelType, true);\n}\n\nfunction trapEventForPluginEventSystem(container, topLevelType, capture) {\n  var listener;\n\n  switch (getEventPriorityForPluginSystem(topLevelType)) {\n    case DiscreteEvent:\n      listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n\n    case UserBlockingEvent:\n      listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n\n    case ContinuousEvent:\n    default:\n      listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n  }\n\n  var rawEventName = getRawEventName(topLevelType);\n\n  if (capture) {\n    addEventCaptureListener(container, rawEventName, listener);\n  } else {\n    addEventBubbleListener(container, rawEventName, listener);\n  }\n}\n\nfunction dispatchDiscreteEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp);\n  discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, container, nativeEvent);\n}\n\nfunction dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, container, nativeEvent) {\n  runWithPriority(UserBlockingPriority, dispatchEvent.bind(null, topLevelType, eventSystemFlags, container, nativeEvent));\n}\n\nfunction dispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  if (!_enabled) {\n    return;\n  }\n\n  if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) {\n    // If we already have a queue of discrete events, and this is another discrete\n    // event, then we can't dispatch it regardless of its target, since they\n    // need to dispatch in order.\n    queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know.\n    topLevelType, eventSystemFlags, container, nativeEvent);\n    return;\n  }\n\n  var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent);\n\n  if (blockedOn === null) {\n    // We successfully dispatched this event.\n    clearIfContinuousEvent(topLevelType, nativeEvent);\n    return;\n  }\n\n  if (isReplayableDiscreteEvent(topLevelType)) {\n    // This this to be replayed later once the target is available.\n    queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n    return;\n  }\n\n  if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent)) {\n    return;\n  } // We need to clear only if we didn't queue because\n  // queueing is accummulative.\n\n\n  clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target,\n  // in case the event system needs to trace it.\n\n  {\n    dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);\n  }\n} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked.\n\nfunction attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  // TODO: Warn if _enabled is false.\n  var nativeEventTarget = getEventTarget(nativeEvent);\n  var targetInst = getClosestInstanceFromNode(nativeEventTarget);\n\n  if (targetInst !== null) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n\n    if (nearestMounted === null) {\n      // This tree has been unmounted already. Dispatch without a target.\n      targetInst = null;\n    } else {\n      var tag = nearestMounted.tag;\n\n      if (tag === SuspenseComponent) {\n        var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n        if (instance !== null) {\n          // Queue the event to be replayed later. Abort dispatching since we\n          // don't want this event dispatched twice through the event system.\n          // TODO: If this is the first discrete event in the queue. Schedule an increased\n          // priority for this boundary.\n          return instance;\n        } // This shouldn't happen, something went wrong but to avoid blocking\n        // the whole system, dispatch the event without a target.\n        // TODO: Warn.\n\n\n        targetInst = null;\n      } else if (tag === HostRoot) {\n        var root = nearestMounted.stateNode;\n\n        if (root.hydrate) {\n          // If this happens during a replay something went wrong and it might block\n          // the whole system.\n          return getContainerFromFiber(nearestMounted);\n        }\n\n        targetInst = null;\n      } else if (nearestMounted !== targetInst) {\n        // If we get an event (ex: img onload) before committing that\n        // component's mount, ignore it for now (that is, treat it as if it was an\n        // event on a non-React tree). We might also consider queueing events and\n        // dispatching them after the mount.\n        targetInst = null;\n      }\n    }\n  }\n\n  {\n    dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);\n  } // We're not blocked on anything.\n\n\n  return null;\n}\n\n// List derived from Gecko source code:\n// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js\nvar shorthandToLonghand = {\n  animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],\n  background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],\n  backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],\n  border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n  borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],\n  borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],\n  borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],\n  borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],\n  borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],\n  borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],\n  borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],\n  borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],\n  borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],\n  borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],\n  borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],\n  borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n  borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],\n  columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],\n  columns: ['columnCount', 'columnWidth'],\n  flex: ['flexBasis', 'flexGrow', 'flexShrink'],\n  flexFlow: ['flexDirection', 'flexWrap'],\n  font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],\n  fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],\n  gap: ['columnGap', 'rowGap'],\n  grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n  gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],\n  gridColumn: ['gridColumnEnd', 'gridColumnStart'],\n  gridColumnGap: ['columnGap'],\n  gridGap: ['columnGap', 'rowGap'],\n  gridRow: ['gridRowEnd', 'gridRowStart'],\n  gridRowGap: ['rowGap'],\n  gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n  listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],\n  margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],\n  marker: ['markerEnd', 'markerMid', 'markerStart'],\n  mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],\n  maskPosition: ['maskPositionX', 'maskPositionY'],\n  outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],\n  overflow: ['overflowX', 'overflowY'],\n  padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],\n  placeContent: ['alignContent', 'justifyContent'],\n  placeItems: ['alignItems', 'justifyItems'],\n  placeSelf: ['alignSelf', 'justifySelf'],\n  textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],\n  textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],\n  transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],\n  wordWrap: ['overflowWrap']\n};\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n  animationIterationCount: true,\n  borderImageOutset: true,\n  borderImageSlice: true,\n  borderImageWidth: true,\n  boxFlex: true,\n  boxFlexGroup: true,\n  boxOrdinalGroup: true,\n  columnCount: true,\n  columns: true,\n  flex: true,\n  flexGrow: true,\n  flexPositive: true,\n  flexShrink: true,\n  flexNegative: true,\n  flexOrder: true,\n  gridArea: true,\n  gridRow: true,\n  gridRowEnd: true,\n  gridRowSpan: true,\n  gridRowStart: true,\n  gridColumn: true,\n  gridColumnEnd: true,\n  gridColumnSpan: true,\n  gridColumnStart: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  tabSize: true,\n  widows: true,\n  zIndex: true,\n  zoom: true,\n  // SVG-related properties\n  fillOpacity: true,\n  floodOpacity: true,\n  stopOpacity: true,\n  strokeDasharray: true,\n  strokeDashoffset: true,\n  strokeMiterlimit: true,\n  strokeOpacity: true,\n  strokeWidth: true\n};\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\n\nfunction prefixKey(prefix, key) {\n  return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\n\n\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\n\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n  prefixes.forEach(function (prefix) {\n    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n  });\n});\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\n\nfunction dangerousStyleValue(name, value, isCustomProperty) {\n  // Note that we've removed escapeTextForBrowser() calls here since the\n  // whole string will be escaped when the attribute is injected into\n  // the markup. If you provide unsafe user data here they can inject\n  // arbitrary CSS which may be problematic (I couldn't repro this):\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n  // This is not an XSS hole but instead a potential CSS injection issue\n  // which has lead to a greater discussion about how we're going to\n  // trust URLs moving forward. See #2115901\n  var isEmpty = value == null || typeof value === 'boolean' || value === '';\n\n  if (isEmpty) {\n    return '';\n  }\n\n  if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {\n    return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n  }\n\n  return ('' + value).trim();\n}\n\nvar uppercasePattern = /([A-Z])/g;\nvar msPattern = /^ms-/;\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n *   > hyphenateStyleName('backgroundColor')\n *   < \"background-color\"\n *   > hyphenateStyleName('MozTransition')\n *   < \"-moz-transition\"\n *   > hyphenateStyleName('msTransition')\n *   < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n */\n\nfunction hyphenateStyleName(name) {\n  return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n}\n\nvar warnValidStyle = function () {};\n\n{\n  // 'msTransform' is correct, but the other prefixes should be capitalized\n  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n  var msPattern$1 = /^-ms-/;\n  var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon\n\n  var badStyleValueWithSemicolonPattern = /;\\s*$/;\n  var warnedStyleNames = {};\n  var warnedStyleValues = {};\n  var warnedForNaNValue = false;\n  var warnedForInfinityValue = false;\n\n  var camelize = function (string) {\n    return string.replace(hyphenPattern, function (_, character) {\n      return character.toUpperCase();\n    });\n  };\n\n  var warnHyphenatedStyleName = function (name) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n\n    error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests\n    // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n    // is converted to lowercase `ms`.\n    camelize(name.replace(msPattern$1, 'ms-')));\n  };\n\n  var warnBadVendoredStyleName = function (name) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n\n    error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));\n  };\n\n  var warnStyleValueWithSemicolon = function (name, value) {\n    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n      return;\n    }\n\n    warnedStyleValues[value] = true;\n\n    error(\"Style property values shouldn't contain a semicolon. \" + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));\n  };\n\n  var warnStyleValueIsNaN = function (name, value) {\n    if (warnedForNaNValue) {\n      return;\n    }\n\n    warnedForNaNValue = true;\n\n    error('`NaN` is an invalid value for the `%s` css style property.', name);\n  };\n\n  var warnStyleValueIsInfinity = function (name, value) {\n    if (warnedForInfinityValue) {\n      return;\n    }\n\n    warnedForInfinityValue = true;\n\n    error('`Infinity` is an invalid value for the `%s` css style property.', name);\n  };\n\n  warnValidStyle = function (name, value) {\n    if (name.indexOf('-') > -1) {\n      warnHyphenatedStyleName(name);\n    } else if (badVendoredStyleNamePattern.test(name)) {\n      warnBadVendoredStyleName(name);\n    } else if (badStyleValueWithSemicolonPattern.test(value)) {\n      warnStyleValueWithSemicolon(name, value);\n    }\n\n    if (typeof value === 'number') {\n      if (isNaN(value)) {\n        warnStyleValueIsNaN(name, value);\n      } else if (!isFinite(value)) {\n        warnStyleValueIsInfinity(name, value);\n      }\n    }\n  };\n}\n\nvar warnValidStyle$1 = warnValidStyle;\n\n/**\n * Operations for dealing with CSS properties.\n */\n\n/**\n * This creates a string that is expected to be equivalent to the style\n * attribute generated by server-side rendering. It by-passes warnings and\n * security checks so it's not safe to use this value for anything other than\n * comparison. It is only used in DEV for SSR validation.\n */\n\nfunction createDangerousStringForStyles(styles) {\n  {\n    var serialized = '';\n    var delimiter = '';\n\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n\n      var styleValue = styles[styleName];\n\n      if (styleValue != null) {\n        var isCustomProperty = styleName.indexOf('--') === 0;\n        serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';\n        serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);\n        delimiter = ';';\n      }\n    }\n\n    return serialized || null;\n  }\n}\n/**\n * Sets the value for multiple styles on a node.  If a value is specified as\n * '' (empty string), the corresponding style property will be unset.\n *\n * @param {DOMElement} node\n * @param {object} styles\n */\n\nfunction setValueForStyles(node, styles) {\n  var style = node.style;\n\n  for (var styleName in styles) {\n    if (!styles.hasOwnProperty(styleName)) {\n      continue;\n    }\n\n    var isCustomProperty = styleName.indexOf('--') === 0;\n\n    {\n      if (!isCustomProperty) {\n        warnValidStyle$1(styleName, styles[styleName]);\n      }\n    }\n\n    var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);\n\n    if (styleName === 'float') {\n      styleName = 'cssFloat';\n    }\n\n    if (isCustomProperty) {\n      style.setProperty(styleName, styleValue);\n    } else {\n      style[styleName] = styleValue;\n    }\n  }\n}\n\nfunction isValueEmpty(value) {\n  return value == null || typeof value === 'boolean' || value === '';\n}\n/**\n * Given {color: 'red', overflow: 'hidden'} returns {\n *   color: 'color',\n *   overflowX: 'overflow',\n *   overflowY: 'overflow',\n * }. This can be read as \"the overflowY property was set by the overflow\n * shorthand\". That is, the values are the property that each was derived from.\n */\n\n\nfunction expandShorthandMap(styles) {\n  var expanded = {};\n\n  for (var key in styles) {\n    var longhands = shorthandToLonghand[key] || [key];\n\n    for (var i = 0; i < longhands.length; i++) {\n      expanded[longhands[i]] = key;\n    }\n  }\n\n  return expanded;\n}\n/**\n * When mixing shorthand and longhand property names, we warn during updates if\n * we expect an incorrect result to occur. In particular, we warn for:\n *\n * Updating a shorthand property (longhand gets overwritten):\n *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}\n *   becomes .style.font = 'baz'\n * Removing a shorthand property (longhand gets lost too):\n *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}\n *   becomes .style.font = ''\n * Removing a longhand property (should revert to shorthand; doesn't):\n *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}\n *   becomes .style.fontVariant = ''\n */\n\n\nfunction validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {\n  {\n\n    if (!nextStyles) {\n      return;\n    }\n\n    var expandedUpdates = expandShorthandMap(styleUpdates);\n    var expandedStyles = expandShorthandMap(nextStyles);\n    var warnedAbout = {};\n\n    for (var key in expandedUpdates) {\n      var originalKey = expandedUpdates[key];\n      var correctOriginalKey = expandedStyles[key];\n\n      if (correctOriginalKey && originalKey !== correctOriginalKey) {\n        var warningKey = originalKey + ',' + correctOriginalKey;\n\n        if (warnedAbout[warningKey]) {\n          continue;\n        }\n\n        warnedAbout[warningKey] = true;\n\n        error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + \"avoid this, don't mix shorthand and non-shorthand properties \" + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);\n      }\n    }\n  }\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nvar omittedCloseTags = {\n  area: true,\n  base: true,\n  br: true,\n  col: true,\n  embed: true,\n  hr: true,\n  img: true,\n  input: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.\n\n};\n\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = _assign({\n  menuitem: true\n}, omittedCloseTags);\n\nvar HTML = '__html';\nvar ReactDebugCurrentFrame$3 = null;\n\n{\n  ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;\n}\n\nfunction assertValidProps(tag, props) {\n  if (!props) {\n    return;\n  } // Note the use of `==` which checks for null or undefined.\n\n\n  if (voidElementTags[tag]) {\n    if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {\n      {\n        throw Error( tag + \" is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n      }\n    }\n  }\n\n  if (props.dangerouslySetInnerHTML != null) {\n    if (!(props.children == null)) {\n      {\n        throw Error( \"Can only set one of `children` or `props.dangerouslySetInnerHTML`.\" );\n      }\n    }\n\n    if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) {\n      {\n        throw Error( \"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\" );\n      }\n    }\n  }\n\n  {\n    if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {\n      error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');\n    }\n  }\n\n  if (!(props.style == null || typeof props.style === 'object')) {\n    {\n      throw Error( \"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n    }\n  }\n}\n\nfunction isCustomComponent(tagName, props) {\n  if (tagName.indexOf('-') === -1) {\n    return typeof props.is === 'string';\n  }\n\n  switch (tagName) {\n    // These are reserved SVG and MathML elements.\n    // We don't mind this whitelist too much because we expect it to never grow.\n    // The alternative is to track the namespace in a few places which is convoluted.\n    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n    case 'annotation-xml':\n    case 'color-profile':\n    case 'font-face':\n    case 'font-face-src':\n    case 'font-face-uri':\n    case 'font-face-format':\n    case 'font-face-name':\n    case 'missing-glyph':\n      return false;\n\n    default:\n      return true;\n  }\n}\n\n// When adding attributes to the HTML or SVG whitelist, be sure to\n// also add them to this module to ensure casing and incorrect name\n// warnings.\nvar possibleStandardNames = {\n  // HTML\n  accept: 'accept',\n  acceptcharset: 'acceptCharset',\n  'accept-charset': 'acceptCharset',\n  accesskey: 'accessKey',\n  action: 'action',\n  allowfullscreen: 'allowFullScreen',\n  alt: 'alt',\n  as: 'as',\n  async: 'async',\n  autocapitalize: 'autoCapitalize',\n  autocomplete: 'autoComplete',\n  autocorrect: 'autoCorrect',\n  autofocus: 'autoFocus',\n  autoplay: 'autoPlay',\n  autosave: 'autoSave',\n  capture: 'capture',\n  cellpadding: 'cellPadding',\n  cellspacing: 'cellSpacing',\n  challenge: 'challenge',\n  charset: 'charSet',\n  checked: 'checked',\n  children: 'children',\n  cite: 'cite',\n  class: 'className',\n  classid: 'classID',\n  classname: 'className',\n  cols: 'cols',\n  colspan: 'colSpan',\n  content: 'content',\n  contenteditable: 'contentEditable',\n  contextmenu: 'contextMenu',\n  controls: 'controls',\n  controlslist: 'controlsList',\n  coords: 'coords',\n  crossorigin: 'crossOrigin',\n  dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',\n  data: 'data',\n  datetime: 'dateTime',\n  default: 'default',\n  defaultchecked: 'defaultChecked',\n  defaultvalue: 'defaultValue',\n  defer: 'defer',\n  dir: 'dir',\n  disabled: 'disabled',\n  disablepictureinpicture: 'disablePictureInPicture',\n  download: 'download',\n  draggable: 'draggable',\n  enctype: 'encType',\n  for: 'htmlFor',\n  form: 'form',\n  formmethod: 'formMethod',\n  formaction: 'formAction',\n  formenctype: 'formEncType',\n  formnovalidate: 'formNoValidate',\n  formtarget: 'formTarget',\n  frameborder: 'frameBorder',\n  headers: 'headers',\n  height: 'height',\n  hidden: 'hidden',\n  high: 'high',\n  href: 'href',\n  hreflang: 'hrefLang',\n  htmlfor: 'htmlFor',\n  httpequiv: 'httpEquiv',\n  'http-equiv': 'httpEquiv',\n  icon: 'icon',\n  id: 'id',\n  innerhtml: 'innerHTML',\n  inputmode: 'inputMode',\n  integrity: 'integrity',\n  is: 'is',\n  itemid: 'itemID',\n  itemprop: 'itemProp',\n  itemref: 'itemRef',\n  itemscope: 'itemScope',\n  itemtype: 'itemType',\n  keyparams: 'keyParams',\n  keytype: 'keyType',\n  kind: 'kind',\n  label: 'label',\n  lang: 'lang',\n  list: 'list',\n  loop: 'loop',\n  low: 'low',\n  manifest: 'manifest',\n  marginwidth: 'marginWidth',\n  marginheight: 'marginHeight',\n  max: 'max',\n  maxlength: 'maxLength',\n  media: 'media',\n  mediagroup: 'mediaGroup',\n  method: 'method',\n  min: 'min',\n  minlength: 'minLength',\n  multiple: 'multiple',\n  muted: 'muted',\n  name: 'name',\n  nomodule: 'noModule',\n  nonce: 'nonce',\n  novalidate: 'noValidate',\n  open: 'open',\n  optimum: 'optimum',\n  pattern: 'pattern',\n  placeholder: 'placeholder',\n  playsinline: 'playsInline',\n  poster: 'poster',\n  preload: 'preload',\n  profile: 'profile',\n  radiogroup: 'radioGroup',\n  readonly: 'readOnly',\n  referrerpolicy: 'referrerPolicy',\n  rel: 'rel',\n  required: 'required',\n  reversed: 'reversed',\n  role: 'role',\n  rows: 'rows',\n  rowspan: 'rowSpan',\n  sandbox: 'sandbox',\n  scope: 'scope',\n  scoped: 'scoped',\n  scrolling: 'scrolling',\n  seamless: 'seamless',\n  selected: 'selected',\n  shape: 'shape',\n  size: 'size',\n  sizes: 'sizes',\n  span: 'span',\n  spellcheck: 'spellCheck',\n  src: 'src',\n  srcdoc: 'srcDoc',\n  srclang: 'srcLang',\n  srcset: 'srcSet',\n  start: 'start',\n  step: 'step',\n  style: 'style',\n  summary: 'summary',\n  tabindex: 'tabIndex',\n  target: 'target',\n  title: 'title',\n  type: 'type',\n  usemap: 'useMap',\n  value: 'value',\n  width: 'width',\n  wmode: 'wmode',\n  wrap: 'wrap',\n  // SVG\n  about: 'about',\n  accentheight: 'accentHeight',\n  'accent-height': 'accentHeight',\n  accumulate: 'accumulate',\n  additive: 'additive',\n  alignmentbaseline: 'alignmentBaseline',\n  'alignment-baseline': 'alignmentBaseline',\n  allowreorder: 'allowReorder',\n  alphabetic: 'alphabetic',\n  amplitude: 'amplitude',\n  arabicform: 'arabicForm',\n  'arabic-form': 'arabicForm',\n  ascent: 'ascent',\n  attributename: 'attributeName',\n  attributetype: 'attributeType',\n  autoreverse: 'autoReverse',\n  azimuth: 'azimuth',\n  basefrequency: 'baseFrequency',\n  baselineshift: 'baselineShift',\n  'baseline-shift': 'baselineShift',\n  baseprofile: 'baseProfile',\n  bbox: 'bbox',\n  begin: 'begin',\n  bias: 'bias',\n  by: 'by',\n  calcmode: 'calcMode',\n  capheight: 'capHeight',\n  'cap-height': 'capHeight',\n  clip: 'clip',\n  clippath: 'clipPath',\n  'clip-path': 'clipPath',\n  clippathunits: 'clipPathUnits',\n  cliprule: 'clipRule',\n  'clip-rule': 'clipRule',\n  color: 'color',\n  colorinterpolation: 'colorInterpolation',\n  'color-interpolation': 'colorInterpolation',\n  colorinterpolationfilters: 'colorInterpolationFilters',\n  'color-interpolation-filters': 'colorInterpolationFilters',\n  colorprofile: 'colorProfile',\n  'color-profile': 'colorProfile',\n  colorrendering: 'colorRendering',\n  'color-rendering': 'colorRendering',\n  contentscripttype: 'contentScriptType',\n  contentstyletype: 'contentStyleType',\n  cursor: 'cursor',\n  cx: 'cx',\n  cy: 'cy',\n  d: 'd',\n  datatype: 'datatype',\n  decelerate: 'decelerate',\n  descent: 'descent',\n  diffuseconstant: 'diffuseConstant',\n  direction: 'direction',\n  display: 'display',\n  divisor: 'divisor',\n  dominantbaseline: 'dominantBaseline',\n  'dominant-baseline': 'dominantBaseline',\n  dur: 'dur',\n  dx: 'dx',\n  dy: 'dy',\n  edgemode: 'edgeMode',\n  elevation: 'elevation',\n  enablebackground: 'enableBackground',\n  'enable-background': 'enableBackground',\n  end: 'end',\n  exponent: 'exponent',\n  externalresourcesrequired: 'externalResourcesRequired',\n  fill: 'fill',\n  fillopacity: 'fillOpacity',\n  'fill-opacity': 'fillOpacity',\n  fillrule: 'fillRule',\n  'fill-rule': 'fillRule',\n  filter: 'filter',\n  filterres: 'filterRes',\n  filterunits: 'filterUnits',\n  floodopacity: 'floodOpacity',\n  'flood-opacity': 'floodOpacity',\n  floodcolor: 'floodColor',\n  'flood-color': 'floodColor',\n  focusable: 'focusable',\n  fontfamily: 'fontFamily',\n  'font-family': 'fontFamily',\n  fontsize: 'fontSize',\n  'font-size': 'fontSize',\n  fontsizeadjust: 'fontSizeAdjust',\n  'font-size-adjust': 'fontSizeAdjust',\n  fontstretch: 'fontStretch',\n  'font-stretch': 'fontStretch',\n  fontstyle: 'fontStyle',\n  'font-style': 'fontStyle',\n  fontvariant: 'fontVariant',\n  'font-variant': 'fontVariant',\n  fontweight: 'fontWeight',\n  'font-weight': 'fontWeight',\n  format: 'format',\n  from: 'from',\n  fx: 'fx',\n  fy: 'fy',\n  g1: 'g1',\n  g2: 'g2',\n  glyphname: 'glyphName',\n  'glyph-name': 'glyphName',\n  glyphorientationhorizontal: 'glyphOrientationHorizontal',\n  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n  glyphorientationvertical: 'glyphOrientationVertical',\n  'glyph-orientation-vertical': 'glyphOrientationVertical',\n  glyphref: 'glyphRef',\n  gradienttransform: 'gradientTransform',\n  gradientunits: 'gradientUnits',\n  hanging: 'hanging',\n  horizadvx: 'horizAdvX',\n  'horiz-adv-x': 'horizAdvX',\n  horizoriginx: 'horizOriginX',\n  'horiz-origin-x': 'horizOriginX',\n  ideographic: 'ideographic',\n  imagerendering: 'imageRendering',\n  'image-rendering': 'imageRendering',\n  in2: 'in2',\n  in: 'in',\n  inlist: 'inlist',\n  intercept: 'intercept',\n  k1: 'k1',\n  k2: 'k2',\n  k3: 'k3',\n  k4: 'k4',\n  k: 'k',\n  kernelmatrix: 'kernelMatrix',\n  kernelunitlength: 'kernelUnitLength',\n  kerning: 'kerning',\n  keypoints: 'keyPoints',\n  keysplines: 'keySplines',\n  keytimes: 'keyTimes',\n  lengthadjust: 'lengthAdjust',\n  letterspacing: 'letterSpacing',\n  'letter-spacing': 'letterSpacing',\n  lightingcolor: 'lightingColor',\n  'lighting-color': 'lightingColor',\n  limitingconeangle: 'limitingConeAngle',\n  local: 'local',\n  markerend: 'markerEnd',\n  'marker-end': 'markerEnd',\n  markerheight: 'markerHeight',\n  markermid: 'markerMid',\n  'marker-mid': 'markerMid',\n  markerstart: 'markerStart',\n  'marker-start': 'markerStart',\n  markerunits: 'markerUnits',\n  markerwidth: 'markerWidth',\n  mask: 'mask',\n  maskcontentunits: 'maskContentUnits',\n  maskunits: 'maskUnits',\n  mathematical: 'mathematical',\n  mode: 'mode',\n  numoctaves: 'numOctaves',\n  offset: 'offset',\n  opacity: 'opacity',\n  operator: 'operator',\n  order: 'order',\n  orient: 'orient',\n  orientation: 'orientation',\n  origin: 'origin',\n  overflow: 'overflow',\n  overlineposition: 'overlinePosition',\n  'overline-position': 'overlinePosition',\n  overlinethickness: 'overlineThickness',\n  'overline-thickness': 'overlineThickness',\n  paintorder: 'paintOrder',\n  'paint-order': 'paintOrder',\n  panose1: 'panose1',\n  'panose-1': 'panose1',\n  pathlength: 'pathLength',\n  patterncontentunits: 'patternContentUnits',\n  patterntransform: 'patternTransform',\n  patternunits: 'patternUnits',\n  pointerevents: 'pointerEvents',\n  'pointer-events': 'pointerEvents',\n  points: 'points',\n  pointsatx: 'pointsAtX',\n  pointsaty: 'pointsAtY',\n  pointsatz: 'pointsAtZ',\n  prefix: 'prefix',\n  preservealpha: 'preserveAlpha',\n  preserveaspectratio: 'preserveAspectRatio',\n  primitiveunits: 'primitiveUnits',\n  property: 'property',\n  r: 'r',\n  radius: 'radius',\n  refx: 'refX',\n  refy: 'refY',\n  renderingintent: 'renderingIntent',\n  'rendering-intent': 'renderingIntent',\n  repeatcount: 'repeatCount',\n  repeatdur: 'repeatDur',\n  requiredextensions: 'requiredExtensions',\n  requiredfeatures: 'requiredFeatures',\n  resource: 'resource',\n  restart: 'restart',\n  result: 'result',\n  results: 'results',\n  rotate: 'rotate',\n  rx: 'rx',\n  ry: 'ry',\n  scale: 'scale',\n  security: 'security',\n  seed: 'seed',\n  shaperendering: 'shapeRendering',\n  'shape-rendering': 'shapeRendering',\n  slope: 'slope',\n  spacing: 'spacing',\n  specularconstant: 'specularConstant',\n  specularexponent: 'specularExponent',\n  speed: 'speed',\n  spreadmethod: 'spreadMethod',\n  startoffset: 'startOffset',\n  stddeviation: 'stdDeviation',\n  stemh: 'stemh',\n  stemv: 'stemv',\n  stitchtiles: 'stitchTiles',\n  stopcolor: 'stopColor',\n  'stop-color': 'stopColor',\n  stopopacity: 'stopOpacity',\n  'stop-opacity': 'stopOpacity',\n  strikethroughposition: 'strikethroughPosition',\n  'strikethrough-position': 'strikethroughPosition',\n  strikethroughthickness: 'strikethroughThickness',\n  'strikethrough-thickness': 'strikethroughThickness',\n  string: 'string',\n  stroke: 'stroke',\n  strokedasharray: 'strokeDasharray',\n  'stroke-dasharray': 'strokeDasharray',\n  strokedashoffset: 'strokeDashoffset',\n  'stroke-dashoffset': 'strokeDashoffset',\n  strokelinecap: 'strokeLinecap',\n  'stroke-linecap': 'strokeLinecap',\n  strokelinejoin: 'strokeLinejoin',\n  'stroke-linejoin': 'strokeLinejoin',\n  strokemiterlimit: 'strokeMiterlimit',\n  'stroke-miterlimit': 'strokeMiterlimit',\n  strokewidth: 'strokeWidth',\n  'stroke-width': 'strokeWidth',\n  strokeopacity: 'strokeOpacity',\n  'stroke-opacity': 'strokeOpacity',\n  suppresscontenteditablewarning: 'suppressContentEditableWarning',\n  suppresshydrationwarning: 'suppressHydrationWarning',\n  surfacescale: 'surfaceScale',\n  systemlanguage: 'systemLanguage',\n  tablevalues: 'tableValues',\n  targetx: 'targetX',\n  targety: 'targetY',\n  textanchor: 'textAnchor',\n  'text-anchor': 'textAnchor',\n  textdecoration: 'textDecoration',\n  'text-decoration': 'textDecoration',\n  textlength: 'textLength',\n  textrendering: 'textRendering',\n  'text-rendering': 'textRendering',\n  to: 'to',\n  transform: 'transform',\n  typeof: 'typeof',\n  u1: 'u1',\n  u2: 'u2',\n  underlineposition: 'underlinePosition',\n  'underline-position': 'underlinePosition',\n  underlinethickness: 'underlineThickness',\n  'underline-thickness': 'underlineThickness',\n  unicode: 'unicode',\n  unicodebidi: 'unicodeBidi',\n  'unicode-bidi': 'unicodeBidi',\n  unicoderange: 'unicodeRange',\n  'unicode-range': 'unicodeRange',\n  unitsperem: 'unitsPerEm',\n  'units-per-em': 'unitsPerEm',\n  unselectable: 'unselectable',\n  valphabetic: 'vAlphabetic',\n  'v-alphabetic': 'vAlphabetic',\n  values: 'values',\n  vectoreffect: 'vectorEffect',\n  'vector-effect': 'vectorEffect',\n  version: 'version',\n  vertadvy: 'vertAdvY',\n  'vert-adv-y': 'vertAdvY',\n  vertoriginx: 'vertOriginX',\n  'vert-origin-x': 'vertOriginX',\n  vertoriginy: 'vertOriginY',\n  'vert-origin-y': 'vertOriginY',\n  vhanging: 'vHanging',\n  'v-hanging': 'vHanging',\n  videographic: 'vIdeographic',\n  'v-ideographic': 'vIdeographic',\n  viewbox: 'viewBox',\n  viewtarget: 'viewTarget',\n  visibility: 'visibility',\n  vmathematical: 'vMathematical',\n  'v-mathematical': 'vMathematical',\n  vocab: 'vocab',\n  widths: 'widths',\n  wordspacing: 'wordSpacing',\n  'word-spacing': 'wordSpacing',\n  writingmode: 'writingMode',\n  'writing-mode': 'writingMode',\n  x1: 'x1',\n  x2: 'x2',\n  x: 'x',\n  xchannelselector: 'xChannelSelector',\n  xheight: 'xHeight',\n  'x-height': 'xHeight',\n  xlinkactuate: 'xlinkActuate',\n  'xlink:actuate': 'xlinkActuate',\n  xlinkarcrole: 'xlinkArcrole',\n  'xlink:arcrole': 'xlinkArcrole',\n  xlinkhref: 'xlinkHref',\n  'xlink:href': 'xlinkHref',\n  xlinkrole: 'xlinkRole',\n  'xlink:role': 'xlinkRole',\n  xlinkshow: 'xlinkShow',\n  'xlink:show': 'xlinkShow',\n  xlinktitle: 'xlinkTitle',\n  'xlink:title': 'xlinkTitle',\n  xlinktype: 'xlinkType',\n  'xlink:type': 'xlinkType',\n  xmlbase: 'xmlBase',\n  'xml:base': 'xmlBase',\n  xmllang: 'xmlLang',\n  'xml:lang': 'xmlLang',\n  xmlns: 'xmlns',\n  'xml:space': 'xmlSpace',\n  xmlnsxlink: 'xmlnsXlink',\n  'xmlns:xlink': 'xmlnsXlink',\n  xmlspace: 'xmlSpace',\n  y1: 'y1',\n  y2: 'y2',\n  y: 'y',\n  ychannelselector: 'yChannelSelector',\n  z: 'z',\n  zoomandpan: 'zoomAndPan'\n};\n\nvar ariaProperties = {\n  'aria-current': 0,\n  // state\n  'aria-details': 0,\n  'aria-disabled': 0,\n  // state\n  'aria-hidden': 0,\n  // state\n  'aria-invalid': 0,\n  // state\n  'aria-keyshortcuts': 0,\n  'aria-label': 0,\n  'aria-roledescription': 0,\n  // Widget Attributes\n  'aria-autocomplete': 0,\n  'aria-checked': 0,\n  'aria-expanded': 0,\n  'aria-haspopup': 0,\n  'aria-level': 0,\n  'aria-modal': 0,\n  'aria-multiline': 0,\n  'aria-multiselectable': 0,\n  'aria-orientation': 0,\n  'aria-placeholder': 0,\n  'aria-pressed': 0,\n  'aria-readonly': 0,\n  'aria-required': 0,\n  'aria-selected': 0,\n  'aria-sort': 0,\n  'aria-valuemax': 0,\n  'aria-valuemin': 0,\n  'aria-valuenow': 0,\n  'aria-valuetext': 0,\n  // Live Region Attributes\n  'aria-atomic': 0,\n  'aria-busy': 0,\n  'aria-live': 0,\n  'aria-relevant': 0,\n  // Drag-and-Drop Attributes\n  'aria-dropeffect': 0,\n  'aria-grabbed': 0,\n  // Relationship Attributes\n  'aria-activedescendant': 0,\n  'aria-colcount': 0,\n  'aria-colindex': 0,\n  'aria-colspan': 0,\n  'aria-controls': 0,\n  'aria-describedby': 0,\n  'aria-errormessage': 0,\n  'aria-flowto': 0,\n  'aria-labelledby': 0,\n  'aria-owns': 0,\n  'aria-posinset': 0,\n  'aria-rowcount': 0,\n  'aria-rowindex': 0,\n  'aria-rowspan': 0,\n  'aria-setsize': 0\n};\n\nvar warnedProperties = {};\nvar rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\nfunction validateProperty(tagName, name) {\n  {\n    if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {\n      return true;\n    }\n\n    if (rARIACamel.test(name)) {\n      var ariaName = 'aria-' + name.slice(4).toLowerCase();\n      var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n      // DOM properties, then it is an invalid aria-* attribute.\n\n      if (correctName == null) {\n        error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);\n\n        warnedProperties[name] = true;\n        return true;\n      } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n      if (name !== correctName) {\n        error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);\n\n        warnedProperties[name] = true;\n        return true;\n      }\n    }\n\n    if (rARIA.test(name)) {\n      var lowerCasedName = name.toLowerCase();\n      var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n      // DOM properties, then it is an invalid aria-* attribute.\n\n      if (standardName == null) {\n        warnedProperties[name] = true;\n        return false;\n      } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n      if (name !== standardName) {\n        error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);\n\n        warnedProperties[name] = true;\n        return true;\n      }\n    }\n  }\n\n  return true;\n}\n\nfunction warnInvalidARIAProps(type, props) {\n  {\n    var invalidProps = [];\n\n    for (var key in props) {\n      var isValid = validateProperty(type, key);\n\n      if (!isValid) {\n        invalidProps.push(key);\n      }\n    }\n\n    var unknownPropString = invalidProps.map(function (prop) {\n      return '`' + prop + '`';\n    }).join(', ');\n\n    if (invalidProps.length === 1) {\n      error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n    } else if (invalidProps.length > 1) {\n      error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n    }\n  }\n}\n\nfunction validateProperties(type, props) {\n  if (isCustomComponent(type, props)) {\n    return;\n  }\n\n  warnInvalidARIAProps(type, props);\n}\n\nvar didWarnValueNull = false;\nfunction validateProperties$1(type, props) {\n  {\n    if (type !== 'input' && type !== 'textarea' && type !== 'select') {\n      return;\n    }\n\n    if (props != null && props.value === null && !didWarnValueNull) {\n      didWarnValueNull = true;\n\n      if (type === 'select' && props.multiple) {\n        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);\n      } else {\n        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);\n      }\n    }\n  }\n}\n\nvar validateProperty$1 = function () {};\n\n{\n  var warnedProperties$1 = {};\n  var _hasOwnProperty = Object.prototype.hasOwnProperty;\n  var EVENT_NAME_REGEX = /^on./;\n  var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;\n  var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\n  var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n\n  validateProperty$1 = function (tagName, name, value, canUseEventSystem) {\n    if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {\n      return true;\n    }\n\n    var lowerCasedName = name.toLowerCase();\n\n    if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {\n      error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // We can't rely on the event system being injected on the server.\n\n\n    if (canUseEventSystem) {\n      if (registrationNameModules.hasOwnProperty(name)) {\n        return true;\n      }\n\n      var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;\n\n      if (registrationName != null) {\n        error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (EVENT_NAME_REGEX.test(name)) {\n        error('Unknown event handler property `%s`. It will be ignored.', name);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n    } else if (EVENT_NAME_REGEX.test(name)) {\n      // If no event plugins have been injected, we are in a server environment.\n      // So we can't tell if the event name is correct for sure, but we can filter\n      // out known bad ones like `onclick`. We can't suggest a specific replacement though.\n      if (INVALID_EVENT_NAME_REGEX.test(name)) {\n        error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);\n      }\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // Let the ARIA attribute hook validate ARIA attributes\n\n\n    if (rARIA$1.test(name) || rARIACamel$1.test(name)) {\n      return true;\n    }\n\n    if (lowerCasedName === 'innerhtml') {\n      error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (lowerCasedName === 'aria') {\n      error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {\n      error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (typeof value === 'number' && isNaN(value)) {\n      error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    var propertyInfo = getPropertyInfo(name);\n    var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.\n\n    if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n      var standardName = possibleStandardNames[lowerCasedName];\n\n      if (standardName !== name) {\n        error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n    } else if (!isReserved && name !== lowerCasedName) {\n      // Unknown attributes should have lowercase casing since that's how they\n      // will be cased anyway with server rendering.\n      error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n      if (value) {\n        error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.', value, name, name, value, name);\n      } else {\n        error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);\n      }\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // Now that we've validated casing, do not validate\n    // data types for reserved props\n\n\n    if (isReserved) {\n      return true;\n    } // Warn when a known attribute is a bad type\n\n\n    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n      warnedProperties$1[name] = true;\n      return false;\n    } // Warn when passing the strings 'false' or 'true' into a boolean prop\n\n\n    if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {\n      error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string \"false\".', name, value);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    return true;\n  };\n}\n\nvar warnUnknownProperties = function (type, props, canUseEventSystem) {\n  {\n    var unknownProps = [];\n\n    for (var key in props) {\n      var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);\n\n      if (!isValid) {\n        unknownProps.push(key);\n      }\n    }\n\n    var unknownPropString = unknownProps.map(function (prop) {\n      return '`' + prop + '`';\n    }).join(', ');\n\n    if (unknownProps.length === 1) {\n      error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n    } else if (unknownProps.length > 1) {\n      error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n    }\n  }\n};\n\nfunction validateProperties$2(type, props, canUseEventSystem) {\n  if (isCustomComponent(type, props)) {\n    return;\n  }\n\n  warnUnknownProperties(type, props, canUseEventSystem);\n}\n\nvar didWarnInvalidHydration = false;\nvar DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';\nvar SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';\nvar SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';\nvar AUTOFOCUS = 'autoFocus';\nvar CHILDREN = 'children';\nvar STYLE = 'style';\nvar HTML$1 = '__html';\nvar HTML_NAMESPACE$1 = Namespaces.html;\nvar warnedUnknownTags;\nvar suppressHydrationWarning;\nvar validatePropertiesInDevelopment;\nvar warnForTextDifference;\nvar warnForPropDifference;\nvar warnForExtraAttributes;\nvar warnForInvalidEventListener;\nvar canDiffStyleForHydrationWarning;\nvar normalizeMarkupForTextOrAttribute;\nvar normalizeHTML;\n\n{\n  warnedUnknownTags = {\n    // Chrome is the only major browser not shipping <time>. But as of July\n    // 2017 it intends to ship it due to widespread usage. We intentionally\n    // *don't* warn for <time> even if it's unrecognized by Chrome because\n    // it soon will be, and many apps have been using it anyway.\n    time: true,\n    // There are working polyfills for <dialog>. Let people use it.\n    dialog: true,\n    // Electron ships a custom <webview> tag to display external web content in\n    // an isolated frame and process.\n    // This tag is not present in non Electron environments such as JSDom which\n    // is often used for testing purposes.\n    // @see https://electronjs.org/docs/api/webview-tag\n    webview: true\n  };\n\n  validatePropertiesInDevelopment = function (type, props) {\n    validateProperties(type, props);\n    validateProperties$1(type, props);\n    validateProperties$2(type, props,\n    /* canUseEventSystem */\n    true);\n  }; // IE 11 parses & normalizes the style attribute as opposed to other\n  // browsers. It adds spaces and sorts the properties in some\n  // non-alphabetical order. Handling that would require sorting CSS\n  // properties in the client & server versions or applying\n  // `expectedStyle` to a temporary DOM node to read its `style` attribute\n  // normalized. Since it only affects IE, we're skipping style warnings\n  // in that browser completely in favor of doing all that work.\n  // See https://github.com/facebook/react/issues/11807\n\n\n  canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF.\n  // It also can turn \\u0000 into \\uFFFD inside attributes.\n  // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream\n  // If we have a mismatch, it might be caused by that.\n  // We will still patch up in this case but not fire the warning.\n\n  var NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g;\n  var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\n\n  normalizeMarkupForTextOrAttribute = function (markup) {\n    var markupString = typeof markup === 'string' ? markup : '' + markup;\n    return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');\n  };\n\n  warnForTextDifference = function (serverText, clientText) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);\n    var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);\n\n    if (normalizedServerText === normalizedClientText) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Text content did not match. Server: \"%s\" Client: \"%s\"', normalizedServerText, normalizedClientText);\n  };\n\n  warnForPropDifference = function (propName, serverValue, clientValue) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);\n    var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);\n\n    if (normalizedServerValue === normalizedClientValue) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));\n  };\n\n  warnForExtraAttributes = function (attributeNames) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n    var names = [];\n    attributeNames.forEach(function (name) {\n      names.push(name);\n    });\n\n    error('Extra attributes from the server: %s', names);\n  };\n\n  warnForInvalidEventListener = function (registrationName, listener) {\n    if (listener === false) {\n      error('Expected `%s` listener to be a function, instead got `false`.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);\n    } else {\n      error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);\n    }\n  }; // Parse the HTML and read it back to normalize the HTML string so that it\n  // can be used for comparison.\n\n\n  normalizeHTML = function (parent, html) {\n    // We could have created a separate document here to avoid\n    // re-initializing custom elements if they exist. But this breaks\n    // how <noscript> is being handled. So we use the same document.\n    // See the discussion in https://github.com/facebook/react/pull/11157.\n    var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);\n    testElement.innerHTML = html;\n    return testElement.innerHTML;\n  };\n}\n\nfunction ensureListeningTo(rootContainerElement, registrationName) {\n  var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;\n  var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;\n  legacyListenToEvent(registrationName, doc);\n}\n\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n  return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;\n}\n\nfunction noop() {}\n\nfunction trapClickOnNonInteractiveElement(node) {\n  // Mobile Safari does not fire properly bubble click events on\n  // non-interactive elements, which means delegated click listeners do not\n  // fire. The workaround for this bug involves attaching an empty click\n  // listener on the target node.\n  // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n  // Just set it using the onclick property so that we don't have to manage any\n  // bookkeeping for it. Not sure if we need to clear it when the listener is\n  // removed.\n  // TODO: Only do this for the relevant Safaris maybe?\n  node.onclick = noop;\n}\n\nfunction setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {\n  for (var propKey in nextProps) {\n    if (!nextProps.hasOwnProperty(propKey)) {\n      continue;\n    }\n\n    var nextProp = nextProps[propKey];\n\n    if (propKey === STYLE) {\n      {\n        if (nextProp) {\n          // Freeze the next style object so that we can assume it won't be\n          // mutated. We have already warned for this in the past.\n          Object.freeze(nextProp);\n        }\n      } // Relies on `updateStylesByID` not mutating `styleUpdates`.\n\n\n      setValueForStyles(domElement, nextProp);\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n\n      if (nextHtml != null) {\n        setInnerHTML(domElement, nextHtml);\n      }\n    } else if (propKey === CHILDREN) {\n      if (typeof nextProp === 'string') {\n        // Avoid setting initial textContent when the text is empty. In IE11 setting\n        // textContent on a <textarea> will cause the placeholder to not\n        // show within the <textarea> until it has been focused and blurred again.\n        // https://github.com/facebook/react/issues/6731#issuecomment-254874553\n        var canSetTextContent = tag !== 'textarea' || nextProp !== '';\n\n        if (canSetTextContent) {\n          setTextContent(domElement, nextProp);\n        }\n      } else if (typeof nextProp === 'number') {\n        setTextContent(domElement, '' + nextProp);\n      }\n    } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n    } else if (nextProp != null) {\n      setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);\n    }\n  }\n}\n\nfunction updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {\n  // TODO: Handle wasCustomComponentTag\n  for (var i = 0; i < updatePayload.length; i += 2) {\n    var propKey = updatePayload[i];\n    var propValue = updatePayload[i + 1];\n\n    if (propKey === STYLE) {\n      setValueForStyles(domElement, propValue);\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      setInnerHTML(domElement, propValue);\n    } else if (propKey === CHILDREN) {\n      setTextContent(domElement, propValue);\n    } else {\n      setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);\n    }\n  }\n}\n\nfunction createElement(type, props, rootContainerElement, parentNamespace) {\n  var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML\n  // tags get no namespace.\n\n  var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);\n  var domElement;\n  var namespaceURI = parentNamespace;\n\n  if (namespaceURI === HTML_NAMESPACE$1) {\n    namespaceURI = getIntrinsicNamespace(type);\n  }\n\n  if (namespaceURI === HTML_NAMESPACE$1) {\n    {\n      isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to\n      // allow <SVG> or <mATH>.\n\n      if (!isCustomComponentTag && type !== type.toLowerCase()) {\n        error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);\n      }\n    }\n\n    if (type === 'script') {\n      // Create the script via .innerHTML so its \"parser-inserted\" flag is\n      // set to true and it does not execute\n      var div = ownerDocument.createElement('div');\n\n      div.innerHTML = '<script><' + '/script>'; // eslint-disable-line\n      // This is guaranteed to yield a script element.\n\n      var firstChild = div.firstChild;\n      domElement = div.removeChild(firstChild);\n    } else if (typeof props.is === 'string') {\n      // $FlowIssue `createElement` should be updated for Web Components\n      domElement = ownerDocument.createElement(type, {\n        is: props.is\n      });\n    } else {\n      // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.\n      // See discussion in https://github.com/facebook/react/pull/6896\n      // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240\n      domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`\n      // attributes on `select`s needs to be added before `option`s are inserted.\n      // This prevents:\n      // - a bug where the `select` does not scroll to the correct option because singular\n      //  `select` elements automatically pick the first item #13222\n      // - a bug where the `select` set the first item as selected despite the `size` attribute #14239\n      // See https://github.com/facebook/react/issues/13222\n      // and https://github.com/facebook/react/issues/14239\n\n      if (type === 'select') {\n        var node = domElement;\n\n        if (props.multiple) {\n          node.multiple = true;\n        } else if (props.size) {\n          // Setting a size greater than 1 causes a select to behave like `multiple=true`, where\n          // it is possible that no option is selected.\n          //\n          // This is only necessary when a select in \"single selection mode\".\n          node.size = props.size;\n        }\n      }\n    }\n  } else {\n    domElement = ownerDocument.createElementNS(namespaceURI, type);\n  }\n\n  {\n    if (namespaceURI === HTML_NAMESPACE$1) {\n      if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {\n        warnedUnknownTags[type] = true;\n\n        error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);\n      }\n    }\n  }\n\n  return domElement;\n}\nfunction createTextNode(text, rootContainerElement) {\n  return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);\n}\nfunction setInitialProperties(domElement, tag, rawProps, rootContainerElement) {\n  var isCustomComponentTag = isCustomComponent(tag, rawProps);\n\n  {\n    validatePropertiesInDevelopment(tag, rawProps);\n  } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n  var props;\n\n  switch (tag) {\n    case 'iframe':\n    case 'object':\n    case 'embed':\n      trapBubbledEvent(TOP_LOAD, domElement);\n      props = rawProps;\n      break;\n\n    case 'video':\n    case 'audio':\n      // Create listener for each media event\n      for (var i = 0; i < mediaEventTypes.length; i++) {\n        trapBubbledEvent(mediaEventTypes[i], domElement);\n      }\n\n      props = rawProps;\n      break;\n\n    case 'source':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      props = rawProps;\n      break;\n\n    case 'img':\n    case 'image':\n    case 'link':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      trapBubbledEvent(TOP_LOAD, domElement);\n      props = rawProps;\n      break;\n\n    case 'form':\n      trapBubbledEvent(TOP_RESET, domElement);\n      trapBubbledEvent(TOP_SUBMIT, domElement);\n      props = rawProps;\n      break;\n\n    case 'details':\n      trapBubbledEvent(TOP_TOGGLE, domElement);\n      props = rawProps;\n      break;\n\n    case 'input':\n      initWrapperState(domElement, rawProps);\n      props = getHostProps(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'option':\n      validateProps(domElement, rawProps);\n      props = getHostProps$1(domElement, rawProps);\n      break;\n\n    case 'select':\n      initWrapperState$1(domElement, rawProps);\n      props = getHostProps$2(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'textarea':\n      initWrapperState$2(domElement, rawProps);\n      props = getHostProps$3(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    default:\n      props = rawProps;\n  }\n\n  assertValidProps(tag, props);\n  setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);\n\n  switch (tag) {\n    case 'input':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper(domElement, rawProps, false);\n      break;\n\n    case 'textarea':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper$3(domElement);\n      break;\n\n    case 'option':\n      postMountWrapper$1(domElement, rawProps);\n      break;\n\n    case 'select':\n      postMountWrapper$2(domElement, rawProps);\n      break;\n\n    default:\n      if (typeof props.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n} // Calculate the diff between the two objects.\n\nfunction diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {\n  {\n    validatePropertiesInDevelopment(tag, nextRawProps);\n  }\n\n  var updatePayload = null;\n  var lastProps;\n  var nextProps;\n\n  switch (tag) {\n    case 'input':\n      lastProps = getHostProps(domElement, lastRawProps);\n      nextProps = getHostProps(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'option':\n      lastProps = getHostProps$1(domElement, lastRawProps);\n      nextProps = getHostProps$1(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'select':\n      lastProps = getHostProps$2(domElement, lastRawProps);\n      nextProps = getHostProps$2(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'textarea':\n      lastProps = getHostProps$3(domElement, lastRawProps);\n      nextProps = getHostProps$3(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    default:\n      lastProps = lastRawProps;\n      nextProps = nextRawProps;\n\n      if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n\n  assertValidProps(tag, nextProps);\n  var propKey;\n  var styleName;\n  var styleUpdates = null;\n\n  for (propKey in lastProps) {\n    if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {\n      continue;\n    }\n\n    if (propKey === STYLE) {\n      var lastStyle = lastProps[propKey];\n\n      for (styleName in lastStyle) {\n        if (lastStyle.hasOwnProperty(styleName)) {\n          if (!styleUpdates) {\n            styleUpdates = {};\n          }\n\n          styleUpdates[styleName] = '';\n        }\n      }\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      // This is a special case. If any listener updates we need to ensure\n      // that the \"current\" fiber pointer gets updated so we need a commit\n      // to update this element.\n      if (!updatePayload) {\n        updatePayload = [];\n      }\n    } else {\n      // For all other deleted properties we add it to the queue. We use\n      // the whitelist in the commit phase instead.\n      (updatePayload = updatePayload || []).push(propKey, null);\n    }\n  }\n\n  for (propKey in nextProps) {\n    var nextProp = nextProps[propKey];\n    var lastProp = lastProps != null ? lastProps[propKey] : undefined;\n\n    if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {\n      continue;\n    }\n\n    if (propKey === STYLE) {\n      {\n        if (nextProp) {\n          // Freeze the next style object so that we can assume it won't be\n          // mutated. We have already warned for this in the past.\n          Object.freeze(nextProp);\n        }\n      }\n\n      if (lastProp) {\n        // Unset styles on `lastProp` but not on `nextProp`.\n        for (styleName in lastProp) {\n          if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = '';\n          }\n        } // Update styles that changed since `lastProp`.\n\n\n        for (styleName in nextProp) {\n          if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = nextProp[styleName];\n          }\n        }\n      } else {\n        // Relies on `updateStylesByID` not mutating `styleUpdates`.\n        if (!styleUpdates) {\n          if (!updatePayload) {\n            updatePayload = [];\n          }\n\n          updatePayload.push(propKey, styleUpdates);\n        }\n\n        styleUpdates = nextProp;\n      }\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n      var lastHtml = lastProp ? lastProp[HTML$1] : undefined;\n\n      if (nextHtml != null) {\n        if (lastHtml !== nextHtml) {\n          (updatePayload = updatePayload || []).push(propKey, nextHtml);\n        }\n      }\n    } else if (propKey === CHILDREN) {\n      if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {\n        (updatePayload = updatePayload || []).push(propKey, '' + nextProp);\n      }\n    } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        // We eagerly listen to this even though we haven't committed yet.\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n\n      if (!updatePayload && lastProp !== nextProp) {\n        // This is a special case. If any listener updates we need to ensure\n        // that the \"current\" props pointer gets updated so we need a commit\n        // to update this element.\n        updatePayload = [];\n      }\n    } else {\n      // For any other property we always add it to the queue and then we\n      // filter it out using the whitelist during the commit.\n      (updatePayload = updatePayload || []).push(propKey, nextProp);\n    }\n  }\n\n  if (styleUpdates) {\n    {\n      validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);\n    }\n\n    (updatePayload = updatePayload || []).push(STYLE, styleUpdates);\n  }\n\n  return updatePayload;\n} // Apply the diff.\n\nfunction updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {\n  // Update checked *before* name.\n  // In the middle of an update, it is possible to have multiple checked.\n  // When a checked radio tries to change name, browser makes another radio's checked false.\n  if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {\n    updateChecked(domElement, nextRawProps);\n  }\n\n  var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);\n  var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.\n\n  updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props\n  // changed.\n\n  switch (tag) {\n    case 'input':\n      // Update the wrapper around inputs *after* updating props. This has to\n      // happen after `updateDOMProperties`. Otherwise HTML5 input validations\n      // raise warnings and prevent the new value from being assigned.\n      updateWrapper(domElement, nextRawProps);\n      break;\n\n    case 'textarea':\n      updateWrapper$1(domElement, nextRawProps);\n      break;\n\n    case 'select':\n      // <select> value update needs to occur after <option> children\n      // reconciliation\n      postUpdateWrapper(domElement, nextRawProps);\n      break;\n  }\n}\n\nfunction getPossibleStandardName(propName) {\n  {\n    var lowerCasedName = propName.toLowerCase();\n\n    if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n      return null;\n    }\n\n    return possibleStandardNames[lowerCasedName] || null;\n  }\n}\n\nfunction diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {\n  var isCustomComponentTag;\n  var extraAttributeNames;\n\n  {\n    suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true;\n    isCustomComponentTag = isCustomComponent(tag, rawProps);\n    validatePropertiesInDevelopment(tag, rawProps);\n  } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n  switch (tag) {\n    case 'iframe':\n    case 'object':\n    case 'embed':\n      trapBubbledEvent(TOP_LOAD, domElement);\n      break;\n\n    case 'video':\n    case 'audio':\n      // Create listener for each media event\n      for (var i = 0; i < mediaEventTypes.length; i++) {\n        trapBubbledEvent(mediaEventTypes[i], domElement);\n      }\n\n      break;\n\n    case 'source':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      break;\n\n    case 'img':\n    case 'image':\n    case 'link':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      trapBubbledEvent(TOP_LOAD, domElement);\n      break;\n\n    case 'form':\n      trapBubbledEvent(TOP_RESET, domElement);\n      trapBubbledEvent(TOP_SUBMIT, domElement);\n      break;\n\n    case 'details':\n      trapBubbledEvent(TOP_TOGGLE, domElement);\n      break;\n\n    case 'input':\n      initWrapperState(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'option':\n      validateProps(domElement, rawProps);\n      break;\n\n    case 'select':\n      initWrapperState$1(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'textarea':\n      initWrapperState$2(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n  }\n\n  assertValidProps(tag, rawProps);\n\n  {\n    extraAttributeNames = new Set();\n    var attributes = domElement.attributes;\n\n    for (var _i = 0; _i < attributes.length; _i++) {\n      var name = attributes[_i].name.toLowerCase();\n\n      switch (name) {\n        // Built-in SSR attribute is whitelisted\n        case 'data-reactroot':\n          break;\n        // Controlled attributes are not validated\n        // TODO: Only ignore them on controlled tags.\n\n        case 'value':\n          break;\n\n        case 'checked':\n          break;\n\n        case 'selected':\n          break;\n\n        default:\n          // Intentionally use the original name.\n          // See discussion in https://github.com/facebook/react/pull/10676.\n          extraAttributeNames.add(attributes[_i].name);\n      }\n    }\n  }\n\n  var updatePayload = null;\n\n  for (var propKey in rawProps) {\n    if (!rawProps.hasOwnProperty(propKey)) {\n      continue;\n    }\n\n    var nextProp = rawProps[propKey];\n\n    if (propKey === CHILDREN) {\n      // For text content children we compare against textContent. This\n      // might match additional HTML that is hidden when we read it using\n      // textContent. E.g. \"foo\" will match \"f<span>oo</span>\" but that still\n      // satisfies our requirement. Our requirement is not to produce perfect\n      // HTML and attributes. Ideally we should preserve structure but it's\n      // ok not to if the visible content is still enough to indicate what\n      // even listeners these nodes might be wired up to.\n      // TODO: Warn if there is more than a single textNode as a child.\n      // TODO: Should we use domElement.firstChild.nodeValue to compare?\n      if (typeof nextProp === 'string') {\n        if (domElement.textContent !== nextProp) {\n          if ( !suppressHydrationWarning) {\n            warnForTextDifference(domElement.textContent, nextProp);\n          }\n\n          updatePayload = [CHILDREN, nextProp];\n        }\n      } else if (typeof nextProp === 'number') {\n        if (domElement.textContent !== '' + nextProp) {\n          if ( !suppressHydrationWarning) {\n            warnForTextDifference(domElement.textContent, nextProp);\n          }\n\n          updatePayload = [CHILDREN, '' + nextProp];\n        }\n      }\n    } else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n    } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.)\n    typeof isCustomComponentTag === 'boolean') {\n      // Validate that the properties correspond to their expected values.\n      var serverValue = void 0;\n      var propertyInfo = getPropertyInfo(propKey);\n\n      if (suppressHydrationWarning) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated\n      // TODO: Only ignore them on controlled tags.\n      propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n        var serverHTML = domElement.innerHTML;\n        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n        var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');\n\n        if (expectedHTML !== serverHTML) {\n          warnForPropDifference(propKey, serverHTML, expectedHTML);\n        }\n      } else if (propKey === STYLE) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        extraAttributeNames.delete(propKey);\n\n        if (canDiffStyleForHydrationWarning) {\n          var expectedStyle = createDangerousStringForStyles(nextProp);\n          serverValue = domElement.getAttribute('style');\n\n          if (expectedStyle !== serverValue) {\n            warnForPropDifference(propKey, serverValue, expectedStyle);\n          }\n        }\n      } else if (isCustomComponentTag) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        extraAttributeNames.delete(propKey.toLowerCase());\n        serverValue = getValueForAttribute(domElement, propKey, nextProp);\n\n        if (nextProp !== serverValue) {\n          warnForPropDifference(propKey, serverValue, nextProp);\n        }\n      } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {\n        var isMismatchDueToBadCasing = false;\n\n        if (propertyInfo !== null) {\n          // $FlowFixMe - Should be inferred as not undefined.\n          extraAttributeNames.delete(propertyInfo.attributeName);\n          serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);\n        } else {\n          var ownNamespace = parentNamespace;\n\n          if (ownNamespace === HTML_NAMESPACE$1) {\n            ownNamespace = getIntrinsicNamespace(tag);\n          }\n\n          if (ownNamespace === HTML_NAMESPACE$1) {\n            // $FlowFixMe - Should be inferred as not undefined.\n            extraAttributeNames.delete(propKey.toLowerCase());\n          } else {\n            var standardName = getPossibleStandardName(propKey);\n\n            if (standardName !== null && standardName !== propKey) {\n              // If an SVG prop is supplied with bad casing, it will\n              // be successfully parsed from HTML, but will produce a mismatch\n              // (and would be incorrectly rendered on the client).\n              // However, we already warn about bad casing elsewhere.\n              // So we'll skip the misleading extra mismatch warning in this case.\n              isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.\n\n              extraAttributeNames.delete(standardName);\n            } // $FlowFixMe - Should be inferred as not undefined.\n\n\n            extraAttributeNames.delete(propKey);\n          }\n\n          serverValue = getValueForAttribute(domElement, propKey, nextProp);\n        }\n\n        if (nextProp !== serverValue && !isMismatchDueToBadCasing) {\n          warnForPropDifference(propKey, serverValue, nextProp);\n        }\n      }\n    }\n  }\n\n  {\n    // $FlowFixMe - Should be inferred as not undefined.\n    if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {\n      // $FlowFixMe - Should be inferred as not undefined.\n      warnForExtraAttributes(extraAttributeNames);\n    }\n  }\n\n  switch (tag) {\n    case 'input':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper(domElement, rawProps, true);\n      break;\n\n    case 'textarea':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper$3(domElement);\n      break;\n\n    case 'select':\n    case 'option':\n      // For input and textarea we current always set the value property at\n      // post mount to force it to diverge from attributes. However, for\n      // option and select we don't quite do the same thing and select\n      // is not resilient to the DOM state changing so we don't do that here.\n      // TODO: Consider not doing this for input and textarea.\n      break;\n\n    default:\n      if (typeof rawProps.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n\n  return updatePayload;\n}\nfunction diffHydratedText(textNode, text) {\n  var isDifferent = textNode.nodeValue !== text;\n  return isDifferent;\n}\nfunction warnForUnmatchedText(textNode, text) {\n  {\n    warnForTextDifference(textNode.nodeValue, text);\n  }\n}\nfunction warnForDeletedHydratableElement(parentNode, child) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForDeletedHydratableText(parentNode, child) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Did not expect server HTML to contain the text node \"%s\" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForInsertedHydratedElement(parentNode, tag, props) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForInsertedHydratedText(parentNode, text) {\n  {\n    if (text === '') {\n      // We expect to insert empty text nodes since they're not represented in\n      // the HTML.\n      // TODO: Remove this special case if we can just avoid inserting empty\n      // text nodes.\n      return;\n    }\n\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Expected server HTML to contain a matching text node for \"%s\" in <%s>.', text, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction restoreControlledState$3(domElement, tag, props) {\n  switch (tag) {\n    case 'input':\n      restoreControlledState(domElement, props);\n      return;\n\n    case 'textarea':\n      restoreControlledState$2(domElement, props);\n      return;\n\n    case 'select':\n      restoreControlledState$1(domElement, props);\n      return;\n  }\n}\n\nfunction getActiveElement(doc) {\n  doc = doc || (typeof document !== 'undefined' ? document : undefined);\n\n  if (typeof doc === 'undefined') {\n    return null;\n  }\n\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\n\nfunction getLeafNode(node) {\n  while (node && node.firstChild) {\n    node = node.firstChild;\n  }\n\n  return node;\n}\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\n\n\nfunction getSiblingNode(node) {\n  while (node) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n\n    node = node.parentNode;\n  }\n}\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\n\n\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  var nodeStart = 0;\n  var nodeEnd = 0;\n\n  while (node) {\n    if (node.nodeType === TEXT_NODE) {\n      nodeEnd = nodeStart + node.textContent.length;\n\n      if (nodeStart <= offset && nodeEnd >= offset) {\n        return {\n          node: node,\n          offset: offset - nodeStart\n        };\n      }\n\n      nodeStart = nodeEnd;\n    }\n\n    node = getLeafNode(getSiblingNode(node));\n  }\n}\n\n/**\n * @param {DOMElement} outerNode\n * @return {?object}\n */\n\nfunction getOffsets(outerNode) {\n  var ownerDocument = outerNode.ownerDocument;\n  var win = ownerDocument && ownerDocument.defaultView || window;\n  var selection = win.getSelection && win.getSelection();\n\n  if (!selection || selection.rangeCount === 0) {\n    return null;\n  }\n\n  var anchorNode = selection.anchorNode,\n      anchorOffset = selection.anchorOffset,\n      focusNode = selection.focusNode,\n      focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be \"anonymous divs\", e.g. the\n  // up/down buttons on an <input type=\"number\">. Anonymous divs do not seem to\n  // expose properties, triggering a \"Permission denied error\" if any of its\n  // properties are accessed. The only seemingly possible way to avoid erroring\n  // is to access a property that typically works for non-anonymous divs and\n  // catch any error that may otherwise arise. See\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n\n  try {\n    /* eslint-disable no-unused-expressions */\n    anchorNode.nodeType;\n    focusNode.nodeType;\n    /* eslint-enable no-unused-expressions */\n  } catch (e) {\n    return null;\n  }\n\n  return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);\n}\n/**\n * Returns {start, end} where `start` is the character/codepoint index of\n * (anchorNode, anchorOffset) within the textContent of `outerNode`, and\n * `end` is the index of (focusNode, focusOffset).\n *\n * Returns null if you pass in garbage input but we should probably just crash.\n *\n * Exported only for testing.\n */\n\nfunction getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {\n  var length = 0;\n  var start = -1;\n  var end = -1;\n  var indexWithinAnchor = 0;\n  var indexWithinFocus = 0;\n  var node = outerNode;\n  var parentNode = null;\n\n  outer: while (true) {\n    var next = null;\n\n    while (true) {\n      if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {\n        start = length + anchorOffset;\n      }\n\n      if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {\n        end = length + focusOffset;\n      }\n\n      if (node.nodeType === TEXT_NODE) {\n        length += node.nodeValue.length;\n      }\n\n      if ((next = node.firstChild) === null) {\n        break;\n      } // Moving from `node` to its first child `next`.\n\n\n      parentNode = node;\n      node = next;\n    }\n\n    while (true) {\n      if (node === outerNode) {\n        // If `outerNode` has children, this is always the second time visiting\n        // it. If it has no children, this is still the first loop, and the only\n        // valid selection is anchorNode and focusNode both equal to this node\n        // and both offsets 0, in which case we will have handled above.\n        break outer;\n      }\n\n      if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {\n        start = length;\n      }\n\n      if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {\n        end = length;\n      }\n\n      if ((next = node.nextSibling) !== null) {\n        break;\n      }\n\n      node = parentNode;\n      parentNode = node.parentNode;\n    } // Moving from `node` to its next sibling `next`.\n\n\n    node = next;\n  }\n\n  if (start === -1 || end === -1) {\n    // This should never happen. (Would happen if the anchor/focus nodes aren't\n    // actually inside the passed-in node.)\n    return null;\n  }\n\n  return {\n    start: start,\n    end: end\n  };\n}\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programmatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\n\nfunction setOffsets(node, offsets) {\n  var doc = node.ownerDocument || document;\n  var win = doc && doc.defaultView || window; // Edge fails with \"Object expected\" in some scenarios.\n  // (For instance: TinyMCE editor used in a list component that supports pasting to add more,\n  // fails when pasting 100+ items)\n\n  if (!win.getSelection) {\n    return;\n  }\n\n  var selection = win.getSelection();\n  var length = node.textContent.length;\n  var start = Math.min(offsets.start, length);\n  var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.\n  // Flip backward selections, so we can set with a single range.\n\n  if (!selection.extend && start > end) {\n    var temp = end;\n    end = start;\n    start = temp;\n  }\n\n  var startMarker = getNodeForCharacterOffset(node, start);\n  var endMarker = getNodeForCharacterOffset(node, end);\n\n  if (startMarker && endMarker) {\n    if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {\n      return;\n    }\n\n    var range = doc.createRange();\n    range.setStart(startMarker.node, startMarker.offset);\n    selection.removeAllRanges();\n\n    if (start > end) {\n      selection.addRange(range);\n      selection.extend(endMarker.node, endMarker.offset);\n    } else {\n      range.setEnd(endMarker.node, endMarker.offset);\n      selection.addRange(range);\n    }\n  }\n}\n\nfunction isTextNode(node) {\n  return node && node.nodeType === TEXT_NODE;\n}\n\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if ('contains' in outerNode) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nfunction isInDocument(node) {\n  return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);\n}\n\nfunction isSameOriginFrame(iframe) {\n  try {\n    // Accessing the contentDocument of a HTMLIframeElement can cause the browser\n    // to throw, e.g. if it has a cross-origin src attribute.\n    // Safari will show an error in the console when the access results in \"Blocked a frame with origin\". e.g:\n    // iframe.contentDocument.defaultView;\n    // A safety way is to access one of the cross origin properties: Window or Location\n    // Which might result in \"SecurityError\" DOM Exception and it is compatible to Safari.\n    // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl\n    return typeof iframe.contentWindow.location.href === 'string';\n  } catch (err) {\n    return false;\n  }\n}\n\nfunction getActiveElementDeep() {\n  var win = window;\n  var element = getActiveElement();\n\n  while (element instanceof win.HTMLIFrameElement) {\n    if (isSameOriginFrame(element)) {\n      win = element.contentWindow;\n    } else {\n      return element;\n    }\n\n    element = getActiveElement(win.document);\n  }\n\n  return element;\n}\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\n\n/**\n * @hasSelectionCapabilities: we get the element types that support selection\n * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`\n * and `selectionEnd` rows.\n */\n\n\nfunction hasSelectionCapabilities(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');\n}\nfunction getSelectionInformation() {\n  var focusedElem = getActiveElementDeep();\n  return {\n    // Used by Flare\n    activeElementDetached: null,\n    focusedElem: focusedElem,\n    selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null\n  };\n}\n/**\n * @restoreSelection: If any selection information was potentially lost,\n * restore it. This is useful when performing operations that could remove dom\n * nodes and place them back in, resulting in focus being lost.\n */\n\nfunction restoreSelection(priorSelectionInformation) {\n  var curFocusedElem = getActiveElementDeep();\n  var priorFocusedElem = priorSelectionInformation.focusedElem;\n  var priorSelectionRange = priorSelectionInformation.selectionRange;\n\n  if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n    if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {\n      setSelection(priorFocusedElem, priorSelectionRange);\n    } // Focusing a node can change the scroll position, which is undesirable\n\n\n    var ancestors = [];\n    var ancestor = priorFocusedElem;\n\n    while (ancestor = ancestor.parentNode) {\n      if (ancestor.nodeType === ELEMENT_NODE) {\n        ancestors.push({\n          element: ancestor,\n          left: ancestor.scrollLeft,\n          top: ancestor.scrollTop\n        });\n      }\n    }\n\n    if (typeof priorFocusedElem.focus === 'function') {\n      priorFocusedElem.focus();\n    }\n\n    for (var i = 0; i < ancestors.length; i++) {\n      var info = ancestors[i];\n      info.element.scrollLeft = info.left;\n      info.element.scrollTop = info.top;\n    }\n  }\n}\n/**\n * @getSelection: Gets the selection bounds of a focused textarea, input or\n * contentEditable node.\n * -@input: Look up selection bounds of this input\n * -@return {start: selectionStart, end: selectionEnd}\n */\n\nfunction getSelection(input) {\n  var selection;\n\n  if ('selectionStart' in input) {\n    // Modern browser with input or textarea.\n    selection = {\n      start: input.selectionStart,\n      end: input.selectionEnd\n    };\n  } else {\n    // Content editable or old IE textarea.\n    selection = getOffsets(input);\n  }\n\n  return selection || {\n    start: 0,\n    end: 0\n  };\n}\n/**\n * @setSelection: Sets the selection bounds of a textarea or input and focuses\n * the input.\n * -@input     Set selection bounds of this input or textarea\n * -@offsets   Object of same form that is returned from get*\n */\n\nfunction setSelection(input, offsets) {\n  var start = offsets.start,\n      end = offsets.end;\n\n  if (end === undefined) {\n    end = start;\n  }\n\n  if ('selectionStart' in input) {\n    input.selectionStart = start;\n    input.selectionEnd = Math.min(end, input.value.length);\n  } else {\n    setOffsets(input, offsets);\n  }\n}\n\nvar validateDOMNesting = function () {};\n\nvar updatedAncestorInfo = function () {};\n\n{\n  // This validation code was written based on the HTML5 parsing spec:\n  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n  //\n  // Note: this does not catch all invalid nesting, nor does it try to (as it's\n  // not clear what practical benefit doing so provides); instead, we warn only\n  // for cases where the parser will give a parse tree differing from what React\n  // intended. For example, <b><div></div></b> is invalid but we don't warn\n  // because it still parses correctly; we do warn for other cases like nested\n  // <p> tags where the beginning of the second element implicitly closes the\n  // first, causing a confusing mess.\n  // https://html.spec.whatwg.org/multipage/syntax.html#special\n  var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n\n  var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n  // TODO: Distinguish by namespace here -- for <title>, including it here\n  // errs on the side of fewer warnings\n  'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n\n  var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n\n  var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n  var emptyAncestorInfo = {\n    current: null,\n    formTag: null,\n    aTagInScope: null,\n    buttonTagInScope: null,\n    nobrTagInScope: null,\n    pTagInButtonScope: null,\n    listItemTagAutoclosing: null,\n    dlItemTagAutoclosing: null\n  };\n\n  updatedAncestorInfo = function (oldInfo, tag) {\n    var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);\n\n    var info = {\n      tag: tag\n    };\n\n    if (inScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.aTagInScope = null;\n      ancestorInfo.buttonTagInScope = null;\n      ancestorInfo.nobrTagInScope = null;\n    }\n\n    if (buttonScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.pTagInButtonScope = null;\n    } // See rules for 'li', 'dd', 'dt' start tags in\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n    if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n      ancestorInfo.listItemTagAutoclosing = null;\n      ancestorInfo.dlItemTagAutoclosing = null;\n    }\n\n    ancestorInfo.current = info;\n\n    if (tag === 'form') {\n      ancestorInfo.formTag = info;\n    }\n\n    if (tag === 'a') {\n      ancestorInfo.aTagInScope = info;\n    }\n\n    if (tag === 'button') {\n      ancestorInfo.buttonTagInScope = info;\n    }\n\n    if (tag === 'nobr') {\n      ancestorInfo.nobrTagInScope = info;\n    }\n\n    if (tag === 'p') {\n      ancestorInfo.pTagInButtonScope = info;\n    }\n\n    if (tag === 'li') {\n      ancestorInfo.listItemTagAutoclosing = info;\n    }\n\n    if (tag === 'dd' || tag === 'dt') {\n      ancestorInfo.dlItemTagAutoclosing = info;\n    }\n\n    return ancestorInfo;\n  };\n  /**\n   * Returns whether\n   */\n\n\n  var isTagValidWithParent = function (tag, parentTag) {\n    // First, let's check if we're in an unusual parsing mode...\n    switch (parentTag) {\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n      case 'select':\n        return tag === 'option' || tag === 'optgroup' || tag === '#text';\n\n      case 'optgroup':\n        return tag === 'option' || tag === '#text';\n      // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n      // but\n\n      case 'option':\n        return tag === '#text';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n      // No special behavior since these rules fall back to \"in body\" mode for\n      // all except special table nodes which cause bad parsing behavior anyway.\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n\n      case 'tr':\n        return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n\n      case 'tbody':\n      case 'thead':\n      case 'tfoot':\n        return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n\n      case 'colgroup':\n        return tag === 'col' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n\n      case 'table':\n        return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n\n      case 'head':\n        return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n\n      case 'html':\n        return tag === 'head' || tag === 'body' || tag === 'frameset';\n\n      case 'frameset':\n        return tag === 'frame';\n\n      case '#document':\n        return tag === 'html';\n    } // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n    // where the parsing rules cause implicit opens or closes to be added.\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n    switch (tag) {\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n      case 'rp':\n      case 'rt':\n        return impliedEndTags.indexOf(parentTag) === -1;\n\n      case 'body':\n      case 'caption':\n      case 'col':\n      case 'colgroup':\n      case 'frameset':\n      case 'frame':\n      case 'head':\n      case 'html':\n      case 'tbody':\n      case 'td':\n      case 'tfoot':\n      case 'th':\n      case 'thead':\n      case 'tr':\n        // These tags are only valid with a few parents that have special child\n        // parsing rules -- if we're down here, then none of those matched and\n        // so we allow it only if we don't know what the parent is, as all other\n        // cases are invalid.\n        return parentTag == null;\n    }\n\n    return true;\n  };\n  /**\n   * Returns whether\n   */\n\n\n  var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n    switch (tag) {\n      case 'address':\n      case 'article':\n      case 'aside':\n      case 'blockquote':\n      case 'center':\n      case 'details':\n      case 'dialog':\n      case 'dir':\n      case 'div':\n      case 'dl':\n      case 'fieldset':\n      case 'figcaption':\n      case 'figure':\n      case 'footer':\n      case 'header':\n      case 'hgroup':\n      case 'main':\n      case 'menu':\n      case 'nav':\n      case 'ol':\n      case 'p':\n      case 'section':\n      case 'summary':\n      case 'ul':\n      case 'pre':\n      case 'listing':\n      case 'table':\n      case 'hr':\n      case 'xmp':\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return ancestorInfo.pTagInButtonScope;\n\n      case 'form':\n        return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n      case 'li':\n        return ancestorInfo.listItemTagAutoclosing;\n\n      case 'dd':\n      case 'dt':\n        return ancestorInfo.dlItemTagAutoclosing;\n\n      case 'button':\n        return ancestorInfo.buttonTagInScope;\n\n      case 'a':\n        // Spec says something about storing a list of markers, but it sounds\n        // equivalent to this check.\n        return ancestorInfo.aTagInScope;\n\n      case 'nobr':\n        return ancestorInfo.nobrTagInScope;\n    }\n\n    return null;\n  };\n\n  var didWarn$1 = {};\n\n  validateDOMNesting = function (childTag, childText, ancestorInfo) {\n    ancestorInfo = ancestorInfo || emptyAncestorInfo;\n    var parentInfo = ancestorInfo.current;\n    var parentTag = parentInfo && parentInfo.tag;\n\n    if (childText != null) {\n      if (childTag != null) {\n        error('validateDOMNesting: when childText is passed, childTag should be null');\n      }\n\n      childTag = '#text';\n    }\n\n    var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n    var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n    var invalidParentOrAncestor = invalidParent || invalidAncestor;\n\n    if (!invalidParentOrAncestor) {\n      return;\n    }\n\n    var ancestorTag = invalidParentOrAncestor.tag;\n    var addendum = getCurrentFiberStackInDev();\n    var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;\n\n    if (didWarn$1[warnKey]) {\n      return;\n    }\n\n    didWarn$1[warnKey] = true;\n    var tagDisplayName = childTag;\n    var whitespaceInfo = '';\n\n    if (childTag === '#text') {\n      if (/\\S/.test(childText)) {\n        tagDisplayName = 'Text nodes';\n      } else {\n        tagDisplayName = 'Whitespace text nodes';\n        whitespaceInfo = \" Make sure you don't have any extra whitespace between tags on \" + 'each line of your source code.';\n      }\n    } else {\n      tagDisplayName = '<' + childTag + '>';\n    }\n\n    if (invalidParent) {\n      var info = '';\n\n      if (ancestorTag === 'table' && childTag === 'tr') {\n        info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';\n      }\n\n      error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);\n    } else {\n      error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);\n    }\n  };\n}\n\nvar SUPPRESS_HYDRATION_WARNING$1;\n\n{\n  SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';\n}\n\nvar SUSPENSE_START_DATA = '$';\nvar SUSPENSE_END_DATA = '/$';\nvar SUSPENSE_PENDING_START_DATA = '$?';\nvar SUSPENSE_FALLBACK_START_DATA = '$!';\nvar STYLE$1 = 'style';\nvar eventsEnabled = null;\nvar selectionInformation = null;\n\nfunction shouldAutoFocusHostComponent(type, props) {\n  switch (type) {\n    case 'button':\n    case 'input':\n    case 'select':\n    case 'textarea':\n      return !!props.autoFocus;\n  }\n\n  return false;\n}\nfunction getRootHostContext(rootContainerInstance) {\n  var type;\n  var namespace;\n  var nodeType = rootContainerInstance.nodeType;\n\n  switch (nodeType) {\n    case DOCUMENT_NODE:\n    case DOCUMENT_FRAGMENT_NODE:\n      {\n        type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';\n        var root = rootContainerInstance.documentElement;\n        namespace = root ? root.namespaceURI : getChildNamespace(null, '');\n        break;\n      }\n\n    default:\n      {\n        var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;\n        var ownNamespace = container.namespaceURI || null;\n        type = container.tagName;\n        namespace = getChildNamespace(ownNamespace, type);\n        break;\n      }\n  }\n\n  {\n    var validatedTag = type.toLowerCase();\n    var ancestorInfo = updatedAncestorInfo(null, validatedTag);\n    return {\n      namespace: namespace,\n      ancestorInfo: ancestorInfo\n    };\n  }\n}\nfunction getChildHostContext(parentHostContext, type, rootContainerInstance) {\n  {\n    var parentHostContextDev = parentHostContext;\n    var namespace = getChildNamespace(parentHostContextDev.namespace, type);\n    var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);\n    return {\n      namespace: namespace,\n      ancestorInfo: ancestorInfo\n    };\n  }\n}\nfunction getPublicInstance(instance) {\n  return instance;\n}\nfunction prepareForCommit(containerInfo) {\n  eventsEnabled = isEnabled();\n  selectionInformation = getSelectionInformation();\n  setEnabled(false);\n}\nfunction resetAfterCommit(containerInfo) {\n  restoreSelection(selectionInformation);\n  setEnabled(eventsEnabled);\n  eventsEnabled = null;\n\n  selectionInformation = null;\n}\nfunction createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n  var parentNamespace;\n\n  {\n    // TODO: take namespace into account when validating.\n    var hostContextDev = hostContext;\n    validateDOMNesting(type, null, hostContextDev.ancestorInfo);\n\n    if (typeof props.children === 'string' || typeof props.children === 'number') {\n      var string = '' + props.children;\n      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n      validateDOMNesting(null, string, ownAncestorInfo);\n    }\n\n    parentNamespace = hostContextDev.namespace;\n  }\n\n  var domElement = createElement(type, props, rootContainerInstance, parentNamespace);\n  precacheFiberNode(internalInstanceHandle, domElement);\n  updateFiberProps(domElement, props);\n  return domElement;\n}\nfunction appendInitialChild(parentInstance, child) {\n  parentInstance.appendChild(child);\n}\nfunction finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {\n  setInitialProperties(domElement, type, props, rootContainerInstance);\n  return shouldAutoFocusHostComponent(type, props);\n}\nfunction prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {\n  {\n    var hostContextDev = hostContext;\n\n    if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {\n      var string = '' + newProps.children;\n      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n      validateDOMNesting(null, string, ownAncestorInfo);\n    }\n  }\n\n  return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);\n}\nfunction shouldSetTextContent(type, props) {\n  return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;\n}\nfunction shouldDeprioritizeSubtree(type, props) {\n  return !!props.hidden;\n}\nfunction createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {\n  {\n    var hostContextDev = hostContext;\n    validateDOMNesting(null, text, hostContextDev.ancestorInfo);\n  }\n\n  var textNode = createTextNode(text, rootContainerInstance);\n  precacheFiberNode(internalInstanceHandle, textNode);\n  return textNode;\n}\n// if a component just imports ReactDOM (e.g. for findDOMNode).\n// Some environments might not have setTimeout or clearTimeout.\n\nvar scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;\nvar cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;\nvar noTimeout = -1; // -------------------\nfunction commitMount(domElement, type, newProps, internalInstanceHandle) {\n  // Despite the naming that might imply otherwise, this method only\n  // fires if there is an `Update` effect scheduled during mounting.\n  // This happens if `finalizeInitialChildren` returns `true` (which it\n  // does to implement the `autoFocus` attribute on the client). But\n  // there are also other cases when this might happen (such as patching\n  // up text content during hydration mismatch). So we'll check this again.\n  if (shouldAutoFocusHostComponent(type, newProps)) {\n    domElement.focus();\n  }\n}\nfunction commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {\n  // Update the props handle so that we know which props are the ones with\n  // with current event handlers.\n  updateFiberProps(domElement, newProps); // Apply the diff to the DOM node.\n\n  updateProperties(domElement, updatePayload, type, oldProps, newProps);\n}\nfunction resetTextContent(domElement) {\n  setTextContent(domElement, '');\n}\nfunction commitTextUpdate(textInstance, oldText, newText) {\n  textInstance.nodeValue = newText;\n}\nfunction appendChild(parentInstance, child) {\n  parentInstance.appendChild(child);\n}\nfunction appendChildToContainer(container, child) {\n  var parentNode;\n\n  if (container.nodeType === COMMENT_NODE) {\n    parentNode = container.parentNode;\n    parentNode.insertBefore(child, container);\n  } else {\n    parentNode = container;\n    parentNode.appendChild(child);\n  } // This container might be used for a portal.\n  // If something inside a portal is clicked, that click should bubble\n  // through the React tree. However, on Mobile Safari the click would\n  // never bubble through the *DOM* tree unless an ancestor with onclick\n  // event exists. So we wouldn't see it and dispatch it.\n  // This is why we ensure that non React root containers have inline onclick\n  // defined.\n  // https://github.com/facebook/react/issues/11918\n\n\n  var reactRootContainer = container._reactRootContainer;\n\n  if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {\n    // TODO: This cast may not be sound for SVG, MathML or custom elements.\n    trapClickOnNonInteractiveElement(parentNode);\n  }\n}\nfunction insertBefore(parentInstance, child, beforeChild) {\n  parentInstance.insertBefore(child, beforeChild);\n}\nfunction insertInContainerBefore(container, child, beforeChild) {\n  if (container.nodeType === COMMENT_NODE) {\n    container.parentNode.insertBefore(child, beforeChild);\n  } else {\n    container.insertBefore(child, beforeChild);\n  }\n}\nfunction removeChild(parentInstance, child) {\n  parentInstance.removeChild(child);\n}\nfunction removeChildFromContainer(container, child) {\n  if (container.nodeType === COMMENT_NODE) {\n    container.parentNode.removeChild(child);\n  } else {\n    container.removeChild(child);\n  }\n}\n\nfunction hideInstance(instance) {\n  // pass host context to this method?\n\n\n  instance = instance;\n  var style = instance.style;\n\n  if (typeof style.setProperty === 'function') {\n    style.setProperty('display', 'none', 'important');\n  } else {\n    style.display = 'none';\n  }\n}\nfunction hideTextInstance(textInstance) {\n  textInstance.nodeValue = '';\n}\nfunction unhideInstance(instance, props) {\n  instance = instance;\n  var styleProp = props[STYLE$1];\n  var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;\n  instance.style.display = dangerousStyleValue('display', display);\n}\nfunction unhideTextInstance(textInstance, text) {\n  textInstance.nodeValue = text;\n} // -------------------\nfunction canHydrateInstance(instance, type, props) {\n  if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {\n    return null;\n  } // This has now been refined to an element node.\n\n\n  return instance;\n}\nfunction canHydrateTextInstance(instance, text) {\n  if (text === '' || instance.nodeType !== TEXT_NODE) {\n    // Empty strings are not parsed by HTML so there won't be a correct match here.\n    return null;\n  } // This has now been refined to a text node.\n\n\n  return instance;\n}\nfunction isSuspenseInstancePending(instance) {\n  return instance.data === SUSPENSE_PENDING_START_DATA;\n}\nfunction isSuspenseInstanceFallback(instance) {\n  return instance.data === SUSPENSE_FALLBACK_START_DATA;\n}\n\nfunction getNextHydratable(node) {\n  // Skip non-hydratable nodes.\n  for (; node != null; node = node.nextSibling) {\n    var nodeType = node.nodeType;\n\n    if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {\n      break;\n    }\n  }\n\n  return node;\n}\n\nfunction getNextHydratableSibling(instance) {\n  return getNextHydratable(instance.nextSibling);\n}\nfunction getFirstHydratableChild(parentInstance) {\n  return getNextHydratable(parentInstance.firstChild);\n}\nfunction hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n  precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events\n  // get attached.\n\n  updateFiberProps(instance, props);\n  var parentNamespace;\n\n  {\n    var hostContextDev = hostContext;\n    parentNamespace = hostContextDev.namespace;\n  }\n\n  return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);\n}\nfunction hydrateTextInstance(textInstance, text, internalInstanceHandle) {\n  precacheFiberNode(internalInstanceHandle, textInstance);\n  return diffHydratedText(textInstance, text);\n}\nfunction getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {\n  var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.\n  // There might be nested nodes so we need to keep track of how\n  // deep we are and only break out when we're back on top.\n\n  var depth = 0;\n\n  while (node) {\n    if (node.nodeType === COMMENT_NODE) {\n      var data = node.data;\n\n      if (data === SUSPENSE_END_DATA) {\n        if (depth === 0) {\n          return getNextHydratableSibling(node);\n        } else {\n          depth--;\n        }\n      } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n        depth++;\n      }\n    }\n\n    node = node.nextSibling;\n  } // TODO: Warn, we didn't find the end comment boundary.\n\n\n  return null;\n} // Returns the SuspenseInstance if this node is a direct child of a\n// SuspenseInstance. I.e. if its previous sibling is a Comment with\n// SUSPENSE_x_START_DATA. Otherwise, null.\n\nfunction getParentSuspenseInstance(targetInstance) {\n  var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.\n  // There might be nested nodes so we need to keep track of how\n  // deep we are and only break out when we're back on top.\n\n  var depth = 0;\n\n  while (node) {\n    if (node.nodeType === COMMENT_NODE) {\n      var data = node.data;\n\n      if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n        if (depth === 0) {\n          return node;\n        } else {\n          depth--;\n        }\n      } else if (data === SUSPENSE_END_DATA) {\n        depth++;\n      }\n    }\n\n    node = node.previousSibling;\n  }\n\n  return null;\n}\nfunction commitHydratedContainer(container) {\n  // Retry if any event replaying was blocked on this.\n  retryIfBlockedOn(container);\n}\nfunction commitHydratedSuspenseInstance(suspenseInstance) {\n  // Retry if any event replaying was blocked on this.\n  retryIfBlockedOn(suspenseInstance);\n}\nfunction didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {\n  {\n    warnForUnmatchedText(textInstance, text);\n  }\n}\nfunction didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForUnmatchedText(textInstance, text);\n  }\n}\nfunction didNotHydrateContainerInstance(parentContainer, instance) {\n  {\n    if (instance.nodeType === ELEMENT_NODE) {\n      warnForDeletedHydratableElement(parentContainer, instance);\n    } else if (instance.nodeType === COMMENT_NODE) ; else {\n      warnForDeletedHydratableText(parentContainer, instance);\n    }\n  }\n}\nfunction didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    if (instance.nodeType === ELEMENT_NODE) {\n      warnForDeletedHydratableElement(parentInstance, instance);\n    } else if (instance.nodeType === COMMENT_NODE) ; else {\n      warnForDeletedHydratableText(parentInstance, instance);\n    }\n  }\n}\nfunction didNotFindHydratableContainerInstance(parentContainer, type, props) {\n  {\n    warnForInsertedHydratedElement(parentContainer, type);\n  }\n}\nfunction didNotFindHydratableContainerTextInstance(parentContainer, text) {\n  {\n    warnForInsertedHydratedText(parentContainer, text);\n  }\n}\nfunction didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForInsertedHydratedElement(parentInstance, type);\n  }\n}\nfunction didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForInsertedHydratedText(parentInstance, text);\n  }\n}\nfunction didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ;\n}\n\nvar randomKey = Math.random().toString(36).slice(2);\nvar internalInstanceKey = '__reactInternalInstance$' + randomKey;\nvar internalEventHandlersKey = '__reactEventHandlers$' + randomKey;\nvar internalContainerInstanceKey = '__reactContainere$' + randomKey;\nfunction precacheFiberNode(hostInst, node) {\n  node[internalInstanceKey] = hostInst;\n}\nfunction markContainerAsRoot(hostRoot, node) {\n  node[internalContainerInstanceKey] = hostRoot;\n}\nfunction unmarkContainerAsRoot(node) {\n  node[internalContainerInstanceKey] = null;\n}\nfunction isContainerMarkedAsRoot(node) {\n  return !!node[internalContainerInstanceKey];\n} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.\n// If the target node is part of a hydrated or not yet rendered subtree, then\n// this may also return a SuspenseComponent or HostRoot to indicate that.\n// Conceptually the HostRoot fiber is a child of the Container node. So if you\n// pass the Container node as the targetNode, you will not actually get the\n// HostRoot back. To get to the HostRoot, you need to pass a child of it.\n// The same thing applies to Suspense boundaries.\n\nfunction getClosestInstanceFromNode(targetNode) {\n  var targetInst = targetNode[internalInstanceKey];\n\n  if (targetInst) {\n    // Don't return HostRoot or SuspenseComponent here.\n    return targetInst;\n  } // If the direct event target isn't a React owned DOM node, we need to look\n  // to see if one of its parents is a React owned DOM node.\n\n\n  var parentNode = targetNode.parentNode;\n\n  while (parentNode) {\n    // We'll check if this is a container root that could include\n    // React nodes in the future. We need to check this first because\n    // if we're a child of a dehydrated container, we need to first\n    // find that inner container before moving on to finding the parent\n    // instance. Note that we don't check this field on  the targetNode\n    // itself because the fibers are conceptually between the container\n    // node and the first child. It isn't surrounding the container node.\n    // If it's not a container, we check if it's an instance.\n    targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];\n\n    if (targetInst) {\n      // Since this wasn't the direct target of the event, we might have\n      // stepped past dehydrated DOM nodes to get here. However they could\n      // also have been non-React nodes. We need to answer which one.\n      // If we the instance doesn't have any children, then there can't be\n      // a nested suspense boundary within it. So we can use this as a fast\n      // bailout. Most of the time, when people add non-React children to\n      // the tree, it is using a ref to a child-less DOM node.\n      // Normally we'd only need to check one of the fibers because if it\n      // has ever gone from having children to deleting them or vice versa\n      // it would have deleted the dehydrated boundary nested inside already.\n      // However, since the HostRoot starts out with an alternate it might\n      // have one on the alternate so we need to check in case this was a\n      // root.\n      var alternate = targetInst.alternate;\n\n      if (targetInst.child !== null || alternate !== null && alternate.child !== null) {\n        // Next we need to figure out if the node that skipped past is\n        // nested within a dehydrated boundary and if so, which one.\n        var suspenseInstance = getParentSuspenseInstance(targetNode);\n\n        while (suspenseInstance !== null) {\n          // We found a suspense instance. That means that we haven't\n          // hydrated it yet. Even though we leave the comments in the\n          // DOM after hydrating, and there are boundaries in the DOM\n          // that could already be hydrated, we wouldn't have found them\n          // through this pass since if the target is hydrated it would\n          // have had an internalInstanceKey on it.\n          // Let's get the fiber associated with the SuspenseComponent\n          // as the deepest instance.\n          var targetSuspenseInst = suspenseInstance[internalInstanceKey];\n\n          if (targetSuspenseInst) {\n            return targetSuspenseInst;\n          } // If we don't find a Fiber on the comment, it might be because\n          // we haven't gotten to hydrate it yet. There might still be a\n          // parent boundary that hasn't above this one so we need to find\n          // the outer most that is known.\n\n\n          suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent\n          // host component also hasn't hydrated yet. We can return it\n          // below since it will bail out on the isMounted check later.\n        }\n      }\n\n      return targetInst;\n    }\n\n    targetNode = parentNode;\n    parentNode = targetNode.parentNode;\n  }\n\n  return null;\n}\n/**\n * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent\n * instance, or null if the node was not rendered by this React.\n */\n\nfunction getInstanceFromNode$1(node) {\n  var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];\n\n  if (inst) {\n    if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {\n      return inst;\n    } else {\n      return null;\n    }\n  }\n\n  return null;\n}\n/**\n * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding\n * DOM node.\n */\n\nfunction getNodeFromInstance$1(inst) {\n  if (inst.tag === HostComponent || inst.tag === HostText) {\n    // In Fiber this, is just the state node right now. We assume it will be\n    // a host component or host text.\n    return inst.stateNode;\n  } // Without this first invariant, passing a non-DOM-component triggers the next\n  // invariant for a missing parent, which is super confusing.\n\n\n  {\n    {\n      throw Error( \"getNodeFromInstance: Invalid argument.\" );\n    }\n  }\n}\nfunction getFiberCurrentPropsFromNode$1(node) {\n  return node[internalEventHandlersKey] || null;\n}\nfunction updateFiberProps(node, props) {\n  node[internalEventHandlersKey] = props;\n}\n\nfunction getParent(inst) {\n  do {\n    inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.\n    // That is depending on if we want nested subtrees (layers) to bubble\n    // events to their parent. We could also go through parentNode on the\n    // host node but that wouldn't work for React Native and doesn't let us\n    // do the portal feature.\n  } while (inst && inst.tag !== HostComponent);\n\n  if (inst) {\n    return inst;\n  }\n\n  return null;\n}\n/**\n * Return the lowest common ancestor of A and B, or null if they are in\n * different trees.\n */\n\n\nfunction getLowestCommonAncestor(instA, instB) {\n  var depthA = 0;\n\n  for (var tempA = instA; tempA; tempA = getParent(tempA)) {\n    depthA++;\n  }\n\n  var depthB = 0;\n\n  for (var tempB = instB; tempB; tempB = getParent(tempB)) {\n    depthB++;\n  } // If A is deeper, crawl up.\n\n\n  while (depthA - depthB > 0) {\n    instA = getParent(instA);\n    depthA--;\n  } // If B is deeper, crawl up.\n\n\n  while (depthB - depthA > 0) {\n    instB = getParent(instB);\n    depthB--;\n  } // Walk in lockstep until we find a match.\n\n\n  var depth = depthA;\n\n  while (depth--) {\n    if (instA === instB || instA === instB.alternate) {\n      return instA;\n    }\n\n    instA = getParent(instA);\n    instB = getParent(instB);\n  }\n\n  return null;\n}\n/**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n */\n\nfunction traverseTwoPhase(inst, fn, arg) {\n  var path = [];\n\n  while (inst) {\n    path.push(inst);\n    inst = getParent(inst);\n  }\n\n  var i;\n\n  for (i = path.length; i-- > 0;) {\n    fn(path[i], 'captured', arg);\n  }\n\n  for (i = 0; i < path.length; i++) {\n    fn(path[i], 'bubbled', arg);\n  }\n}\n/**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * Does not invoke the callback on the nearest common ancestor because nothing\n * \"entered\" or \"left\" that element.\n */\n\nfunction traverseEnterLeave(from, to, fn, argFrom, argTo) {\n  var common = from && to ? getLowestCommonAncestor(from, to) : null;\n  var pathFrom = [];\n\n  while (true) {\n    if (!from) {\n      break;\n    }\n\n    if (from === common) {\n      break;\n    }\n\n    var alternate = from.alternate;\n\n    if (alternate !== null && alternate === common) {\n      break;\n    }\n\n    pathFrom.push(from);\n    from = getParent(from);\n  }\n\n  var pathTo = [];\n\n  while (true) {\n    if (!to) {\n      break;\n    }\n\n    if (to === common) {\n      break;\n    }\n\n    var _alternate = to.alternate;\n\n    if (_alternate !== null && _alternate === common) {\n      break;\n    }\n\n    pathTo.push(to);\n    to = getParent(to);\n  }\n\n  for (var i = 0; i < pathFrom.length; i++) {\n    fn(pathFrom[i], 'bubbled', argFrom);\n  }\n\n  for (var _i = pathTo.length; _i-- > 0;) {\n    fn(pathTo[_i], 'captured', argTo);\n  }\n}\n\nfunction isInteractive(tag) {\n  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n}\n\nfunction shouldPreventMouseEvent(name, type, props) {\n  switch (name) {\n    case 'onClick':\n    case 'onClickCapture':\n    case 'onDoubleClick':\n    case 'onDoubleClickCapture':\n    case 'onMouseDown':\n    case 'onMouseDownCapture':\n    case 'onMouseMove':\n    case 'onMouseMoveCapture':\n    case 'onMouseUp':\n    case 'onMouseUpCapture':\n    case 'onMouseEnter':\n      return !!(props.disabled && isInteractive(type));\n\n    default:\n      return false;\n  }\n}\n/**\n * @param {object} inst The instance, which is the source of events.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @return {?function} The stored callback.\n */\n\n\nfunction getListener(inst, registrationName) {\n  var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not\n  // live here; needs to be moved to a better place soon\n\n  var stateNode = inst.stateNode;\n\n  if (!stateNode) {\n    // Work in progress (ex: onload events in incremental mode).\n    return null;\n  }\n\n  var props = getFiberCurrentPropsFromNode(stateNode);\n\n  if (!props) {\n    // Work in progress.\n    return null;\n  }\n\n  listener = props[registrationName];\n\n  if (shouldPreventMouseEvent(registrationName, inst.type, props)) {\n    return null;\n  }\n\n  if (!(!listener || typeof listener === 'function')) {\n    {\n      throw Error( \"Expected `\" + registrationName + \"` listener to be a function, instead got a value of `\" + typeof listener + \"` type.\" );\n    }\n  }\n\n  return listener;\n}\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(inst, event, propagationPhase) {\n  var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n  return getListener(inst, registrationName);\n}\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing even a\n * single one.\n */\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\n\n\nfunction accumulateDirectionalDispatches(inst, phase, event) {\n  {\n    if (!inst) {\n      error('Dispatching inst must not be null');\n    }\n  }\n\n  var listener = listenerAtPhase(inst, event, phase);\n\n  if (listener) {\n    event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n  }\n}\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory.  We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\n\n\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n  if (event && event.dispatchConfig.phasedRegistrationNames) {\n    traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n  }\n}\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\n\n\nfunction accumulateDispatches(inst, ignoredDirection, event) {\n  if (inst && event && event.dispatchConfig.registrationName) {\n    var registrationName = event.dispatchConfig.registrationName;\n    var listener = getListener(inst, registrationName);\n\n    if (listener) {\n      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n    }\n  }\n}\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\n\n\nfunction accumulateDirectDispatchesSingle(event) {\n  if (event && event.dispatchConfig.registrationName) {\n    accumulateDispatches(event._targetInst, null, event);\n  }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\nfunction accumulateEnterLeaveDispatches(leave, enter, from, to) {\n  traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n}\nfunction accumulateDirectDispatches(events) {\n  forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n/**\n * These variables store information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n *\n */\nvar root = null;\nvar startText = null;\nvar fallbackText = null;\nfunction initialize(nativeEventTarget) {\n  root = nativeEventTarget;\n  startText = getText();\n  return true;\n}\nfunction reset() {\n  root = null;\n  startText = null;\n  fallbackText = null;\n}\nfunction getData() {\n  if (fallbackText) {\n    return fallbackText;\n  }\n\n  var start;\n  var startValue = startText;\n  var startLength = startValue.length;\n  var end;\n  var endValue = getText();\n  var endLength = endValue.length;\n\n  for (start = 0; start < startLength; start++) {\n    if (startValue[start] !== endValue[start]) {\n      break;\n    }\n  }\n\n  var minEnd = startLength - start;\n\n  for (end = 1; end <= minEnd; end++) {\n    if (startValue[startLength - end] !== endValue[endLength - end]) {\n      break;\n    }\n  }\n\n  var sliceTail = end > 1 ? 1 - end : undefined;\n  fallbackText = endValue.slice(start, sliceTail);\n  return fallbackText;\n}\nfunction getText() {\n  if ('value' in root) {\n    return root.value;\n  }\n\n  return root.textContent;\n}\n\nvar EVENT_POOL_SIZE = 10;\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar EventInterface = {\n  type: null,\n  target: null,\n  // currentTarget is set when dispatching; no use in copying it here\n  currentTarget: function () {\n    return null;\n  },\n  eventPhase: null,\n  bubbles: null,\n  cancelable: null,\n  timeStamp: function (event) {\n    return event.timeStamp || Date.now();\n  },\n  defaultPrevented: null,\n  isTrusted: null\n};\n\nfunction functionThatReturnsTrue() {\n  return true;\n}\n\nfunction functionThatReturnsFalse() {\n  return false;\n}\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {*} targetInst Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @param {DOMEventTarget} nativeEventTarget Target node.\n */\n\n\nfunction SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n  {\n    // these have a getter/setter for warnings\n    delete this.nativeEvent;\n    delete this.preventDefault;\n    delete this.stopPropagation;\n    delete this.isDefaultPrevented;\n    delete this.isPropagationStopped;\n  }\n\n  this.dispatchConfig = dispatchConfig;\n  this._targetInst = targetInst;\n  this.nativeEvent = nativeEvent;\n  var Interface = this.constructor.Interface;\n\n  for (var propName in Interface) {\n    if (!Interface.hasOwnProperty(propName)) {\n      continue;\n    }\n\n    {\n      delete this[propName]; // this has a getter/setter for warnings\n    }\n\n    var normalize = Interface[propName];\n\n    if (normalize) {\n      this[propName] = normalize(nativeEvent);\n    } else {\n      if (propName === 'target') {\n        this.target = nativeEventTarget;\n      } else {\n        this[propName] = nativeEvent[propName];\n      }\n    }\n  }\n\n  var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n\n  if (defaultPrevented) {\n    this.isDefaultPrevented = functionThatReturnsTrue;\n  } else {\n    this.isDefaultPrevented = functionThatReturnsFalse;\n  }\n\n  this.isPropagationStopped = functionThatReturnsFalse;\n  return this;\n}\n\n_assign(SyntheticEvent.prototype, {\n  preventDefault: function () {\n    this.defaultPrevented = true;\n    var event = this.nativeEvent;\n\n    if (!event) {\n      return;\n    }\n\n    if (event.preventDefault) {\n      event.preventDefault();\n    } else if (typeof event.returnValue !== 'unknown') {\n      event.returnValue = false;\n    }\n\n    this.isDefaultPrevented = functionThatReturnsTrue;\n  },\n  stopPropagation: function () {\n    var event = this.nativeEvent;\n\n    if (!event) {\n      return;\n    }\n\n    if (event.stopPropagation) {\n      event.stopPropagation();\n    } else if (typeof event.cancelBubble !== 'unknown') {\n      // The ChangeEventPlugin registers a \"propertychange\" event for\n      // IE. This event does not support bubbling or cancelling, and\n      // any references to cancelBubble throw \"Member not found\".  A\n      // typeof check of \"unknown\" circumvents this issue (and is also\n      // IE specific).\n      event.cancelBubble = true;\n    }\n\n    this.isPropagationStopped = functionThatReturnsTrue;\n  },\n\n  /**\n   * We release all dispatched `SyntheticEvent`s after each event loop, adding\n   * them back into the pool. This allows a way to hold onto a reference that\n   * won't be added back into the pool.\n   */\n  persist: function () {\n    this.isPersistent = functionThatReturnsTrue;\n  },\n\n  /**\n   * Checks if this event should be released back into the pool.\n   *\n   * @return {boolean} True if this should not be released, false otherwise.\n   */\n  isPersistent: functionThatReturnsFalse,\n\n  /**\n   * `PooledClass` looks for `destructor` on each instance it releases.\n   */\n  destructor: function () {\n    var Interface = this.constructor.Interface;\n\n    for (var propName in Interface) {\n      {\n        Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n      }\n    }\n\n    this.dispatchConfig = null;\n    this._targetInst = null;\n    this.nativeEvent = null;\n    this.isDefaultPrevented = functionThatReturnsFalse;\n    this.isPropagationStopped = functionThatReturnsFalse;\n    this._dispatchListeners = null;\n    this._dispatchInstances = null;\n\n    {\n      Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));\n      Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));\n      Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));\n      Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));\n      Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));\n    }\n  }\n});\n\nSyntheticEvent.Interface = EventInterface;\n/**\n * Helper to reduce boilerplate when creating subclasses.\n */\n\nSyntheticEvent.extend = function (Interface) {\n  var Super = this;\n\n  var E = function () {};\n\n  E.prototype = Super.prototype;\n  var prototype = new E();\n\n  function Class() {\n    return Super.apply(this, arguments);\n  }\n\n  _assign(prototype, Class.prototype);\n\n  Class.prototype = prototype;\n  Class.prototype.constructor = Class;\n  Class.Interface = _assign({}, Super.Interface, Interface);\n  Class.extend = Super.extend;\n  addEventPoolingTo(Class);\n  return Class;\n};\n\naddEventPoolingTo(SyntheticEvent);\n/**\n * Helper to nullify syntheticEvent instance properties when destructing\n *\n * @param {String} propName\n * @param {?object} getVal\n * @return {object} defineProperty object\n */\n\nfunction getPooledWarningPropertyDefinition(propName, getVal) {\n  var isFunction = typeof getVal === 'function';\n  return {\n    configurable: true,\n    set: set,\n    get: get\n  };\n\n  function set(val) {\n    var action = isFunction ? 'setting the method' : 'setting the property';\n    warn(action, 'This is effectively a no-op');\n    return val;\n  }\n\n  function get() {\n    var action = isFunction ? 'accessing the method' : 'accessing the property';\n    var result = isFunction ? 'This is a no-op function' : 'This is set to null';\n    warn(action, result);\n    return getVal;\n  }\n\n  function warn(action, result) {\n    {\n      error(\"This synthetic event is reused for performance reasons. If you're seeing this, \" + \"you're %s `%s` on a released/nullified synthetic event. %s. \" + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result);\n    }\n  }\n}\n\nfunction getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {\n  var EventConstructor = this;\n\n  if (EventConstructor.eventPool.length) {\n    var instance = EventConstructor.eventPool.pop();\n    EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);\n    return instance;\n  }\n\n  return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);\n}\n\nfunction releasePooledEvent(event) {\n  var EventConstructor = this;\n\n  if (!(event instanceof EventConstructor)) {\n    {\n      throw Error( \"Trying to release an event instance into a pool of a different type.\" );\n    }\n  }\n\n  event.destructor();\n\n  if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {\n    EventConstructor.eventPool.push(event);\n  }\n}\n\nfunction addEventPoolingTo(EventConstructor) {\n  EventConstructor.eventPool = [];\n  EventConstructor.getPooled = getPooledEvent;\n  EventConstructor.release = releasePooledEvent;\n}\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\n\nvar SyntheticCompositionEvent = SyntheticEvent.extend({\n  data: null\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n *      /#events-inputevents\n */\n\nvar SyntheticInputEvent = SyntheticEvent.extend({\n  data: null\n});\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\n\nvar START_KEYCODE = 229;\nvar canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;\nvar documentMode = null;\n\nif (canUseDOM && 'documentMode' in document) {\n  documentMode = document.documentMode;\n} // Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\n\n\nvar canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\n\nvar useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names.\n\nvar eventTypes = {\n  beforeInput: {\n    phasedRegistrationNames: {\n      bubbled: 'onBeforeInput',\n      captured: 'onBeforeInputCapture'\n    },\n    dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]\n  },\n  compositionEnd: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionEnd',\n      captured: 'onCompositionEndCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  },\n  compositionStart: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionStart',\n      captured: 'onCompositionStartCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  },\n  compositionUpdate: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionUpdate',\n      captured: 'onCompositionUpdateCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  }\n}; // Track whether we've ever handled a keypress on the space key.\n\nvar hasSpaceKeypress = false;\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\n\nfunction isKeypressCommand(nativeEvent) {\n  return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n  !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\n\n\nfunction getCompositionEventType(topLevelType) {\n  switch (topLevelType) {\n    case TOP_COMPOSITION_START:\n      return eventTypes.compositionStart;\n\n    case TOP_COMPOSITION_END:\n      return eventTypes.compositionEnd;\n\n    case TOP_COMPOSITION_UPDATE:\n      return eventTypes.compositionUpdate;\n  }\n}\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n  return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;\n}\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_KEY_UP:\n      // Command keys insert or clear IME input.\n      return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n\n    case TOP_KEY_DOWN:\n      // Expect IME keyCode on each keydown. If we get any other\n      // code we must have exited earlier.\n      return nativeEvent.keyCode !== START_KEYCODE;\n\n    case TOP_KEY_PRESS:\n    case TOP_MOUSE_DOWN:\n    case TOP_BLUR:\n      // Events are not possible without cancelling IME.\n      return true;\n\n    default:\n      return false;\n  }\n}\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\n\n\nfunction getDataFromCustomEvent(nativeEvent) {\n  var detail = nativeEvent.detail;\n\n  if (typeof detail === 'object' && 'data' in detail) {\n    return detail.data;\n  }\n\n  return null;\n}\n/**\n * Check if a composition event was triggered by Korean IME.\n * Our fallback mode does not work well with IE's Korean IME,\n * so just use native composition events when Korean IME is used.\n * Although CompositionEvent.locale property is deprecated,\n * it is available in IE, where our fallback mode is enabled.\n *\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isUsingKoreanIME(nativeEvent) {\n  return nativeEvent.locale === 'ko';\n} // Track the current IME composition status, if any.\n\n\nvar isComposing = false;\n/**\n * @return {?object} A SyntheticCompositionEvent.\n */\n\nfunction extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var eventType;\n  var fallbackData;\n\n  if (canUseCompositionEvent) {\n    eventType = getCompositionEventType(topLevelType);\n  } else if (!isComposing) {\n    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n      eventType = eventTypes.compositionStart;\n    }\n  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n    eventType = eventTypes.compositionEnd;\n  }\n\n  if (!eventType) {\n    return null;\n  }\n\n  if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {\n    // The current composition is stored statically and must not be\n    // overwritten while composition continues.\n    if (!isComposing && eventType === eventTypes.compositionStart) {\n      isComposing = initialize(nativeEventTarget);\n    } else if (eventType === eventTypes.compositionEnd) {\n      if (isComposing) {\n        fallbackData = getData();\n      }\n    }\n  }\n\n  var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n\n  if (fallbackData) {\n    // Inject data generated from fallback path into the synthetic event.\n    // This matches the property of native CompositionEventInterface.\n    event.data = fallbackData;\n  } else {\n    var customData = getDataFromCustomEvent(nativeEvent);\n\n    if (customData !== null) {\n      event.data = customData;\n    }\n  }\n\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * @param {TopLevelType} topLevelType Number from `TopLevelType`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\n\n\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_COMPOSITION_END:\n      return getDataFromCustomEvent(nativeEvent);\n\n    case TOP_KEY_PRESS:\n      /**\n       * If native `textInput` events are available, our goal is to make\n       * use of them. However, there is a special case: the spacebar key.\n       * In Webkit, preventing default on a spacebar `textInput` event\n       * cancels character insertion, but it *also* causes the browser\n       * to fall back to its default spacebar behavior of scrolling the\n       * page.\n       *\n       * Tracking at:\n       * https://code.google.com/p/chromium/issues/detail?id=355103\n       *\n       * To avoid this issue, use the keypress event as if no `textInput`\n       * event is available.\n       */\n      var which = nativeEvent.which;\n\n      if (which !== SPACEBAR_CODE) {\n        return null;\n      }\n\n      hasSpaceKeypress = true;\n      return SPACEBAR_CHAR;\n\n    case TOP_TEXT_INPUT:\n      // Record the characters to be added to the DOM.\n      var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled\n      // it at the keypress level and bail immediately. Android Chrome\n      // doesn't give us keycodes, so we need to ignore it.\n\n      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n        return null;\n      }\n\n      return chars;\n\n    default:\n      // For other native event types, do nothing.\n      return null;\n  }\n}\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {number} topLevelType Number from `TopLevelEventTypes`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\n\n\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n  // If we are currently composing (IME) and using a fallback to do so,\n  // try to extract the composed characters from the fallback object.\n  // If composition event is available, we extract a string only at\n  // compositionevent, otherwise extract it at fallback events.\n  if (isComposing) {\n    if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n      var chars = getData();\n      reset();\n      isComposing = false;\n      return chars;\n    }\n\n    return null;\n  }\n\n  switch (topLevelType) {\n    case TOP_PASTE:\n      // If a paste event occurs after a keypress, throw out the input\n      // chars. Paste events should not lead to BeforeInput events.\n      return null;\n\n    case TOP_KEY_PRESS:\n      /**\n       * As of v27, Firefox may fire keypress events even when no character\n       * will be inserted. A few possibilities:\n       *\n       * - `which` is `0`. Arrow keys, Esc key, etc.\n       *\n       * - `which` is the pressed key code, but no char is available.\n       *   Ex: 'AltGr + d` in Polish. There is no modified character for\n       *   this key combination and no character is inserted into the\n       *   document, but FF fires the keypress for char code `100` anyway.\n       *   No `input` event will occur.\n       *\n       * - `which` is the pressed key code, but a command combination is\n       *   being used. Ex: `Cmd+C`. No character is inserted, and no\n       *   `input` event will occur.\n       */\n      if (!isKeypressCommand(nativeEvent)) {\n        // IE fires the `keypress` event when a user types an emoji via\n        // Touch keyboard of Windows.  In such a case, the `char` property\n        // holds an emoji character like `\\uD83D\\uDE0A`.  Because its length\n        // is 2, the property `which` does not represent an emoji correctly.\n        // In such a case, we directly return the `char` property instead of\n        // using `which`.\n        if (nativeEvent.char && nativeEvent.char.length > 1) {\n          return nativeEvent.char;\n        } else if (nativeEvent.which) {\n          return String.fromCharCode(nativeEvent.which);\n        }\n      }\n\n      return null;\n\n    case TOP_COMPOSITION_END:\n      return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;\n\n    default:\n      return null;\n  }\n}\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @return {?object} A SyntheticInputEvent.\n */\n\n\nfunction extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var chars;\n\n  if (canUseTextInputEvent) {\n    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n  } else {\n    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n  } // If no characters are being inserted, no BeforeInput event should\n  // be fired.\n\n\n  if (!chars) {\n    return null;\n  }\n\n  var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n  event.data = chars;\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\n\n\nvar BeforeInputEventPlugin = {\n  eventTypes: eventTypes,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n    var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n\n    if (composition === null) {\n      return beforeInput;\n    }\n\n    if (beforeInput === null) {\n      return composition;\n    }\n\n    return [composition, beforeInput];\n  }\n};\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n  color: true,\n  date: true,\n  datetime: true,\n  'datetime-local': true,\n  email: true,\n  month: true,\n  number: true,\n  password: true,\n  range: true,\n  search: true,\n  tel: true,\n  text: true,\n  time: true,\n  url: true,\n  week: true\n};\n\nfunction isTextInputElement(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\n  if (nodeName === 'input') {\n    return !!supportedInputTypes[elem.type];\n  }\n\n  if (nodeName === 'textarea') {\n    return true;\n  }\n\n  return false;\n}\n\nvar eventTypes$1 = {\n  change: {\n    phasedRegistrationNames: {\n      bubbled: 'onChange',\n      captured: 'onChangeCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]\n  }\n};\n\nfunction createAndAccumulateChangeEvent(inst, nativeEvent, target) {\n  var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target);\n  event.type = 'change'; // Flag this event loop as needing state restore.\n\n  enqueueStateRestore(target);\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * For IE shims\n */\n\n\nvar activeElement = null;\nvar activeElementInst = null;\n/**\n * SECTION: handle `change` event\n */\n\nfunction shouldUseChangeEvent(elem) {\n  var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n  var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the\n  // other events and have it go through ReactBrowserEventEmitter. Since it\n  // doesn't, we manually listen for the events and so we have to enqueue and\n  // process the abstract event manually.\n  //\n  // Batching is necessary here in order to ensure that all event handlers run\n  // before the next rerender (including event handlers attached to ancestor\n  // elements instead of directly on the input). Without this, controlled\n  // components don't work properly in conjunction with event bubbling because\n  // the component is rerendered and the value reverted before all the event\n  // handlers can run. See https://github.com/facebook/react/issues/708.\n\n  batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n  runEventsInBatch(event);\n}\n\nfunction getInstIfValueChanged(targetInst) {\n  var targetNode = getNodeFromInstance$1(targetInst);\n\n  if (updateValueIfChanged(targetNode)) {\n    return targetInst;\n  }\n}\n\nfunction getTargetInstForChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_CHANGE) {\n    return targetInst;\n  }\n}\n/**\n * SECTION: handle `input` event\n */\n\n\nvar isInputEventSupported = false;\n\nif (canUseDOM) {\n  // IE9 claims to support the input event but fails to trigger it when\n  // deleting text, so we ignore its input events.\n  isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);\n}\n/**\n * (For IE <=9) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\n\n\nfunction startWatchingForValueChange(target, targetInst) {\n  activeElement = target;\n  activeElementInst = targetInst;\n  activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n/**\n * (For IE <=9) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\n\n\nfunction stopWatchingForValueChange() {\n  if (!activeElement) {\n    return;\n  }\n\n  activeElement.detachEvent('onpropertychange', handlePropertyChange);\n  activeElement = null;\n  activeElementInst = null;\n}\n/**\n * (For IE <=9) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\n\n\nfunction handlePropertyChange(nativeEvent) {\n  if (nativeEvent.propertyName !== 'value') {\n    return;\n  }\n\n  if (getInstIfValueChanged(activeElementInst)) {\n    manualDispatchChangeEvent(nativeEvent);\n  }\n}\n\nfunction handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {\n  if (topLevelType === TOP_FOCUS) {\n    // In IE9, propertychange fires for most input events but is buggy and\n    // doesn't fire when text is deleted, but conveniently, selectionchange\n    // appears to fire in all of the remaining cases so we catch those and\n    // forward the event if the value has changed\n    // In either case, we don't want to call the event handler if the value\n    // is changed from JS so we redefine a setter for `.value` that updates\n    // our activeElementValue variable, allowing us to ignore those changes\n    //\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForValueChange();\n    startWatchingForValueChange(target, targetInst);\n  } else if (topLevelType === TOP_BLUR) {\n    stopWatchingForValueChange();\n  }\n} // For IE8 and IE9.\n\n\nfunction getTargetInstForInputEventPolyfill(topLevelType, targetInst) {\n  if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {\n    // On the selectionchange event, the target is just document which isn't\n    // helpful for us so just check activeElement instead.\n    //\n    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n    // propertychange on the first input event after setting `value` from a\n    // script and fires only keydown, keypress, keyup. Catching keyup usually\n    // gets it and catching keydown lets us fire an event for the first\n    // keystroke if user does a key repeat (it'll be a little delayed: right\n    // before the second keystroke). Other input methods (e.g., paste) seem to\n    // fire selectionchange normally.\n    return getInstIfValueChanged(activeElementInst);\n  }\n}\n/**\n * SECTION: handle `click` event\n */\n\n\nfunction shouldUseClickEvent(elem) {\n  // Use the `click` event to detect changes to checkbox and radio inputs.\n  // This approach works across all browsers, whereas `change` does not fire\n  // until `blur` in IE8.\n  var nodeName = elem.nodeName;\n  return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetInstForClickEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_CLICK) {\n    return getInstIfValueChanged(targetInst);\n  }\n}\n\nfunction getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {\n    return getInstIfValueChanged(targetInst);\n  }\n}\n\nfunction handleControlledInputBlur(node) {\n  var state = node._wrapperState;\n\n  if (!state || !state.controlled || node.type !== 'number') {\n    return;\n  }\n\n  {\n    // If controlled, assign the value attribute to the current value on blur\n    setDefaultValue(node, 'number', node.value);\n  }\n}\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\n\n\nvar ChangeEventPlugin = {\n  eventTypes: eventTypes$1,\n  _isInputEventSupported: isInputEventSupported,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n    var getTargetInstFunc, handleEventFunc;\n\n    if (shouldUseChangeEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForChangeEvent;\n    } else if (isTextInputElement(targetNode)) {\n      if (isInputEventSupported) {\n        getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n      } else {\n        getTargetInstFunc = getTargetInstForInputEventPolyfill;\n        handleEventFunc = handleEventsForInputEventPolyfill;\n      }\n    } else if (shouldUseClickEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForClickEvent;\n    }\n\n    if (getTargetInstFunc) {\n      var inst = getTargetInstFunc(topLevelType, targetInst);\n\n      if (inst) {\n        var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);\n        return event;\n      }\n    }\n\n    if (handleEventFunc) {\n      handleEventFunc(topLevelType, targetNode, targetInst);\n    } // When blurring, set the value attribute for number inputs\n\n\n    if (topLevelType === TOP_BLUR) {\n      handleControlledInputBlur(targetNode);\n    }\n  }\n};\n\nvar SyntheticUIEvent = SyntheticEvent.extend({\n  view: null,\n  detail: null\n});\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\nvar modifierKeyToProp = {\n  Alt: 'altKey',\n  Control: 'ctrlKey',\n  Meta: 'metaKey',\n  Shift: 'shiftKey'\n}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support\n// getModifierState. If getModifierState is not supported, we map it to a set of\n// modifier keys exposed by the event. In this case, Lock-keys are not supported.\n\nfunction modifierStateGetter(keyArg) {\n  var syntheticEvent = this;\n  var nativeEvent = syntheticEvent.nativeEvent;\n\n  if (nativeEvent.getModifierState) {\n    return nativeEvent.getModifierState(keyArg);\n  }\n\n  var keyProp = modifierKeyToProp[keyArg];\n  return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n  return modifierStateGetter;\n}\n\nvar previousScreenX = 0;\nvar previousScreenY = 0; // Use flags to signal movementX/Y has already been set\n\nvar isMovementXSet = false;\nvar isMovementYSet = false;\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticMouseEvent = SyntheticUIEvent.extend({\n  screenX: null,\n  screenY: null,\n  clientX: null,\n  clientY: null,\n  pageX: null,\n  pageY: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  getModifierState: getEventModifierState,\n  button: null,\n  buttons: null,\n  relatedTarget: function (event) {\n    return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n  },\n  movementX: function (event) {\n    if ('movementX' in event) {\n      return event.movementX;\n    }\n\n    var screenX = previousScreenX;\n    previousScreenX = event.screenX;\n\n    if (!isMovementXSet) {\n      isMovementXSet = true;\n      return 0;\n    }\n\n    return event.type === 'mousemove' ? event.screenX - screenX : 0;\n  },\n  movementY: function (event) {\n    if ('movementY' in event) {\n      return event.movementY;\n    }\n\n    var screenY = previousScreenY;\n    previousScreenY = event.screenY;\n\n    if (!isMovementYSet) {\n      isMovementYSet = true;\n      return 0;\n    }\n\n    return event.type === 'mousemove' ? event.screenY - screenY : 0;\n  }\n});\n\n/**\n * @interface PointerEvent\n * @see http://www.w3.org/TR/pointerevents/\n */\n\nvar SyntheticPointerEvent = SyntheticMouseEvent.extend({\n  pointerId: null,\n  width: null,\n  height: null,\n  pressure: null,\n  tangentialPressure: null,\n  tiltX: null,\n  tiltY: null,\n  twist: null,\n  pointerType: null,\n  isPrimary: null\n});\n\nvar eventTypes$2 = {\n  mouseEnter: {\n    registrationName: 'onMouseEnter',\n    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n  },\n  mouseLeave: {\n    registrationName: 'onMouseLeave',\n    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n  },\n  pointerEnter: {\n    registrationName: 'onPointerEnter',\n    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n  },\n  pointerLeave: {\n    registrationName: 'onPointerLeave',\n    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n  }\n};\nvar EnterLeaveEventPlugin = {\n  eventTypes: eventTypes$2,\n\n  /**\n   * For almost every interaction we care about, there will be both a top-level\n   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n   * we do not extract duplicate events. However, moving the mouse into the\n   * browser from outside will not fire a `mouseout` event. In this case, we use\n   * the `mouseover` top-level event.\n   */\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;\n    var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;\n\n    if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n      // If this is an over event with a target, then we've already dispatched\n      // the event in the out event of the other target. If this is replayed,\n      // then it's because we couldn't dispatch against this target previously\n      // so we have to do it now instead.\n      return null;\n    }\n\n    if (!isOutEvent && !isOverEvent) {\n      // Must not be a mouse or pointer in or out - ignoring.\n      return null;\n    }\n\n    var win;\n\n    if (nativeEventTarget.window === nativeEventTarget) {\n      // `nativeEventTarget` is probably a window object.\n      win = nativeEventTarget;\n    } else {\n      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n      var doc = nativeEventTarget.ownerDocument;\n\n      if (doc) {\n        win = doc.defaultView || doc.parentWindow;\n      } else {\n        win = window;\n      }\n    }\n\n    var from;\n    var to;\n\n    if (isOutEvent) {\n      from = targetInst;\n      var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n      to = related ? getClosestInstanceFromNode(related) : null;\n\n      if (to !== null) {\n        var nearestMounted = getNearestMountedFiber(to);\n\n        if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {\n          to = null;\n        }\n      }\n    } else {\n      // Moving to a node from outside the window.\n      from = null;\n      to = targetInst;\n    }\n\n    if (from === to) {\n      // Nothing pertains to our managed components.\n      return null;\n    }\n\n    var eventInterface, leaveEventType, enterEventType, eventTypePrefix;\n\n    if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {\n      eventInterface = SyntheticMouseEvent;\n      leaveEventType = eventTypes$2.mouseLeave;\n      enterEventType = eventTypes$2.mouseEnter;\n      eventTypePrefix = 'mouse';\n    } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {\n      eventInterface = SyntheticPointerEvent;\n      leaveEventType = eventTypes$2.pointerLeave;\n      enterEventType = eventTypes$2.pointerEnter;\n      eventTypePrefix = 'pointer';\n    }\n\n    var fromNode = from == null ? win : getNodeFromInstance$1(from);\n    var toNode = to == null ? win : getNodeFromInstance$1(to);\n    var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);\n    leave.type = eventTypePrefix + 'leave';\n    leave.target = fromNode;\n    leave.relatedTarget = toNode;\n    var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);\n    enter.type = eventTypePrefix + 'enter';\n    enter.target = toNode;\n    enter.relatedTarget = fromNode;\n    accumulateEnterLeaveDispatches(leave, enter, from, to); // If we are not processing the first ancestor, then we\n    // should not process the same nativeEvent again, as we\n    // will have already processed it in the first ancestor.\n\n    if ((eventSystemFlags & IS_FIRST_ANCESTOR) === 0) {\n      return [leave];\n    }\n\n    return [leave, enter];\n  }\n};\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n  ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\nvar hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\n\nfunction shallowEqual(objA, objB) {\n  if (objectIs(objA, objB)) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  } // Test for A's keys different from B.\n\n\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvar skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;\nvar eventTypes$3 = {\n  select: {\n    phasedRegistrationNames: {\n      bubbled: 'onSelect',\n      captured: 'onSelectCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]\n  }\n};\nvar activeElement$1 = null;\nvar activeElementInst$1 = null;\nvar lastSelection = null;\nvar mouseDown = false;\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\n\nfunction getSelection$1(node) {\n  if ('selectionStart' in node && hasSelectionCapabilities(node)) {\n    return {\n      start: node.selectionStart,\n      end: node.selectionEnd\n    };\n  } else {\n    var win = node.ownerDocument && node.ownerDocument.defaultView || window;\n    var selection = win.getSelection();\n    return {\n      anchorNode: selection.anchorNode,\n      anchorOffset: selection.anchorOffset,\n      focusNode: selection.focusNode,\n      focusOffset: selection.focusOffset\n    };\n  }\n}\n/**\n * Get document associated with the event target.\n *\n * @param {object} nativeEventTarget\n * @return {Document}\n */\n\n\nfunction getEventTargetDocument(eventTarget) {\n  return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;\n}\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @param {object} nativeEventTarget\n * @return {?SyntheticEvent}\n */\n\n\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n  // Ensure we have the right element, and that the user is not dragging a\n  // selection (this matches native `select` event behavior). In HTML5, select\n  // fires only on input and textarea thus if there's no focused element we\n  // won't dispatch.\n  var doc = getEventTargetDocument(nativeEventTarget);\n\n  if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {\n    return null;\n  } // Only fire when selection has actually changed.\n\n\n  var currentSelection = getSelection$1(activeElement$1);\n\n  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n    lastSelection = currentSelection;\n    var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);\n    syntheticEvent.type = 'select';\n    syntheticEvent.target = activeElement$1;\n    accumulateTwoPhaseDispatches(syntheticEvent);\n    return syntheticEvent;\n  }\n\n  return null;\n}\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\n\n\nvar SelectEventPlugin = {\n  eventTypes: eventTypes$3,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, container) {\n    var containerOrDoc = container || getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do\n    // not extract events. See #3639.\n\n    if (!containerOrDoc || !isListeningToAllDependencies('onSelect', containerOrDoc)) {\n      return null;\n    }\n\n    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n\n    switch (topLevelType) {\n      // Track the input node that has focus.\n      case TOP_FOCUS:\n        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {\n          activeElement$1 = targetNode;\n          activeElementInst$1 = targetInst;\n          lastSelection = null;\n        }\n\n        break;\n\n      case TOP_BLUR:\n        activeElement$1 = null;\n        activeElementInst$1 = null;\n        lastSelection = null;\n        break;\n      // Don't fire the event while the user is dragging. This matches the\n      // semantics of the native select event.\n\n      case TOP_MOUSE_DOWN:\n        mouseDown = true;\n        break;\n\n      case TOP_CONTEXT_MENU:\n      case TOP_MOUSE_UP:\n      case TOP_DRAG_END:\n        mouseDown = false;\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n      // Chrome and IE fire non-standard event when selection is changed (and\n      // sometimes when it hasn't). IE's event fires out of order with respect\n      // to key and input events on deletion, so we discard it.\n      //\n      // Firefox doesn't support selectionchange, so check selection status\n      // after each key entry. The selection changes after keydown and before\n      // keyup, but we check on keydown as well in the case of holding down a\n      // key, when multiple keydown events are fired but only one keyup is.\n      // This is also our approach for IE handling, for the reason above.\n\n      case TOP_SELECTION_CHANGE:\n        if (skipSelectionChangeEvent) {\n          break;\n        }\n\n      // falls through\n\n      case TOP_KEY_DOWN:\n      case TOP_KEY_UP:\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n    }\n\n    return null;\n  }\n};\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent\n */\n\nvar SyntheticAnimationEvent = SyntheticEvent.extend({\n  animationName: null,\n  elapsedTime: null,\n  pseudoElement: null\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\n\nvar SyntheticClipboardEvent = SyntheticEvent.extend({\n  clipboardData: function (event) {\n    return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n  }\n});\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticFocusEvent = SyntheticUIEvent.extend({\n  relatedTarget: null\n});\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\nfunction getEventCharCode(nativeEvent) {\n  var charCode;\n  var keyCode = nativeEvent.keyCode;\n\n  if ('charCode' in nativeEvent) {\n    charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n\n    if (charCode === 0 && keyCode === 13) {\n      charCode = 13;\n    }\n  } else {\n    // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n    charCode = keyCode;\n  } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)\n  // report Enter as charCode 10 when ctrl is pressed.\n\n\n  if (charCode === 10) {\n    charCode = 13;\n  } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n  // Must not discard the (non-)printable Enter-key.\n\n\n  if (charCode >= 32 || charCode === 13) {\n    return charCode;\n  }\n\n  return 0;\n}\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\n\nvar normalizeKey = {\n  Esc: 'Escape',\n  Spacebar: ' ',\n  Left: 'ArrowLeft',\n  Up: 'ArrowUp',\n  Right: 'ArrowRight',\n  Down: 'ArrowDown',\n  Del: 'Delete',\n  Win: 'OS',\n  Menu: 'ContextMenu',\n  Apps: 'ContextMenu',\n  Scroll: 'ScrollLock',\n  MozPrintableKey: 'Unidentified'\n};\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\n\nvar translateToKey = {\n  '8': 'Backspace',\n  '9': 'Tab',\n  '12': 'Clear',\n  '13': 'Enter',\n  '16': 'Shift',\n  '17': 'Control',\n  '18': 'Alt',\n  '19': 'Pause',\n  '20': 'CapsLock',\n  '27': 'Escape',\n  '32': ' ',\n  '33': 'PageUp',\n  '34': 'PageDown',\n  '35': 'End',\n  '36': 'Home',\n  '37': 'ArrowLeft',\n  '38': 'ArrowUp',\n  '39': 'ArrowRight',\n  '40': 'ArrowDown',\n  '45': 'Insert',\n  '46': 'Delete',\n  '112': 'F1',\n  '113': 'F2',\n  '114': 'F3',\n  '115': 'F4',\n  '116': 'F5',\n  '117': 'F6',\n  '118': 'F7',\n  '119': 'F8',\n  '120': 'F9',\n  '121': 'F10',\n  '122': 'F11',\n  '123': 'F12',\n  '144': 'NumLock',\n  '145': 'ScrollLock',\n  '224': 'Meta'\n};\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\n\nfunction getEventKey(nativeEvent) {\n  if (nativeEvent.key) {\n    // Normalize inconsistent values reported by browsers due to\n    // implementations of a working draft specification.\n    // FireFox implements `key` but returns `MozPrintableKey` for all\n    // printable characters (normalized to `Unidentified`), ignore it.\n    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n\n    if (key !== 'Unidentified') {\n      return key;\n    }\n  } // Browser does not implement `key`, polyfill as much of it as we can.\n\n\n  if (nativeEvent.type === 'keypress') {\n    var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can\n    // thus be captured by `keypress`, no other non-printable key should.\n\n    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n  }\n\n  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n    // While user keyboard layout determines the actual meaning of each\n    // `keyCode` value, almost all function keys have a universal value.\n    return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n  }\n\n  return '';\n}\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticKeyboardEvent = SyntheticUIEvent.extend({\n  key: getEventKey,\n  location: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  repeat: null,\n  locale: null,\n  getModifierState: getEventModifierState,\n  // Legacy Interface\n  charCode: function (event) {\n    // `charCode` is the result of a KeyPress event and represents the value of\n    // the actual printable character.\n    // KeyPress is deprecated, but its replacement is not yet final and not\n    // implemented in any major browser. Only KeyPress has charCode.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n\n    return 0;\n  },\n  keyCode: function (event) {\n    // `keyCode` is the result of a KeyDown/Up event and represents the value of\n    // physical keyboard key.\n    // The actual meaning of the value depends on the users' keyboard layout\n    // which cannot be detected. Assuming that it is a US keyboard layout\n    // provides a surprisingly accurate mapping for US and European users.\n    // Due to this, it is left to the user to implement at this time.\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n\n    return 0;\n  },\n  which: function (event) {\n    // `which` is an alias for either `keyCode` or `charCode` depending on the\n    // type of the event.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n\n    return 0;\n  }\n});\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticDragEvent = SyntheticMouseEvent.extend({\n  dataTransfer: null\n});\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\n\nvar SyntheticTouchEvent = SyntheticUIEvent.extend({\n  touches: null,\n  targetTouches: null,\n  changedTouches: null,\n  altKey: null,\n  metaKey: null,\n  ctrlKey: null,\n  shiftKey: null,\n  getModifierState: getEventModifierState\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent\n */\n\nvar SyntheticTransitionEvent = SyntheticEvent.extend({\n  propertyName: null,\n  elapsedTime: null,\n  pseudoElement: null\n});\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticWheelEvent = SyntheticMouseEvent.extend({\n  deltaX: function (event) {\n    return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n    'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n  },\n  deltaY: function (event) {\n    return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n    'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n    'wheelDelta' in event ? -event.wheelDelta : 0;\n  },\n  deltaZ: null,\n  // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n  // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n  deltaMode: null\n});\n\nvar knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];\nvar SimpleEventPlugin = {\n  // simpleEventPluginEventTypes gets populated from\n  // the DOMEventProperties module.\n  eventTypes: simpleEventPluginEventTypes,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var dispatchConfig = topLevelEventsToDispatchConfig.get(topLevelType);\n\n    if (!dispatchConfig) {\n      return null;\n    }\n\n    var EventConstructor;\n\n    switch (topLevelType) {\n      case TOP_KEY_PRESS:\n        // Firefox creates a keypress event for function keys too. This removes\n        // the unwanted keypress events. Enter is however both printable and\n        // non-printable. One would expect Tab to be as well (but it isn't).\n        if (getEventCharCode(nativeEvent) === 0) {\n          return null;\n        }\n\n      /* falls through */\n\n      case TOP_KEY_DOWN:\n      case TOP_KEY_UP:\n        EventConstructor = SyntheticKeyboardEvent;\n        break;\n\n      case TOP_BLUR:\n      case TOP_FOCUS:\n        EventConstructor = SyntheticFocusEvent;\n        break;\n\n      case TOP_CLICK:\n        // Firefox creates a click event on right mouse clicks. This removes the\n        // unwanted click events.\n        if (nativeEvent.button === 2) {\n          return null;\n        }\n\n      /* falls through */\n\n      case TOP_AUX_CLICK:\n      case TOP_DOUBLE_CLICK:\n      case TOP_MOUSE_DOWN:\n      case TOP_MOUSE_MOVE:\n      case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events\n\n      /* falls through */\n\n      case TOP_MOUSE_OUT:\n      case TOP_MOUSE_OVER:\n      case TOP_CONTEXT_MENU:\n        EventConstructor = SyntheticMouseEvent;\n        break;\n\n      case TOP_DRAG:\n      case TOP_DRAG_END:\n      case TOP_DRAG_ENTER:\n      case TOP_DRAG_EXIT:\n      case TOP_DRAG_LEAVE:\n      case TOP_DRAG_OVER:\n      case TOP_DRAG_START:\n      case TOP_DROP:\n        EventConstructor = SyntheticDragEvent;\n        break;\n\n      case TOP_TOUCH_CANCEL:\n      case TOP_TOUCH_END:\n      case TOP_TOUCH_MOVE:\n      case TOP_TOUCH_START:\n        EventConstructor = SyntheticTouchEvent;\n        break;\n\n      case TOP_ANIMATION_END:\n      case TOP_ANIMATION_ITERATION:\n      case TOP_ANIMATION_START:\n        EventConstructor = SyntheticAnimationEvent;\n        break;\n\n      case TOP_TRANSITION_END:\n        EventConstructor = SyntheticTransitionEvent;\n        break;\n\n      case TOP_SCROLL:\n        EventConstructor = SyntheticUIEvent;\n        break;\n\n      case TOP_WHEEL:\n        EventConstructor = SyntheticWheelEvent;\n        break;\n\n      case TOP_COPY:\n      case TOP_CUT:\n      case TOP_PASTE:\n        EventConstructor = SyntheticClipboardEvent;\n        break;\n\n      case TOP_GOT_POINTER_CAPTURE:\n      case TOP_LOST_POINTER_CAPTURE:\n      case TOP_POINTER_CANCEL:\n      case TOP_POINTER_DOWN:\n      case TOP_POINTER_MOVE:\n      case TOP_POINTER_OUT:\n      case TOP_POINTER_OVER:\n      case TOP_POINTER_UP:\n        EventConstructor = SyntheticPointerEvent;\n        break;\n\n      default:\n        {\n          if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {\n            error('SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);\n          }\n        } // HTML Events\n        // @see http://www.w3.org/TR/html5/index.html#events-0\n\n\n        EventConstructor = SyntheticEvent;\n        break;\n    }\n\n    var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n    accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n};\n\n/**\n * Specifies a deterministic ordering of `EventPlugin`s. A convenient way to\n * reason about plugins, without having to package every one of them. This\n * is better than having plugins be ordered in the same order that they\n * are injected because that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\n\nvar DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];\n/**\n * Inject modules for resolving DOM hierarchy and plugin ordering.\n */\n\ninjectEventPluginOrder(DOMEventPluginOrder);\nsetComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);\n/**\n * Some important event plugins included by default (without having to require\n * them).\n */\n\ninjectEventPluginsByName({\n  SimpleEventPlugin: SimpleEventPlugin,\n  EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n  ChangeEventPlugin: ChangeEventPlugin,\n  SelectEventPlugin: SelectEventPlugin,\n  BeforeInputEventPlugin: BeforeInputEventPlugin\n});\n\n// Prefix measurements so that it's possible to filter them.\n// Longer prefixes are hard to read in DevTools.\nvar reactEmoji = \"\\u269B\";\nvar warningEmoji = \"\\u26D4\";\nvar supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause.\n// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?\n\nvar currentFiber = null; // If we're in the middle of user code, which fiber and method is it?\n// Reusing `currentFiber` would be confusing for this because user code fiber\n// can change during commit phase too, but we don't need to unwind it (since\n// lifecycles in the commit phase don't resemble a tree).\n\nvar currentPhase = null;\nvar currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem,\n// so we will keep track of it, and include it in the report.\n// Track commits caused by cascading updates.\n\nvar isCommitting = false;\nvar hasScheduledUpdateInCurrentCommit = false;\nvar hasScheduledUpdateInCurrentPhase = false;\nvar commitCountInCurrentWorkLoop = 0;\nvar effectCountInCurrentCommit = 0;\n// to avoid stretch the commit phase with measurement overhead.\n\nvar labelsInCurrentCommit = new Set();\n\nvar formatMarkName = function (markName) {\n  return reactEmoji + \" \" + markName;\n};\n\nvar formatLabel = function (label, warning) {\n  var prefix = warning ? warningEmoji + \" \" : reactEmoji + \" \";\n  var suffix = warning ? \" Warning: \" + warning : '';\n  return \"\" + prefix + label + suffix;\n};\n\nvar beginMark = function (markName) {\n  performance.mark(formatMarkName(markName));\n};\n\nvar clearMark = function (markName) {\n  performance.clearMarks(formatMarkName(markName));\n};\n\nvar endMark = function (label, markName, warning) {\n  var formattedMarkName = formatMarkName(markName);\n  var formattedLabel = formatLabel(label, warning);\n\n  try {\n    performance.measure(formattedLabel, formattedMarkName);\n  } catch (err) {} // If previous mark was missing for some reason, this will throw.\n  // This could only happen if React crashed in an unexpected place earlier.\n  // Don't pile on with more errors.\n  // Clear marks immediately to avoid growing buffer.\n\n\n  performance.clearMarks(formattedMarkName);\n  performance.clearMeasures(formattedLabel);\n};\n\nvar getFiberMarkName = function (label, debugID) {\n  return label + \" (#\" + debugID + \")\";\n};\n\nvar getFiberLabel = function (componentName, isMounted, phase) {\n  if (phase === null) {\n    // These are composite component total time measurements.\n    return componentName + \" [\" + (isMounted ? 'update' : 'mount') + \"]\";\n  } else {\n    // Composite component methods.\n    return componentName + \".\" + phase;\n  }\n};\n\nvar beginFiberMark = function (fiber, phase) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n\n  if (isCommitting && labelsInCurrentCommit.has(label)) {\n    // During the commit phase, we don't show duplicate labels because\n    // there is a fixed overhead for every measurement, and we don't\n    // want to stretch the commit phase beyond necessary.\n    return false;\n  }\n\n  labelsInCurrentCommit.add(label);\n  var markName = getFiberMarkName(label, debugID);\n  beginMark(markName);\n  return true;\n};\n\nvar clearFiberMark = function (fiber, phase) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n  var markName = getFiberMarkName(label, debugID);\n  clearMark(markName);\n};\n\nvar endFiberMark = function (fiber, phase, warning) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n  var markName = getFiberMarkName(label, debugID);\n  endMark(label, markName, warning);\n};\n\nvar shouldIgnoreFiber = function (fiber) {\n  // Host components should be skipped in the timeline.\n  // We could check typeof fiber.type, but does this work with RN?\n  switch (fiber.tag) {\n    case HostRoot:\n    case HostComponent:\n    case HostText:\n    case HostPortal:\n    case Fragment:\n    case ContextProvider:\n    case ContextConsumer:\n    case Mode:\n      return true;\n\n    default:\n      return false;\n  }\n};\n\nvar clearPendingPhaseMeasurement = function () {\n  if (currentPhase !== null && currentPhaseFiber !== null) {\n    clearFiberMark(currentPhaseFiber, currentPhase);\n  }\n\n  currentPhaseFiber = null;\n  currentPhase = null;\n  hasScheduledUpdateInCurrentPhase = false;\n};\n\nvar pauseTimers = function () {\n  // Stops all currently active measurements so that they can be resumed\n  // if we continue in a later deferred loop from the same unit of work.\n  var fiber = currentFiber;\n\n  while (fiber) {\n    if (fiber._debugIsCurrentlyTiming) {\n      endFiberMark(fiber, null, null);\n    }\n\n    fiber = fiber.return;\n  }\n};\n\nvar resumeTimersRecursively = function (fiber) {\n  if (fiber.return !== null) {\n    resumeTimersRecursively(fiber.return);\n  }\n\n  if (fiber._debugIsCurrentlyTiming) {\n    beginFiberMark(fiber, null);\n  }\n};\n\nvar resumeTimers = function () {\n  // Resumes all measurements that were active during the last deferred loop.\n  if (currentFiber !== null) {\n    resumeTimersRecursively(currentFiber);\n  }\n};\n\nfunction recordEffect() {\n  {\n    effectCountInCurrentCommit++;\n  }\n}\nfunction recordScheduleUpdate() {\n  {\n    if (isCommitting) {\n      hasScheduledUpdateInCurrentCommit = true;\n    }\n\n    if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {\n      hasScheduledUpdateInCurrentPhase = true;\n    }\n  }\n}\nfunction startWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, this is the fiber to unwind from.\n\n\n    currentFiber = fiber;\n\n    if (!beginFiberMark(fiber, null)) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = true;\n  }\n}\nfunction cancelWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // Remember we shouldn't complete measurement for this fiber.\n    // Otherwise flamechart will be deep even for small updates.\n\n\n    fiber._debugIsCurrentlyTiming = false;\n    clearFiberMark(fiber, null);\n  }\n}\nfunction stopWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, its parent is the fiber to unwind from.\n\n\n    currentFiber = fiber.return;\n\n    if (!fiber._debugIsCurrentlyTiming) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = false;\n    endFiberMark(fiber, null, null);\n  }\n}\nfunction stopFailedWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, its parent is the fiber to unwind from.\n\n\n    currentFiber = fiber.return;\n\n    if (!fiber._debugIsCurrentlyTiming) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = false;\n    var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';\n    endFiberMark(fiber, null, warning);\n  }\n}\nfunction startPhaseTimer(fiber, phase) {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    clearPendingPhaseMeasurement();\n\n    if (!beginFiberMark(fiber, phase)) {\n      return;\n    }\n\n    currentPhaseFiber = fiber;\n    currentPhase = phase;\n  }\n}\nfunction stopPhaseTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    if (currentPhase !== null && currentPhaseFiber !== null) {\n      var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;\n      endFiberMark(currentPhaseFiber, currentPhase, warning);\n    }\n\n    currentPhase = null;\n    currentPhaseFiber = null;\n  }\n}\nfunction startWorkLoopTimer(nextUnitOfWork) {\n  {\n    currentFiber = nextUnitOfWork;\n\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    commitCountInCurrentWorkLoop = 0; // This is top level call.\n    // Any other measurements are performed within.\n\n    beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop.\n\n    resumeTimers();\n  }\n}\nfunction stopWorkLoopTimer(interruptedBy, didCompleteRoot) {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var warning = null;\n\n    if (interruptedBy !== null) {\n      if (interruptedBy.tag === HostRoot) {\n        warning = 'A top-level update interrupted the previous render';\n      } else {\n        var componentName = getComponentName(interruptedBy.type) || 'Unknown';\n        warning = \"An update to \" + componentName + \" interrupted the previous render\";\n      }\n    } else if (commitCountInCurrentWorkLoop > 1) {\n      warning = 'There were cascading updates';\n    }\n\n    commitCountInCurrentWorkLoop = 0;\n    var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop.\n\n    pauseTimers();\n    endMark(label, '(React Tree Reconciliation)', warning);\n  }\n}\nfunction startCommitTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    isCommitting = true;\n    hasScheduledUpdateInCurrentCommit = false;\n    labelsInCurrentCommit.clear();\n    beginMark('(Committing Changes)');\n  }\n}\nfunction stopCommitTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var warning = null;\n\n    if (hasScheduledUpdateInCurrentCommit) {\n      warning = 'Lifecycle hook scheduled a cascading update';\n    } else if (commitCountInCurrentWorkLoop > 0) {\n      warning = 'Caused by a cascading update in earlier commit';\n    }\n\n    hasScheduledUpdateInCurrentCommit = false;\n    commitCountInCurrentWorkLoop++;\n    isCommitting = false;\n    labelsInCurrentCommit.clear();\n    endMark('(Committing Changes)', '(Committing Changes)', warning);\n  }\n}\nfunction startCommitSnapshotEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Committing Snapshot Effects)');\n  }\n}\nfunction stopCommitSnapshotEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Committing Snapshot Effects: \" + count + \" Total)\", '(Committing Snapshot Effects)', null);\n  }\n}\nfunction startCommitHostEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Committing Host Effects)');\n  }\n}\nfunction stopCommitHostEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Committing Host Effects: \" + count + \" Total)\", '(Committing Host Effects)', null);\n  }\n}\nfunction startCommitLifeCyclesTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Calling Lifecycle Methods)');\n  }\n}\nfunction stopCommitLifeCyclesTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Calling Lifecycle Methods: \" + count + \" Total)\", '(Calling Lifecycle Methods)', null);\n  }\n}\n\nvar valueStack = [];\nvar fiberStack;\n\n{\n  fiberStack = [];\n}\n\nvar index = -1;\n\nfunction createCursor(defaultValue) {\n  return {\n    current: defaultValue\n  };\n}\n\nfunction pop(cursor, fiber) {\n  if (index < 0) {\n    {\n      error('Unexpected pop.');\n    }\n\n    return;\n  }\n\n  {\n    if (fiber !== fiberStack[index]) {\n      error('Unexpected Fiber popped.');\n    }\n  }\n\n  cursor.current = valueStack[index];\n  valueStack[index] = null;\n\n  {\n    fiberStack[index] = null;\n  }\n\n  index--;\n}\n\nfunction push(cursor, value, fiber) {\n  index++;\n  valueStack[index] = cursor.current;\n\n  {\n    fiberStack[index] = fiber;\n  }\n\n  cursor.current = value;\n}\n\nvar warnedAboutMissingGetChildContext;\n\n{\n  warnedAboutMissingGetChildContext = {};\n}\n\nvar emptyContextObject = {};\n\n{\n  Object.freeze(emptyContextObject);\n} // A cursor to the current merged context object on the stack.\n\n\nvar contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.\n\nvar didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.\n// We use this to get access to the parent context after we have already\n// pushed the next context provider, and now need to merge their contexts.\n\nvar previousContext = emptyContextObject;\n\nfunction getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {\n  {\n    if (didPushOwnContextIfProvider && isContextProvider(Component)) {\n      // If the fiber is a context provider itself, when we read its context\n      // we may have already pushed its own child context on the stack. A context\n      // provider should not \"see\" its own child context. Therefore we read the\n      // previous (parent) context instead for a context provider.\n      return previousContext;\n    }\n\n    return contextStackCursor.current;\n  }\n}\n\nfunction cacheContext(workInProgress, unmaskedContext, maskedContext) {\n  {\n    var instance = workInProgress.stateNode;\n    instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;\n    instance.__reactInternalMemoizedMaskedChildContext = maskedContext;\n  }\n}\n\nfunction getMaskedContext(workInProgress, unmaskedContext) {\n  {\n    var type = workInProgress.type;\n    var contextTypes = type.contextTypes;\n\n    if (!contextTypes) {\n      return emptyContextObject;\n    } // Avoid recreating masked context unless unmasked context has changed.\n    // Failing to do this will result in unnecessary calls to componentWillReceiveProps.\n    // This may trigger infinite loops if componentWillReceiveProps calls setState.\n\n\n    var instance = workInProgress.stateNode;\n\n    if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {\n      return instance.__reactInternalMemoizedMaskedChildContext;\n    }\n\n    var context = {};\n\n    for (var key in contextTypes) {\n      context[key] = unmaskedContext[key];\n    }\n\n    {\n      var name = getComponentName(type) || 'Unknown';\n      checkPropTypes(contextTypes, context, 'context', name, getCurrentFiberStackInDev);\n    } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n    // Context is created before the class component is instantiated so check for instance.\n\n\n    if (instance) {\n      cacheContext(workInProgress, unmaskedContext, context);\n    }\n\n    return context;\n  }\n}\n\nfunction hasContextChanged() {\n  {\n    return didPerformWorkStackCursor.current;\n  }\n}\n\nfunction isContextProvider(type) {\n  {\n    var childContextTypes = type.childContextTypes;\n    return childContextTypes !== null && childContextTypes !== undefined;\n  }\n}\n\nfunction popContext(fiber) {\n  {\n    pop(didPerformWorkStackCursor, fiber);\n    pop(contextStackCursor, fiber);\n  }\n}\n\nfunction popTopLevelContextObject(fiber) {\n  {\n    pop(didPerformWorkStackCursor, fiber);\n    pop(contextStackCursor, fiber);\n  }\n}\n\nfunction pushTopLevelContextObject(fiber, context, didChange) {\n  {\n    if (!(contextStackCursor.current === emptyContextObject)) {\n      {\n        throw Error( \"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    push(contextStackCursor, context, fiber);\n    push(didPerformWorkStackCursor, didChange, fiber);\n  }\n}\n\nfunction processChildContext(fiber, type, parentContext) {\n  {\n    var instance = fiber.stateNode;\n    var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.\n    // It has only been added in Fiber to match the (unintentional) behavior in Stack.\n\n    if (typeof instance.getChildContext !== 'function') {\n      {\n        var componentName = getComponentName(type) || 'Unknown';\n\n        if (!warnedAboutMissingGetChildContext[componentName]) {\n          warnedAboutMissingGetChildContext[componentName] = true;\n\n          error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);\n        }\n      }\n\n      return parentContext;\n    }\n\n    var childContext;\n    startPhaseTimer(fiber, 'getChildContext');\n    childContext = instance.getChildContext();\n    stopPhaseTimer();\n\n    for (var contextKey in childContext) {\n      if (!(contextKey in childContextTypes)) {\n        {\n          throw Error( (getComponentName(type) || 'Unknown') + \".getChildContext(): key \\\"\" + contextKey + \"\\\" is not defined in childContextTypes.\" );\n        }\n      }\n    }\n\n    {\n      var name = getComponentName(type) || 'Unknown';\n      checkPropTypes(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when\n      // somebody calls unstable_renderSubtreeIntoContainer() and we process\n      // context from the parent component instance. The stack will be missing\n      // because it's outside of the reconciliation, and so the pointer has not\n      // been set. This is rare and doesn't matter. We'll also remove that API.\n      getCurrentFiberStackInDev);\n    }\n\n    return _assign({}, parentContext, {}, childContext);\n  }\n}\n\nfunction pushContextProvider(workInProgress) {\n  {\n    var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.\n    // If the instance does not exist yet, we will push null at first,\n    // and replace it on the stack later when invalidating the context.\n\n    var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.\n    // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.\n\n    previousContext = contextStackCursor.current;\n    push(contextStackCursor, memoizedMergedChildContext, workInProgress);\n    push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);\n    return true;\n  }\n}\n\nfunction invalidateContextProvider(workInProgress, type, didChange) {\n  {\n    var instance = workInProgress.stateNode;\n\n    if (!instance) {\n      {\n        throw Error( \"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    if (didChange) {\n      // Merge parent and own context.\n      // Skip this if we're not updating due to sCU.\n      // This avoids unnecessarily recomputing memoized values.\n      var mergedContext = processChildContext(workInProgress, type, previousContext);\n      instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.\n      // It is important to unwind the context in the reverse order.\n\n      pop(didPerformWorkStackCursor, workInProgress);\n      pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.\n\n      push(contextStackCursor, mergedContext, workInProgress);\n      push(didPerformWorkStackCursor, didChange, workInProgress);\n    } else {\n      pop(didPerformWorkStackCursor, workInProgress);\n      push(didPerformWorkStackCursor, didChange, workInProgress);\n    }\n  }\n}\n\nfunction findCurrentUnmaskedContext(fiber) {\n  {\n    // Currently this is only used with renderSubtreeIntoContainer; not sure if it\n    // makes sense elsewhere\n    if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) {\n      {\n        throw Error( \"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    var node = fiber;\n\n    do {\n      switch (node.tag) {\n        case HostRoot:\n          return node.stateNode.context;\n\n        case ClassComponent:\n          {\n            var Component = node.type;\n\n            if (isContextProvider(Component)) {\n              return node.stateNode.__reactInternalMemoizedMergedChildContext;\n            }\n\n            break;\n          }\n      }\n\n      node = node.return;\n    } while (node !== null);\n\n    {\n      {\n        throw Error( \"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n}\n\nvar LegacyRoot = 0;\nvar BlockingRoot = 1;\nvar ConcurrentRoot = 2;\n\nvar Scheduler_runWithPriority = Scheduler.unstable_runWithPriority,\n    Scheduler_scheduleCallback = Scheduler.unstable_scheduleCallback,\n    Scheduler_cancelCallback = Scheduler.unstable_cancelCallback,\n    Scheduler_shouldYield = Scheduler.unstable_shouldYield,\n    Scheduler_requestPaint = Scheduler.unstable_requestPaint,\n    Scheduler_now = Scheduler.unstable_now,\n    Scheduler_getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n    Scheduler_ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n    Scheduler_UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n    Scheduler_NormalPriority = Scheduler.unstable_NormalPriority,\n    Scheduler_LowPriority = Scheduler.unstable_LowPriority,\n    Scheduler_IdlePriority = Scheduler.unstable_IdlePriority;\n\n{\n  // Provide explicit error message when production+profiling bundle of e.g.\n  // react-dom is used with production (non-profiling) bundle of\n  // scheduler/tracing\n  if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) {\n    {\n      throw Error( \"It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling\" );\n    }\n  }\n}\n\nvar fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use\n// ascending numbers so we can compare them like numbers. They start at 90 to\n// avoid clashing with Scheduler's priorities.\n\nvar ImmediatePriority = 99;\nvar UserBlockingPriority$1 = 98;\nvar NormalPriority = 97;\nvar LowPriority = 96;\nvar IdlePriority = 95; // NoPriority is the absence of priority. Also React-only.\n\nvar NoPriority = 90;\nvar shouldYield = Scheduler_shouldYield;\nvar requestPaint = // Fall back gracefully if we're running an older version of Scheduler.\nScheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {};\nvar syncQueue = null;\nvar immediateQueueCallbackNode = null;\nvar isFlushingSyncQueue = false;\nvar initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly.\n// This will be the case for modern browsers that support `performance.now`. In\n// older browsers, Scheduler falls back to `Date.now`, which returns a Unix\n// timestamp. In that case, subtract the module initialization time to simulate\n// the behavior of performance.now and keep our times small enough to fit\n// within 32 bits.\n// TODO: Consider lifting this into Scheduler.\n\nvar now = initialTimeMs < 10000 ? Scheduler_now : function () {\n  return Scheduler_now() - initialTimeMs;\n};\nfunction getCurrentPriorityLevel() {\n  switch (Scheduler_getCurrentPriorityLevel()) {\n    case Scheduler_ImmediatePriority:\n      return ImmediatePriority;\n\n    case Scheduler_UserBlockingPriority:\n      return UserBlockingPriority$1;\n\n    case Scheduler_NormalPriority:\n      return NormalPriority;\n\n    case Scheduler_LowPriority:\n      return LowPriority;\n\n    case Scheduler_IdlePriority:\n      return IdlePriority;\n\n    default:\n      {\n        {\n          throw Error( \"Unknown priority level.\" );\n        }\n      }\n\n  }\n}\n\nfunction reactPriorityToSchedulerPriority(reactPriorityLevel) {\n  switch (reactPriorityLevel) {\n    case ImmediatePriority:\n      return Scheduler_ImmediatePriority;\n\n    case UserBlockingPriority$1:\n      return Scheduler_UserBlockingPriority;\n\n    case NormalPriority:\n      return Scheduler_NormalPriority;\n\n    case LowPriority:\n      return Scheduler_LowPriority;\n\n    case IdlePriority:\n      return Scheduler_IdlePriority;\n\n    default:\n      {\n        {\n          throw Error( \"Unknown priority level.\" );\n        }\n      }\n\n  }\n}\n\nfunction runWithPriority$1(reactPriorityLevel, fn) {\n  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n  return Scheduler_runWithPriority(priorityLevel, fn);\n}\nfunction scheduleCallback(reactPriorityLevel, callback, options) {\n  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n  return Scheduler_scheduleCallback(priorityLevel, callback, options);\n}\nfunction scheduleSyncCallback(callback) {\n  // Push this callback into an internal queue. We'll flush these either in\n  // the next tick, or earlier if something calls `flushSyncCallbackQueue`.\n  if (syncQueue === null) {\n    syncQueue = [callback]; // Flush the queue in the next tick, at the earliest.\n\n    immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl);\n  } else {\n    // Push onto existing queue. Don't need to schedule a callback because\n    // we already scheduled one when we created the queue.\n    syncQueue.push(callback);\n  }\n\n  return fakeCallbackNode;\n}\nfunction cancelCallback(callbackNode) {\n  if (callbackNode !== fakeCallbackNode) {\n    Scheduler_cancelCallback(callbackNode);\n  }\n}\nfunction flushSyncCallbackQueue() {\n  if (immediateQueueCallbackNode !== null) {\n    var node = immediateQueueCallbackNode;\n    immediateQueueCallbackNode = null;\n    Scheduler_cancelCallback(node);\n  }\n\n  flushSyncCallbackQueueImpl();\n}\n\nfunction flushSyncCallbackQueueImpl() {\n  if (!isFlushingSyncQueue && syncQueue !== null) {\n    // Prevent re-entrancy.\n    isFlushingSyncQueue = true;\n    var i = 0;\n\n    try {\n      var _isSync = true;\n      var queue = syncQueue;\n      runWithPriority$1(ImmediatePriority, function () {\n        for (; i < queue.length; i++) {\n          var callback = queue[i];\n\n          do {\n            callback = callback(_isSync);\n          } while (callback !== null);\n        }\n      });\n      syncQueue = null;\n    } catch (error) {\n      // If something throws, leave the remaining callbacks on the queue.\n      if (syncQueue !== null) {\n        syncQueue = syncQueue.slice(i + 1);\n      } // Resume flushing in the next tick\n\n\n      Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue);\n      throw error;\n    } finally {\n      isFlushingSyncQueue = false;\n    }\n  }\n}\n\nvar NoMode = 0;\nvar StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root\n// tag instead\n\nvar BlockingMode = 2;\nvar ConcurrentMode = 4;\nvar ProfileMode = 8;\n\n// Max 31 bit integer. The max integer size in V8 for 32-bit systems.\n// Math.pow(2, 30) - 1\n// 0b111111111111111111111111111111\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\n\nvar NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that\n// Never work can be committed in an inconsistent state without tearing the UI.\n// The main example is offscreen content, like a hidden subtree. So one possible\n// name is Offscreen. However, it also includes dehydrated Suspense boundaries,\n// which are inconsistent in the sense that they haven't finished yet, but\n// aren't visibly inconsistent because the server rendered HTML matches what the\n// hydrated tree would look like.\n\nvar Never = 1; // Idle is slightly higher priority than Never. It must completely finish in\n// order to be consistent.\n\nvar Idle = 2; // Continuous Hydration is slightly higher than Idle and is used to increase\n// priority of hover targets.\n\nvar ContinuousHydration = 3;\nvar Sync = MAX_SIGNED_31_BIT_INT;\nvar Batched = Sync - 1;\nvar UNIT_SIZE = 10;\nvar MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms.\n\nfunction msToExpirationTime(ms) {\n  // Always subtract from the offset so that we don't clash with the magic number for NoWork.\n  return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);\n}\nfunction expirationTimeToMs(expirationTime) {\n  return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;\n}\n\nfunction ceiling(num, precision) {\n  return ((num / precision | 0) + 1) * precision;\n}\n\nfunction computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {\n  return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);\n} // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update\n// the names to reflect.\n\n\nvar LOW_PRIORITY_EXPIRATION = 5000;\nvar LOW_PRIORITY_BATCH_SIZE = 250;\nfunction computeAsyncExpiration(currentTime) {\n  return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);\n}\nfunction computeSuspenseExpiration(currentTime, timeoutMs) {\n  // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time?\n  return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE);\n} // We intentionally set a higher expiration time for interactive updates in\n// dev than in production.\n//\n// If the main thread is being blocked so long that you hit the expiration,\n// it's a problem that could be solved with better scheduling.\n//\n// People will be more likely to notice this and fix it with the long\n// expiration time in development.\n//\n// In production we opt for better UX at the risk of masking scheduling\n// problems, by expiring fast.\n\nvar HIGH_PRIORITY_EXPIRATION =  500 ;\nvar HIGH_PRIORITY_BATCH_SIZE = 100;\nfunction computeInteractiveExpiration(currentTime) {\n  return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);\n}\nfunction inferPriorityFromExpirationTime(currentTime, expirationTime) {\n  if (expirationTime === Sync) {\n    return ImmediatePriority;\n  }\n\n  if (expirationTime === Never || expirationTime === Idle) {\n    return IdlePriority;\n  }\n\n  var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime);\n\n  if (msUntil <= 0) {\n    return ImmediatePriority;\n  }\n\n  if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) {\n    return UserBlockingPriority$1;\n  }\n\n  if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) {\n    return NormalPriority;\n  } // TODO: Handle LowPriority\n  // Assume anything lower has idle priority\n\n\n  return IdlePriority;\n}\n\nvar ReactStrictModeWarnings = {\n  recordUnsafeLifecycleWarnings: function (fiber, instance) {},\n  flushPendingUnsafeLifecycleWarnings: function () {},\n  recordLegacyContextWarning: function (fiber, instance) {},\n  flushLegacyContextWarning: function () {},\n  discardPendingWarnings: function () {}\n};\n\n{\n  var findStrictRoot = function (fiber) {\n    var maybeStrictRoot = null;\n    var node = fiber;\n\n    while (node !== null) {\n      if (node.mode & StrictMode) {\n        maybeStrictRoot = node;\n      }\n\n      node = node.return;\n    }\n\n    return maybeStrictRoot;\n  };\n\n  var setToSortedString = function (set) {\n    var array = [];\n    set.forEach(function (value) {\n      array.push(value);\n    });\n    return array.sort().join(', ');\n  };\n\n  var pendingComponentWillMountWarnings = [];\n  var pendingUNSAFE_ComponentWillMountWarnings = [];\n  var pendingComponentWillReceivePropsWarnings = [];\n  var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n  var pendingComponentWillUpdateWarnings = [];\n  var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.\n\n  var didWarnAboutUnsafeLifecycles = new Set();\n\n  ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {\n    // Dedup strategy: Warn once per component.\n    if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {\n      return;\n    }\n\n    if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.\n    instance.componentWillMount.__suppressDeprecationWarning !== true) {\n      pendingComponentWillMountWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') {\n      pendingUNSAFE_ComponentWillMountWarnings.push(fiber);\n    }\n\n    if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n      pendingComponentWillReceivePropsWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n      pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);\n    }\n\n    if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n      pendingComponentWillUpdateWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {\n      pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);\n    }\n  };\n\n  ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {\n    // We do an initial pass to gather component names\n    var componentWillMountUniqueNames = new Set();\n\n    if (pendingComponentWillMountWarnings.length > 0) {\n      pendingComponentWillMountWarnings.forEach(function (fiber) {\n        componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillMountWarnings = [];\n    }\n\n    var UNSAFE_componentWillMountUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillMountWarnings = [];\n    }\n\n    var componentWillReceivePropsUniqueNames = new Set();\n\n    if (pendingComponentWillReceivePropsWarnings.length > 0) {\n      pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {\n        componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillReceivePropsWarnings = [];\n    }\n\n    var UNSAFE_componentWillReceivePropsUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    }\n\n    var componentWillUpdateUniqueNames = new Set();\n\n    if (pendingComponentWillUpdateWarnings.length > 0) {\n      pendingComponentWillUpdateWarnings.forEach(function (fiber) {\n        componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillUpdateWarnings = [];\n    }\n\n    var UNSAFE_componentWillUpdateUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillUpdateWarnings = [];\n    } // Finally, we flush all the warnings\n    // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'\n\n\n    if (UNSAFE_componentWillMountUniqueNames.size > 0) {\n      var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);\n\n      error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '\\nPlease update the following components: %s', sortedNames);\n    }\n\n    if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {\n      var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);\n\n      error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, \" + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '\\nPlease update the following components: %s', _sortedNames);\n    }\n\n    if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {\n      var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);\n\n      error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '\\nPlease update the following components: %s', _sortedNames2);\n    }\n\n    if (componentWillMountUniqueNames.size > 0) {\n      var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);\n\n      warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames3);\n    }\n\n    if (componentWillReceivePropsUniqueNames.size > 0) {\n      var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);\n\n      warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, refactor your \" + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames4);\n    }\n\n    if (componentWillUpdateUniqueNames.size > 0) {\n      var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);\n\n      warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames5);\n    }\n  };\n\n  var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.\n\n  var didWarnAboutLegacyContext = new Set();\n\n  ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {\n    var strictRoot = findStrictRoot(fiber);\n\n    if (strictRoot === null) {\n      error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');\n\n      return;\n    } // Dedup strategy: Warn once per component.\n\n\n    if (didWarnAboutLegacyContext.has(fiber.type)) {\n      return;\n    }\n\n    var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);\n\n    if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {\n      if (warningsForRoot === undefined) {\n        warningsForRoot = [];\n        pendingLegacyContextWarning.set(strictRoot, warningsForRoot);\n      }\n\n      warningsForRoot.push(fiber);\n    }\n  };\n\n  ReactStrictModeWarnings.flushLegacyContextWarning = function () {\n    pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {\n      if (fiberArray.length === 0) {\n        return;\n      }\n\n      var firstFiber = fiberArray[0];\n      var uniqueNames = new Set();\n      fiberArray.forEach(function (fiber) {\n        uniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutLegacyContext.add(fiber.type);\n      });\n      var sortedNames = setToSortedString(uniqueNames);\n      var firstComponentStack = getStackByFiberInDevAndProd(firstFiber);\n\n      error('Legacy context API has been detected within a strict-mode tree.' + '\\n\\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\\n\\nPlease update the following components: %s' + '\\n\\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, firstComponentStack);\n    });\n  };\n\n  ReactStrictModeWarnings.discardPendingWarnings = function () {\n    pendingComponentWillMountWarnings = [];\n    pendingUNSAFE_ComponentWillMountWarnings = [];\n    pendingComponentWillReceivePropsWarnings = [];\n    pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    pendingComponentWillUpdateWarnings = [];\n    pendingUNSAFE_ComponentWillUpdateWarnings = [];\n    pendingLegacyContextWarning = new Map();\n  };\n}\n\nvar resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.\n\nvar failedBoundaries = null;\nvar setRefreshHandler = function (handler) {\n  {\n    resolveFamily = handler;\n  }\n};\nfunction resolveFunctionForHotReloading(type) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return type;\n    }\n\n    var family = resolveFamily(type);\n\n    if (family === undefined) {\n      return type;\n    } // Use the latest known implementation.\n\n\n    return family.current;\n  }\n}\nfunction resolveClassForHotReloading(type) {\n  // No implementation differences.\n  return resolveFunctionForHotReloading(type);\n}\nfunction resolveForwardRefForHotReloading(type) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return type;\n    }\n\n    var family = resolveFamily(type);\n\n    if (family === undefined) {\n      // Check if we're dealing with a real forwardRef. Don't want to crash early.\n      if (type !== null && type !== undefined && typeof type.render === 'function') {\n        // ForwardRef is special because its resolved .type is an object,\n        // but it's possible that we only have its inner render function in the map.\n        // If that inner render function is different, we'll build a new forwardRef type.\n        var currentRender = resolveFunctionForHotReloading(type.render);\n\n        if (type.render !== currentRender) {\n          var syntheticType = {\n            $$typeof: REACT_FORWARD_REF_TYPE,\n            render: currentRender\n          };\n\n          if (type.displayName !== undefined) {\n            syntheticType.displayName = type.displayName;\n          }\n\n          return syntheticType;\n        }\n      }\n\n      return type;\n    } // Use the latest known implementation.\n\n\n    return family.current;\n  }\n}\nfunction isCompatibleFamilyForHotReloading(fiber, element) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return false;\n    }\n\n    var prevType = fiber.elementType;\n    var nextType = element.type; // If we got here, we know types aren't === equal.\n\n    var needsCompareFamilies = false;\n    var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;\n\n    switch (fiber.tag) {\n      case ClassComponent:\n        {\n          if (typeof nextType === 'function') {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case FunctionComponent:\n        {\n          if (typeof nextType === 'function') {\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            // We don't know the inner type yet.\n            // We're going to assume that the lazy inner type is stable,\n            // and so it is sufficient to avoid reconciling it away.\n            // We're not going to unwrap or actually use the new lazy type.\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case ForwardRef:\n        {\n          if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case MemoComponent:\n      case SimpleMemoComponent:\n        {\n          if ($$typeofNextType === REACT_MEMO_TYPE) {\n            // TODO: if it was but can no longer be simple,\n            // we shouldn't set this.\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      default:\n        return false;\n    } // Check if both types have a family and it's the same one.\n\n\n    if (needsCompareFamilies) {\n      // Note: memo() and forwardRef() we'll compare outer rather than inner type.\n      // This means both of them need to be registered to preserve state.\n      // If we unwrapped and compared the inner types for wrappers instead,\n      // then we would risk falsely saying two separate memo(Foo)\n      // calls are equivalent because they wrap the same Foo function.\n      var prevFamily = resolveFamily(prevType);\n\n      if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\nfunction markFailedErrorBoundaryForHotReloading(fiber) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return;\n    }\n\n    if (typeof WeakSet !== 'function') {\n      return;\n    }\n\n    if (failedBoundaries === null) {\n      failedBoundaries = new WeakSet();\n    }\n\n    failedBoundaries.add(fiber);\n  }\n}\nvar scheduleRefresh = function (root, update) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return;\n    }\n\n    var staleFamilies = update.staleFamilies,\n        updatedFamilies = update.updatedFamilies;\n    flushPassiveEffects();\n    flushSync(function () {\n      scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);\n    });\n  }\n};\nvar scheduleRoot = function (root, element) {\n  {\n    if (root.context !== emptyContextObject) {\n      // Super edge case: root has a legacy _renderSubtree context\n      // but we don't know the parentComponent so we can't pass it.\n      // Just ignore. We'll delete this with _renderSubtree code path later.\n      return;\n    }\n\n    flushPassiveEffects();\n    syncUpdates(function () {\n      updateContainer(element, root, null, null);\n    });\n  }\n};\n\nfunction scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {\n  {\n    var alternate = fiber.alternate,\n        child = fiber.child,\n        sibling = fiber.sibling,\n        tag = fiber.tag,\n        type = fiber.type;\n    var candidateType = null;\n\n    switch (tag) {\n      case FunctionComponent:\n      case SimpleMemoComponent:\n      case ClassComponent:\n        candidateType = type;\n        break;\n\n      case ForwardRef:\n        candidateType = type.render;\n        break;\n    }\n\n    if (resolveFamily === null) {\n      throw new Error('Expected resolveFamily to be set during hot reload.');\n    }\n\n    var needsRender = false;\n    var needsRemount = false;\n\n    if (candidateType !== null) {\n      var family = resolveFamily(candidateType);\n\n      if (family !== undefined) {\n        if (staleFamilies.has(family)) {\n          needsRemount = true;\n        } else if (updatedFamilies.has(family)) {\n          if (tag === ClassComponent) {\n            needsRemount = true;\n          } else {\n            needsRender = true;\n          }\n        }\n      }\n    }\n\n    if (failedBoundaries !== null) {\n      if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {\n        needsRemount = true;\n      }\n    }\n\n    if (needsRemount) {\n      fiber._debugNeedsRemount = true;\n    }\n\n    if (needsRemount || needsRender) {\n      scheduleWork(fiber, Sync);\n    }\n\n    if (child !== null && !needsRemount) {\n      scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);\n    }\n\n    if (sibling !== null) {\n      scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);\n    }\n  }\n}\n\nvar findHostInstancesForRefresh = function (root, families) {\n  {\n    var hostInstances = new Set();\n    var types = new Set(families.map(function (family) {\n      return family.current;\n    }));\n    findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);\n    return hostInstances;\n  }\n};\n\nfunction findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {\n  {\n    var child = fiber.child,\n        sibling = fiber.sibling,\n        tag = fiber.tag,\n        type = fiber.type;\n    var candidateType = null;\n\n    switch (tag) {\n      case FunctionComponent:\n      case SimpleMemoComponent:\n      case ClassComponent:\n        candidateType = type;\n        break;\n\n      case ForwardRef:\n        candidateType = type.render;\n        break;\n    }\n\n    var didMatch = false;\n\n    if (candidateType !== null) {\n      if (types.has(candidateType)) {\n        didMatch = true;\n      }\n    }\n\n    if (didMatch) {\n      // We have a match. This only drills down to the closest host components.\n      // There's no need to search deeper because for the purpose of giving\n      // visual feedback, \"flashing\" outermost parent rectangles is sufficient.\n      findHostInstancesForFiberShallowly(fiber, hostInstances);\n    } else {\n      // If there's no match, maybe there will be one further down in the child tree.\n      if (child !== null) {\n        findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);\n      }\n    }\n\n    if (sibling !== null) {\n      findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);\n    }\n  }\n}\n\nfunction findHostInstancesForFiberShallowly(fiber, hostInstances) {\n  {\n    var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);\n\n    if (foundHostInstances) {\n      return;\n    } // If we didn't find any host children, fallback to closest host parent.\n\n\n    var node = fiber;\n\n    while (true) {\n      switch (node.tag) {\n        case HostComponent:\n          hostInstances.add(node.stateNode);\n          return;\n\n        case HostPortal:\n          hostInstances.add(node.stateNode.containerInfo);\n          return;\n\n        case HostRoot:\n          hostInstances.add(node.stateNode.containerInfo);\n          return;\n      }\n\n      if (node.return === null) {\n        throw new Error('Expected to reach root first.');\n      }\n\n      node = node.return;\n    }\n  }\n}\n\nfunction findChildHostInstancesForFiberShallowly(fiber, hostInstances) {\n  {\n    var node = fiber;\n    var foundHostInstances = false;\n\n    while (true) {\n      if (node.tag === HostComponent) {\n        // We got a match.\n        foundHostInstances = true;\n        hostInstances.add(node.stateNode); // There may still be more, so keep searching.\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === fiber) {\n        return foundHostInstances;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === fiber) {\n          return foundHostInstances;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n\n  return false;\n}\n\nfunction resolveDefaultProps(Component, baseProps) {\n  if (Component && Component.defaultProps) {\n    // Resolve default props. Taken from ReactElement\n    var props = _assign({}, baseProps);\n\n    var defaultProps = Component.defaultProps;\n\n    for (var propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n\n    return props;\n  }\n\n  return baseProps;\n}\nfunction readLazyComponentType(lazyComponent) {\n  initializeLazyComponentType(lazyComponent);\n\n  if (lazyComponent._status !== Resolved) {\n    throw lazyComponent._result;\n  }\n\n  return lazyComponent._result;\n}\n\nvar valueCursor = createCursor(null);\nvar rendererSigil;\n\n{\n  // Use this to detect multiple renderers using the same context\n  rendererSigil = {};\n}\n\nvar currentlyRenderingFiber = null;\nvar lastContextDependency = null;\nvar lastContextWithAllBitsObserved = null;\nvar isDisallowedContextReadInDEV = false;\nfunction resetContextDependencies() {\n  // This is called right before React yields execution, to ensure `readContext`\n  // cannot be called outside the render phase.\n  currentlyRenderingFiber = null;\n  lastContextDependency = null;\n  lastContextWithAllBitsObserved = null;\n\n  {\n    isDisallowedContextReadInDEV = false;\n  }\n}\nfunction enterDisallowedContextReadInDEV() {\n  {\n    isDisallowedContextReadInDEV = true;\n  }\n}\nfunction exitDisallowedContextReadInDEV() {\n  {\n    isDisallowedContextReadInDEV = false;\n  }\n}\nfunction pushProvider(providerFiber, nextValue) {\n  var context = providerFiber.type._context;\n\n  {\n    push(valueCursor, context._currentValue, providerFiber);\n    context._currentValue = nextValue;\n\n    {\n      if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {\n        error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');\n      }\n\n      context._currentRenderer = rendererSigil;\n    }\n  }\n}\nfunction popProvider(providerFiber) {\n  var currentValue = valueCursor.current;\n  pop(valueCursor, providerFiber);\n  var context = providerFiber.type._context;\n\n  {\n    context._currentValue = currentValue;\n  }\n}\nfunction calculateChangedBits(context, newValue, oldValue) {\n  if (objectIs(oldValue, newValue)) {\n    // No change\n    return 0;\n  } else {\n    var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n    {\n      if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) {\n        error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);\n      }\n    }\n\n    return changedBits | 0;\n  }\n}\nfunction scheduleWorkOnParentPath(parent, renderExpirationTime) {\n  // Update the child expiration time of all the ancestors, including\n  // the alternates.\n  var node = parent;\n\n  while (node !== null) {\n    var alternate = node.alternate;\n\n    if (node.childExpirationTime < renderExpirationTime) {\n      node.childExpirationTime = renderExpirationTime;\n\n      if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n        alternate.childExpirationTime = renderExpirationTime;\n      }\n    } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n      alternate.childExpirationTime = renderExpirationTime;\n    } else {\n      // Neither alternate was updated, which means the rest of the\n      // ancestor path already has sufficient priority.\n      break;\n    }\n\n    node = node.return;\n  }\n}\nfunction propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {\n  var fiber = workInProgress.child;\n\n  if (fiber !== null) {\n    // Set the return pointer of the child to the work-in-progress fiber.\n    fiber.return = workInProgress;\n  }\n\n  while (fiber !== null) {\n    var nextFiber = void 0; // Visit this fiber.\n\n    var list = fiber.dependencies;\n\n    if (list !== null) {\n      nextFiber = fiber.child;\n      var dependency = list.firstContext;\n\n      while (dependency !== null) {\n        // Check if the context matches.\n        if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {\n          // Match! Schedule an update on this fiber.\n          if (fiber.tag === ClassComponent) {\n            // Schedule a force update on the work-in-progress.\n            var update = createUpdate(renderExpirationTime, null);\n            update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the\n            // update to the current fiber, too, which means it will persist even if\n            // this render is thrown away. Since it's a race condition, not sure it's\n            // worth fixing.\n\n            enqueueUpdate(fiber, update);\n          }\n\n          if (fiber.expirationTime < renderExpirationTime) {\n            fiber.expirationTime = renderExpirationTime;\n          }\n\n          var alternate = fiber.alternate;\n\n          if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n            alternate.expirationTime = renderExpirationTime;\n          }\n\n          scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too.\n\n          if (list.expirationTime < renderExpirationTime) {\n            list.expirationTime = renderExpirationTime;\n          } // Since we already found a match, we can stop traversing the\n          // dependency list.\n\n\n          break;\n        }\n\n        dependency = dependency.next;\n      }\n    } else if (fiber.tag === ContextProvider) {\n      // Don't scan deeper if this is a matching provider\n      nextFiber = fiber.type === workInProgress.type ? null : fiber.child;\n    } else {\n      // Traverse down.\n      nextFiber = fiber.child;\n    }\n\n    if (nextFiber !== null) {\n      // Set the return pointer of the child to the work-in-progress fiber.\n      nextFiber.return = fiber;\n    } else {\n      // No child. Traverse to next sibling.\n      nextFiber = fiber;\n\n      while (nextFiber !== null) {\n        if (nextFiber === workInProgress) {\n          // We're back to the root of this subtree. Exit.\n          nextFiber = null;\n          break;\n        }\n\n        var sibling = nextFiber.sibling;\n\n        if (sibling !== null) {\n          // Set the return pointer of the sibling to the work-in-progress fiber.\n          sibling.return = nextFiber.return;\n          nextFiber = sibling;\n          break;\n        } // No more siblings. Traverse up.\n\n\n        nextFiber = nextFiber.return;\n      }\n    }\n\n    fiber = nextFiber;\n  }\n}\nfunction prepareToReadContext(workInProgress, renderExpirationTime) {\n  currentlyRenderingFiber = workInProgress;\n  lastContextDependency = null;\n  lastContextWithAllBitsObserved = null;\n  var dependencies = workInProgress.dependencies;\n\n  if (dependencies !== null) {\n    var firstContext = dependencies.firstContext;\n\n    if (firstContext !== null) {\n      if (dependencies.expirationTime >= renderExpirationTime) {\n        // Context list has a pending update. Mark that this fiber performed work.\n        markWorkInProgressReceivedUpdate();\n      } // Reset the work-in-progress list\n\n\n      dependencies.firstContext = null;\n    }\n  }\n}\nfunction readContext(context, observedBits) {\n  {\n    // This warning would fire if you read context inside a Hook like useMemo.\n    // Unlike the class check below, it's not enforced in production for perf.\n    if (isDisallowedContextReadInDEV) {\n      error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n    }\n  }\n\n  if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else {\n    var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types.\n\n    if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) {\n      // Observe all updates.\n      lastContextWithAllBitsObserved = context;\n      resolvedObservedBits = MAX_SIGNED_31_BIT_INT;\n    } else {\n      resolvedObservedBits = observedBits;\n    }\n\n    var contextItem = {\n      context: context,\n      observedBits: resolvedObservedBits,\n      next: null\n    };\n\n    if (lastContextDependency === null) {\n      if (!(currentlyRenderingFiber !== null)) {\n        {\n          throw Error( \"Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().\" );\n        }\n      } // This is the first dependency for this component. Create a new list.\n\n\n      lastContextDependency = contextItem;\n      currentlyRenderingFiber.dependencies = {\n        expirationTime: NoWork,\n        firstContext: contextItem,\n        responders: null\n      };\n    } else {\n      // Append a new context item.\n      lastContextDependency = lastContextDependency.next = contextItem;\n    }\n  }\n\n  return  context._currentValue ;\n}\n\nvar UpdateState = 0;\nvar ReplaceState = 1;\nvar ForceUpdate = 2;\nvar CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.\n// It should only be read right after calling `processUpdateQueue`, via\n// `checkHasForceUpdateAfterProcessing`.\n\nvar hasForceUpdate = false;\nvar didWarnUpdateInsideUpdate;\nvar currentlyProcessingQueue;\n\n{\n  didWarnUpdateInsideUpdate = false;\n  currentlyProcessingQueue = null;\n}\n\nfunction initializeUpdateQueue(fiber) {\n  var queue = {\n    baseState: fiber.memoizedState,\n    baseQueue: null,\n    shared: {\n      pending: null\n    },\n    effects: null\n  };\n  fiber.updateQueue = queue;\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n  // Clone the update queue from current. Unless it's already a clone.\n  var queue = workInProgress.updateQueue;\n  var currentQueue = current.updateQueue;\n\n  if (queue === currentQueue) {\n    var clone = {\n      baseState: currentQueue.baseState,\n      baseQueue: currentQueue.baseQueue,\n      shared: currentQueue.shared,\n      effects: currentQueue.effects\n    };\n    workInProgress.updateQueue = clone;\n  }\n}\nfunction createUpdate(expirationTime, suspenseConfig) {\n  var update = {\n    expirationTime: expirationTime,\n    suspenseConfig: suspenseConfig,\n    tag: UpdateState,\n    payload: null,\n    callback: null,\n    next: null\n  };\n  update.next = update;\n\n  {\n    update.priority = getCurrentPriorityLevel();\n  }\n\n  return update;\n}\nfunction enqueueUpdate(fiber, update) {\n  var updateQueue = fiber.updateQueue;\n\n  if (updateQueue === null) {\n    // Only occurs if the fiber has been unmounted.\n    return;\n  }\n\n  var sharedQueue = updateQueue.shared;\n  var pending = sharedQueue.pending;\n\n  if (pending === null) {\n    // This is the first update. Create a circular list.\n    update.next = update;\n  } else {\n    update.next = pending.next;\n    pending.next = update;\n  }\n\n  sharedQueue.pending = update;\n\n  {\n    if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {\n      error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');\n\n      didWarnUpdateInsideUpdate = true;\n    }\n  }\n}\nfunction enqueueCapturedUpdate(workInProgress, update) {\n  var current = workInProgress.alternate;\n\n  if (current !== null) {\n    // Ensure the work-in-progress queue is a clone\n    cloneUpdateQueue(current, workInProgress);\n  } // Captured updates go only on the work-in-progress queue.\n\n\n  var queue = workInProgress.updateQueue; // Append the update to the end of the list.\n\n  var last = queue.baseQueue;\n\n  if (last === null) {\n    queue.baseQueue = update.next = update;\n    update.next = update;\n  } else {\n    update.next = last.next;\n    last.next = update;\n  }\n}\n\nfunction getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {\n  switch (update.tag) {\n    case ReplaceState:\n      {\n        var payload = update.payload;\n\n        if (typeof payload === 'function') {\n          // Updater function\n          {\n            enterDisallowedContextReadInDEV();\n\n            if ( workInProgress.mode & StrictMode) {\n              payload.call(instance, prevState, nextProps);\n            }\n          }\n\n          var nextState = payload.call(instance, prevState, nextProps);\n\n          {\n            exitDisallowedContextReadInDEV();\n          }\n\n          return nextState;\n        } // State object\n\n\n        return payload;\n      }\n\n    case CaptureUpdate:\n      {\n        workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;\n      }\n    // Intentional fallthrough\n\n    case UpdateState:\n      {\n        var _payload = update.payload;\n        var partialState;\n\n        if (typeof _payload === 'function') {\n          // Updater function\n          {\n            enterDisallowedContextReadInDEV();\n\n            if ( workInProgress.mode & StrictMode) {\n              _payload.call(instance, prevState, nextProps);\n            }\n          }\n\n          partialState = _payload.call(instance, prevState, nextProps);\n\n          {\n            exitDisallowedContextReadInDEV();\n          }\n        } else {\n          // Partial state object\n          partialState = _payload;\n        }\n\n        if (partialState === null || partialState === undefined) {\n          // Null and undefined are treated as no-ops.\n          return prevState;\n        } // Merge the partial state and the previous state.\n\n\n        return _assign({}, prevState, partialState);\n      }\n\n    case ForceUpdate:\n      {\n        hasForceUpdate = true;\n        return prevState;\n      }\n  }\n\n  return prevState;\n}\n\nfunction processUpdateQueue(workInProgress, props, instance, renderExpirationTime) {\n  // This is always non-null on a ClassComponent or HostRoot\n  var queue = workInProgress.updateQueue;\n  hasForceUpdate = false;\n\n  {\n    currentlyProcessingQueue = queue.shared;\n  } // The last rebase update that is NOT part of the base state.\n\n\n  var baseQueue = queue.baseQueue; // The last pending update that hasn't been processed yet.\n\n  var pendingQueue = queue.shared.pending;\n\n  if (pendingQueue !== null) {\n    // We have new updates that haven't been processed yet.\n    // We'll add them to the base queue.\n    if (baseQueue !== null) {\n      // Merge the pending queue and the base queue.\n      var baseFirst = baseQueue.next;\n      var pendingFirst = pendingQueue.next;\n      baseQueue.next = pendingFirst;\n      pendingQueue.next = baseFirst;\n    }\n\n    baseQueue = pendingQueue;\n    queue.shared.pending = null; // TODO: Pass `current` as argument\n\n    var current = workInProgress.alternate;\n\n    if (current !== null) {\n      var currentQueue = current.updateQueue;\n\n      if (currentQueue !== null) {\n        currentQueue.baseQueue = pendingQueue;\n      }\n    }\n  } // These values may change as we process the queue.\n\n\n  if (baseQueue !== null) {\n    var first = baseQueue.next; // Iterate through the list of updates to compute the result.\n\n    var newState = queue.baseState;\n    var newExpirationTime = NoWork;\n    var newBaseState = null;\n    var newBaseQueueFirst = null;\n    var newBaseQueueLast = null;\n\n    if (first !== null) {\n      var update = first;\n\n      do {\n        var updateExpirationTime = update.expirationTime;\n\n        if (updateExpirationTime < renderExpirationTime) {\n          // Priority is insufficient. Skip this update. If this is the first\n          // skipped update, the previous update/state is the new base\n          // update/state.\n          var clone = {\n            expirationTime: update.expirationTime,\n            suspenseConfig: update.suspenseConfig,\n            tag: update.tag,\n            payload: update.payload,\n            callback: update.callback,\n            next: null\n          };\n\n          if (newBaseQueueLast === null) {\n            newBaseQueueFirst = newBaseQueueLast = clone;\n            newBaseState = newState;\n          } else {\n            newBaseQueueLast = newBaseQueueLast.next = clone;\n          } // Update the remaining priority in the queue.\n\n\n          if (updateExpirationTime > newExpirationTime) {\n            newExpirationTime = updateExpirationTime;\n          }\n        } else {\n          // This update does have sufficient priority.\n          if (newBaseQueueLast !== null) {\n            var _clone = {\n              expirationTime: Sync,\n              // This update is going to be committed so we never want uncommit it.\n              suspenseConfig: update.suspenseConfig,\n              tag: update.tag,\n              payload: update.payload,\n              callback: update.callback,\n              next: null\n            };\n            newBaseQueueLast = newBaseQueueLast.next = _clone;\n          } // Mark the event time of this update as relevant to this render pass.\n          // TODO: This should ideally use the true event time of this update rather than\n          // its priority which is a derived and not reverseable value.\n          // TODO: We should skip this update if it was already committed but currently\n          // we have no way of detecting the difference between a committed and suspended\n          // update here.\n\n\n          markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n          newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);\n          var callback = update.callback;\n\n          if (callback !== null) {\n            workInProgress.effectTag |= Callback;\n            var effects = queue.effects;\n\n            if (effects === null) {\n              queue.effects = [update];\n            } else {\n              effects.push(update);\n            }\n          }\n        }\n\n        update = update.next;\n\n        if (update === null || update === first) {\n          pendingQueue = queue.shared.pending;\n\n          if (pendingQueue === null) {\n            break;\n          } else {\n            // An update was scheduled from inside a reducer. Add the new\n            // pending updates to the end of the list and keep processing.\n            update = baseQueue.next = pendingQueue.next;\n            pendingQueue.next = first;\n            queue.baseQueue = baseQueue = pendingQueue;\n            queue.shared.pending = null;\n          }\n        }\n      } while (true);\n    }\n\n    if (newBaseQueueLast === null) {\n      newBaseState = newState;\n    } else {\n      newBaseQueueLast.next = newBaseQueueFirst;\n    }\n\n    queue.baseState = newBaseState;\n    queue.baseQueue = newBaseQueueLast; // Set the remaining expiration time to be whatever is remaining in the queue.\n    // This should be fine because the only two other things that contribute to\n    // expiration time are props and context. We're already in the middle of the\n    // begin phase by the time we start processing the queue, so we've already\n    // dealt with the props. Context in components that specify\n    // shouldComponentUpdate is tricky; but we'll have to account for\n    // that regardless.\n\n    markUnprocessedUpdateTime(newExpirationTime);\n    workInProgress.expirationTime = newExpirationTime;\n    workInProgress.memoizedState = newState;\n  }\n\n  {\n    currentlyProcessingQueue = null;\n  }\n}\n\nfunction callCallback(callback, context) {\n  if (!(typeof callback === 'function')) {\n    {\n      throw Error( \"Invalid argument passed as callback. Expected a function. Instead received: \" + callback );\n    }\n  }\n\n  callback.call(context);\n}\n\nfunction resetHasForceUpdateBeforeProcessing() {\n  hasForceUpdate = false;\n}\nfunction checkHasForceUpdateAfterProcessing() {\n  return hasForceUpdate;\n}\nfunction commitUpdateQueue(finishedWork, finishedQueue, instance) {\n  // Commit the effects\n  var effects = finishedQueue.effects;\n  finishedQueue.effects = null;\n\n  if (effects !== null) {\n    for (var i = 0; i < effects.length; i++) {\n      var effect = effects[i];\n      var callback = effect.callback;\n\n      if (callback !== null) {\n        effect.callback = null;\n        callCallback(callback, instance);\n      }\n    }\n  }\n}\n\nvar ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;\nfunction requestCurrentSuspenseConfig() {\n  return ReactCurrentBatchConfig.suspense;\n}\n\nvar fakeInternalInstance = {};\nvar isArray = Array.isArray; // React.Component uses a shared frozen object by default.\n// We'll use it to determine whether we need to initialize legacy refs.\n\nvar emptyRefsObject = new React.Component().refs;\nvar didWarnAboutStateAssignmentForComponent;\nvar didWarnAboutUninitializedState;\nvar didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;\nvar didWarnAboutLegacyLifecyclesAndDerivedState;\nvar didWarnAboutUndefinedDerivedState;\nvar warnOnUndefinedDerivedState;\nvar warnOnInvalidCallback;\nvar didWarnAboutDirectlyAssigningPropsToState;\nvar didWarnAboutContextTypeAndContextTypes;\nvar didWarnAboutInvalidateContextType;\n\n{\n  didWarnAboutStateAssignmentForComponent = new Set();\n  didWarnAboutUninitializedState = new Set();\n  didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();\n  didWarnAboutLegacyLifecyclesAndDerivedState = new Set();\n  didWarnAboutDirectlyAssigningPropsToState = new Set();\n  didWarnAboutUndefinedDerivedState = new Set();\n  didWarnAboutContextTypeAndContextTypes = new Set();\n  didWarnAboutInvalidateContextType = new Set();\n  var didWarnOnInvalidCallback = new Set();\n\n  warnOnInvalidCallback = function (callback, callerName) {\n    if (callback === null || typeof callback === 'function') {\n      return;\n    }\n\n    var key = callerName + \"_\" + callback;\n\n    if (!didWarnOnInvalidCallback.has(key)) {\n      didWarnOnInvalidCallback.add(key);\n\n      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n    }\n  };\n\n  warnOnUndefinedDerivedState = function (type, partialState) {\n    if (partialState === undefined) {\n      var componentName = getComponentName(type) || 'Component';\n\n      if (!didWarnAboutUndefinedDerivedState.has(componentName)) {\n        didWarnAboutUndefinedDerivedState.add(componentName);\n\n        error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);\n      }\n    }\n  }; // This is so gross but it's at least non-critical and can be removed if\n  // it causes problems. This is meant to give a nicer error message for\n  // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,\n  // ...)) which otherwise throws a \"_processChildContext is not a function\"\n  // exception.\n\n\n  Object.defineProperty(fakeInternalInstance, '_processChildContext', {\n    enumerable: false,\n    value: function () {\n      {\n        {\n          throw Error( \"_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).\" );\n        }\n      }\n    }\n  });\n  Object.freeze(fakeInternalInstance);\n}\n\nfunction applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {\n  var prevState = workInProgress.memoizedState;\n\n  {\n    if ( workInProgress.mode & StrictMode) {\n      // Invoke the function an extra time to help detect side-effects.\n      getDerivedStateFromProps(nextProps, prevState);\n    }\n  }\n\n  var partialState = getDerivedStateFromProps(nextProps, prevState);\n\n  {\n    warnOnUndefinedDerivedState(ctor, partialState);\n  } // Merge the partial state and the previous state.\n\n\n  var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);\n  workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the\n  // base state.\n\n  if (workInProgress.expirationTime === NoWork) {\n    // Queue is always non-null for classes\n    var updateQueue = workInProgress.updateQueue;\n    updateQueue.baseState = memoizedState;\n  }\n}\nvar classComponentUpdater = {\n  isMounted: isMounted,\n  enqueueSetState: function (inst, payload, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.payload = payload;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'setState');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  },\n  enqueueReplaceState: function (inst, payload, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.tag = ReplaceState;\n    update.payload = payload;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'replaceState');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  },\n  enqueueForceUpdate: function (inst, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.tag = ForceUpdate;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'forceUpdate');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  }\n};\n\nfunction checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {\n  var instance = workInProgress.stateNode;\n\n  if (typeof instance.shouldComponentUpdate === 'function') {\n    {\n      if ( workInProgress.mode & StrictMode) {\n        // Invoke the function an extra time to help detect side-effects.\n        instance.shouldComponentUpdate(newProps, newState, nextContext);\n      }\n    }\n\n    startPhaseTimer(workInProgress, 'shouldComponentUpdate');\n    var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);\n    stopPhaseTimer();\n\n    {\n      if (shouldUpdate === undefined) {\n        error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component');\n      }\n    }\n\n    return shouldUpdate;\n  }\n\n  if (ctor.prototype && ctor.prototype.isPureReactComponent) {\n    return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);\n  }\n\n  return true;\n}\n\nfunction checkClassInstance(workInProgress, ctor, newProps) {\n  var instance = workInProgress.stateNode;\n\n  {\n    var name = getComponentName(ctor) || 'Component';\n    var renderPresent = instance.render;\n\n    if (!renderPresent) {\n      if (ctor.prototype && typeof ctor.prototype.render === 'function') {\n        error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);\n      } else {\n        error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);\n      }\n    }\n\n    if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {\n      error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);\n    }\n\n    if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);\n    }\n\n    if (instance.propTypes) {\n      error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);\n    }\n\n    if (instance.contextType) {\n      error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);\n    }\n\n    {\n      if (instance.contextTypes) {\n        error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);\n      }\n\n      if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {\n        didWarnAboutContextTypeAndContextTypes.add(ctor);\n\n        error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);\n      }\n    }\n\n    if (typeof instance.componentShouldUpdate === 'function') {\n      error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);\n    }\n\n    if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {\n      error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');\n    }\n\n    if (typeof instance.componentDidUnmount === 'function') {\n      error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);\n    }\n\n    if (typeof instance.componentDidReceiveProps === 'function') {\n      error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);\n    }\n\n    if (typeof instance.componentWillRecieveProps === 'function') {\n      error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);\n    }\n\n    if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {\n      error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);\n    }\n\n    var hasMutatedProps = instance.props !== newProps;\n\n    if (instance.props !== undefined && hasMutatedProps) {\n      error('%s(...): When calling super() in `%s`, make sure to pass ' + \"up the same props that your component's constructor was passed.\", name, name);\n    }\n\n    if (instance.defaultProps) {\n      error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {\n      didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);\n\n      error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));\n    }\n\n    if (typeof instance.getDerivedStateFromProps === 'function') {\n      error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n    }\n\n    if (typeof instance.getDerivedStateFromError === 'function') {\n      error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n    }\n\n    if (typeof ctor.getSnapshotBeforeUpdate === 'function') {\n      error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);\n    }\n\n    var _state = instance.state;\n\n    if (_state && (typeof _state !== 'object' || isArray(_state))) {\n      error('%s.state: must be set to an object or null', name);\n    }\n\n    if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {\n      error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);\n    }\n  }\n}\n\nfunction adoptClassInstance(workInProgress, instance) {\n  instance.updater = classComponentUpdater;\n  workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates\n\n  set(instance, workInProgress);\n\n  {\n    instance._reactInternalInstance = fakeInternalInstance;\n  }\n}\n\nfunction constructClassInstance(workInProgress, ctor, props) {\n  var isLegacyContextConsumer = false;\n  var unmaskedContext = emptyContextObject;\n  var context = emptyContextObject;\n  var contextType = ctor.contextType;\n\n  {\n    if ('contextType' in ctor) {\n      var isValid = // Allow null for conditional declaration\n      contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>\n\n      if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {\n        didWarnAboutInvalidateContextType.add(ctor);\n        var addendum = '';\n\n        if (contextType === undefined) {\n          addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';\n        } else if (typeof contextType !== 'object') {\n          addendum = ' However, it is set to a ' + typeof contextType + '.';\n        } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {\n          addendum = ' Did you accidentally pass the Context.Provider instead?';\n        } else if (contextType._context !== undefined) {\n          // <Context.Consumer>\n          addendum = ' Did you accidentally pass the Context.Consumer instead?';\n        } else {\n          addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';\n        }\n\n        error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum);\n      }\n    }\n  }\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    context = readContext(contextType);\n  } else {\n    unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    var contextTypes = ctor.contextTypes;\n    isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;\n    context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;\n  } // Instantiate twice to help detect side-effects.\n\n\n  {\n    if ( workInProgress.mode & StrictMode) {\n      new ctor(props, context); // eslint-disable-line no-new\n    }\n  }\n\n  var instance = new ctor(props, context);\n  var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;\n  adoptClassInstance(workInProgress, instance);\n\n  {\n    if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {\n      var componentName = getComponentName(ctor) || 'Component';\n\n      if (!didWarnAboutUninitializedState.has(componentName)) {\n        didWarnAboutUninitializedState.add(componentName);\n\n        error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);\n      }\n    } // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n    // Warn about these lifecycles if they are present.\n    // Don't warn about react-lifecycles-compat polyfilled methods though.\n\n\n    if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {\n      var foundWillMountName = null;\n      var foundWillReceivePropsName = null;\n      var foundWillUpdateName = null;\n\n      if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {\n        foundWillMountName = 'componentWillMount';\n      } else if (typeof instance.UNSAFE_componentWillMount === 'function') {\n        foundWillMountName = 'UNSAFE_componentWillMount';\n      }\n\n      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n        foundWillReceivePropsName = 'componentWillReceiveProps';\n      } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n        foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n      }\n\n      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n        foundWillUpdateName = 'componentWillUpdate';\n      } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n      }\n\n      if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {\n        var _componentName = getComponentName(ctor) || 'Component';\n\n        var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';\n\n        if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {\n          didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);\n\n          error('Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\\n\\n' + 'The above lifecycles should be removed. Learn more about this warning here:\\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? \"\\n  \" + foundWillMountName : '', foundWillReceivePropsName !== null ? \"\\n  \" + foundWillReceivePropsName : '', foundWillUpdateName !== null ? \"\\n  \" + foundWillUpdateName : '');\n        }\n      }\n    }\n  } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n  // ReactFiberContext usually updates this cache but can't for newly-created instances.\n\n\n  if (isLegacyContextConsumer) {\n    cacheContext(workInProgress, unmaskedContext, context);\n  }\n\n  return instance;\n}\n\nfunction callComponentWillMount(workInProgress, instance) {\n  startPhaseTimer(workInProgress, 'componentWillMount');\n  var oldState = instance.state;\n\n  if (typeof instance.componentWillMount === 'function') {\n    instance.componentWillMount();\n  }\n\n  if (typeof instance.UNSAFE_componentWillMount === 'function') {\n    instance.UNSAFE_componentWillMount();\n  }\n\n  stopPhaseTimer();\n\n  if (oldState !== instance.state) {\n    {\n      error('%s.componentWillMount(): Assigning directly to this.state is ' + \"deprecated (except inside a component's \" + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');\n    }\n\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n  }\n}\n\nfunction callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {\n  var oldState = instance.state;\n  startPhaseTimer(workInProgress, 'componentWillReceiveProps');\n\n  if (typeof instance.componentWillReceiveProps === 'function') {\n    instance.componentWillReceiveProps(newProps, nextContext);\n  }\n\n  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n  }\n\n  stopPhaseTimer();\n\n  if (instance.state !== oldState) {\n    {\n      var componentName = getComponentName(workInProgress.type) || 'Component';\n\n      if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {\n        didWarnAboutStateAssignmentForComponent.add(componentName);\n\n        error('%s.componentWillReceiveProps(): Assigning directly to ' + \"this.state is deprecated (except inside a component's \" + 'constructor). Use setState instead.', componentName);\n      }\n    }\n\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n  }\n} // Invokes the mount life-cycles on a previously never rendered instance.\n\n\nfunction mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n  {\n    checkClassInstance(workInProgress, ctor, newProps);\n  }\n\n  var instance = workInProgress.stateNode;\n  instance.props = newProps;\n  instance.state = workInProgress.memoizedState;\n  instance.refs = emptyRefsObject;\n  initializeUpdateQueue(workInProgress);\n  var contextType = ctor.contextType;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    instance.context = readContext(contextType);\n  } else {\n    var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    instance.context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  {\n    if (instance.state === newProps) {\n      var componentName = getComponentName(ctor) || 'Component';\n\n      if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {\n        didWarnAboutDirectlyAssigningPropsToState.add(componentName);\n\n        error('%s: It is not recommended to assign props directly to state ' + \"because updates to props won't be reflected in state. \" + 'In most cases, it is better to use props directly.', componentName);\n      }\n    }\n\n    if (workInProgress.mode & StrictMode) {\n      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);\n    }\n\n    {\n      ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);\n    }\n  }\n\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  instance.state = workInProgress.memoizedState;\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    instance.state = workInProgress.memoizedState;\n  } // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n\n  if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n    callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's\n    // process them now.\n\n    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n    instance.state = workInProgress.memoizedState;\n  }\n\n  if (typeof instance.componentDidMount === 'function') {\n    workInProgress.effectTag |= Update;\n  }\n}\n\nfunction resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n  var instance = workInProgress.stateNode;\n  var oldProps = workInProgress.memoizedProps;\n  instance.props = oldProps;\n  var oldContext = instance.context;\n  var contextType = ctor.contextType;\n  var nextContext = emptyContextObject;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    nextContext = readContext(contextType);\n  } else {\n    var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);\n  }\n\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n  // ever the previously attempted to render - not the \"current\". However,\n  // during componentDidUpdate we pass the \"current\" props.\n  // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n    if (oldProps !== newProps || oldContext !== nextContext) {\n      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n    }\n  }\n\n  resetHasForceUpdateBeforeProcessing();\n  var oldState = workInProgress.memoizedState;\n  var newState = instance.state = oldState;\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  newState = workInProgress.memoizedState;\n\n  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n\n    return false;\n  }\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    newState = workInProgress.memoizedState;\n  }\n\n  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n  if (shouldUpdate) {\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n      startPhaseTimer(workInProgress, 'componentWillMount');\n\n      if (typeof instance.componentWillMount === 'function') {\n        instance.componentWillMount();\n      }\n\n      if (typeof instance.UNSAFE_componentWillMount === 'function') {\n        instance.UNSAFE_componentWillMount();\n      }\n\n      stopPhaseTimer();\n    }\n\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n  } else {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    } // If shouldComponentUpdate returned false, we should still update the\n    // memoized state to indicate that this work can be reused.\n\n\n    workInProgress.memoizedProps = newProps;\n    workInProgress.memoizedState = newState;\n  } // Update the existing instance's state, props, and context pointers even\n  // if shouldComponentUpdate returns false.\n\n\n  instance.props = newProps;\n  instance.state = newState;\n  instance.context = nextContext;\n  return shouldUpdate;\n} // Invokes the update life-cycles and returns false if it shouldn't rerender.\n\n\nfunction updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {\n  var instance = workInProgress.stateNode;\n  cloneUpdateQueue(current, workInProgress);\n  var oldProps = workInProgress.memoizedProps;\n  instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);\n  var oldContext = instance.context;\n  var contextType = ctor.contextType;\n  var nextContext = emptyContextObject;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    nextContext = readContext(contextType);\n  } else {\n    var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);\n  }\n\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n  // ever the previously attempted to render - not the \"current\". However,\n  // during componentDidUpdate we pass the \"current\" props.\n  // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n    if (oldProps !== newProps || oldContext !== nextContext) {\n      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n    }\n  }\n\n  resetHasForceUpdateBeforeProcessing();\n  var oldState = workInProgress.memoizedState;\n  var newState = instance.state = oldState;\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  newState = workInProgress.memoizedState;\n\n  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Update;\n      }\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Snapshot;\n      }\n    }\n\n    return false;\n  }\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    newState = workInProgress.memoizedState;\n  }\n\n  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n  if (shouldUpdate) {\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {\n      startPhaseTimer(workInProgress, 'componentWillUpdate');\n\n      if (typeof instance.componentWillUpdate === 'function') {\n        instance.componentWillUpdate(newProps, newState, nextContext);\n      }\n\n      if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);\n      }\n\n      stopPhaseTimer();\n    }\n\n    if (typeof instance.componentDidUpdate === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      workInProgress.effectTag |= Snapshot;\n    }\n  } else {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Update;\n      }\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Snapshot;\n      }\n    } // If shouldComponentUpdate returned false, we should still update the\n    // memoized props/state to indicate that this work can be reused.\n\n\n    workInProgress.memoizedProps = newProps;\n    workInProgress.memoizedState = newState;\n  } // Update the existing instance's state, props, and context pointers even\n  // if shouldComponentUpdate returns false.\n\n\n  instance.props = newProps;\n  instance.state = newState;\n  instance.context = nextContext;\n  return shouldUpdate;\n}\n\nvar didWarnAboutMaps;\nvar didWarnAboutGenerators;\nvar didWarnAboutStringRefs;\nvar ownerHasKeyUseWarning;\nvar ownerHasFunctionTypeWarning;\n\nvar warnForMissingKey = function (child) {};\n\n{\n  didWarnAboutMaps = false;\n  didWarnAboutGenerators = false;\n  didWarnAboutStringRefs = {};\n  /**\n   * Warn if there's no key explicitly set on dynamic arrays of children or\n   * object keys are not valid. This allows us to keep track of children between\n   * updates.\n   */\n\n  ownerHasKeyUseWarning = {};\n  ownerHasFunctionTypeWarning = {};\n\n  warnForMissingKey = function (child) {\n    if (child === null || typeof child !== 'object') {\n      return;\n    }\n\n    if (!child._store || child._store.validated || child.key != null) {\n      return;\n    }\n\n    if (!(typeof child._store === 'object')) {\n      {\n        throw Error( \"React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    child._store.validated = true;\n    var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();\n\n    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasKeyUseWarning[currentComponentErrorInfo] = true;\n\n    error('Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.');\n  };\n}\n\nvar isArray$1 = Array.isArray;\n\nfunction coerceRef(returnFiber, current, element) {\n  var mixedRef = element.ref;\n\n  if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {\n    {\n      // TODO: Clean this up once we turn on the string ref warning for\n      // everyone, because the strict mode case will no longer be relevant\n      if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs\n      // because these cannot be automatically converted to an arrow function\n      // using a codemod. Therefore, we don't have to warn about string refs again.\n      !(element._owner && element._self && element._owner.stateNode !== element._self)) {\n        var componentName = getComponentName(returnFiber.type) || 'Component';\n\n        if (!didWarnAboutStringRefs[componentName]) {\n          {\n            error('A string ref, \"%s\", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber));\n          }\n\n          didWarnAboutStringRefs[componentName] = true;\n        }\n      }\n    }\n\n    if (element._owner) {\n      var owner = element._owner;\n      var inst;\n\n      if (owner) {\n        var ownerFiber = owner;\n\n        if (!(ownerFiber.tag === ClassComponent)) {\n          {\n            throw Error( \"Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref\" );\n          }\n        }\n\n        inst = ownerFiber.stateNode;\n      }\n\n      if (!inst) {\n        {\n          throw Error( \"Missing owner for string ref \" + mixedRef + \". This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref\n\n      if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {\n        return current.ref;\n      }\n\n      var ref = function (value) {\n        var refs = inst.refs;\n\n        if (refs === emptyRefsObject) {\n          // This is a lazy pooled frozen object, so we need to initialize.\n          refs = inst.refs = {};\n        }\n\n        if (value === null) {\n          delete refs[stringRef];\n        } else {\n          refs[stringRef] = value;\n        }\n      };\n\n      ref._stringRef = stringRef;\n      return ref;\n    } else {\n      if (!(typeof mixedRef === 'string')) {\n        {\n          throw Error( \"Expected ref to be a function, a string, an object returned by React.createRef(), or null.\" );\n        }\n      }\n\n      if (!element._owner) {\n        {\n          throw Error( \"Element ref was specified as a string (\" + mixedRef + \") but no owner was set. This could happen for one of the following reasons:\\n1. You may be adding a ref to a function component\\n2. You may be adding a ref to a component that was not created inside a component's render method\\n3. You have multiple copies of React loaded\\nSee https://fb.me/react-refs-must-have-owner for more information.\" );\n        }\n      }\n    }\n  }\n\n  return mixedRef;\n}\n\nfunction throwOnInvalidObjectType(returnFiber, newChild) {\n  if (returnFiber.type !== 'textarea') {\n    var addendum = '';\n\n    {\n      addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();\n    }\n\n    {\n      {\n        throw Error( \"Objects are not valid as a React child (found: \" + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + \").\" + addendum );\n      }\n    }\n  }\n}\n\nfunction warnOnFunctionType() {\n  {\n    var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();\n\n    if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;\n\n    error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');\n  }\n} // This wrapper function exists because I expect to clone the code in each path\n// to be able to optimize each path individually by branching early. This needs\n// a compiler or we can do it manually. Helpers that don't need this branching\n// live outside of this function.\n\n\nfunction ChildReconciler(shouldTrackSideEffects) {\n  function deleteChild(returnFiber, childToDelete) {\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return;\n    } // Deletions are added in reversed order so we add it to the front.\n    // At this point, the return fiber's effect list is empty except for\n    // deletions, so we can just append the deletion to the list. The remaining\n    // effects aren't added until the complete phase. Once we implement\n    // resuming, this may not be true.\n\n\n    var last = returnFiber.lastEffect;\n\n    if (last !== null) {\n      last.nextEffect = childToDelete;\n      returnFiber.lastEffect = childToDelete;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n    }\n\n    childToDelete.nextEffect = null;\n    childToDelete.effectTag = Deletion;\n  }\n\n  function deleteRemainingChildren(returnFiber, currentFirstChild) {\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return null;\n    } // TODO: For the shouldClone case, this could be micro-optimized a bit by\n    // assuming that after the first child we've already added everything.\n\n\n    var childToDelete = currentFirstChild;\n\n    while (childToDelete !== null) {\n      deleteChild(returnFiber, childToDelete);\n      childToDelete = childToDelete.sibling;\n    }\n\n    return null;\n  }\n\n  function mapRemainingChildren(returnFiber, currentFirstChild) {\n    // Add the remaining children to a temporary map so that we can find them by\n    // keys quickly. Implicit (null) keys get added to this set with their index\n    // instead.\n    var existingChildren = new Map();\n    var existingChild = currentFirstChild;\n\n    while (existingChild !== null) {\n      if (existingChild.key !== null) {\n        existingChildren.set(existingChild.key, existingChild);\n      } else {\n        existingChildren.set(existingChild.index, existingChild);\n      }\n\n      existingChild = existingChild.sibling;\n    }\n\n    return existingChildren;\n  }\n\n  function useFiber(fiber, pendingProps) {\n    // We currently set sibling to null and index to 0 here because it is easy\n    // to forget to do before returning it. E.g. for the single child case.\n    var clone = createWorkInProgress(fiber, pendingProps);\n    clone.index = 0;\n    clone.sibling = null;\n    return clone;\n  }\n\n  function placeChild(newFiber, lastPlacedIndex, newIndex) {\n    newFiber.index = newIndex;\n\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return lastPlacedIndex;\n    }\n\n    var current = newFiber.alternate;\n\n    if (current !== null) {\n      var oldIndex = current.index;\n\n      if (oldIndex < lastPlacedIndex) {\n        // This is a move.\n        newFiber.effectTag = Placement;\n        return lastPlacedIndex;\n      } else {\n        // This item can stay in place.\n        return oldIndex;\n      }\n    } else {\n      // This is an insertion.\n      newFiber.effectTag = Placement;\n      return lastPlacedIndex;\n    }\n  }\n\n  function placeSingleChild(newFiber) {\n    // This is simpler for the single child case. We only need to do a\n    // placement for inserting new children.\n    if (shouldTrackSideEffects && newFiber.alternate === null) {\n      newFiber.effectTag = Placement;\n    }\n\n    return newFiber;\n  }\n\n  function updateTextNode(returnFiber, current, textContent, expirationTime) {\n    if (current === null || current.tag !== HostText) {\n      // Insert\n      var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, textContent);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function updateElement(returnFiber, current, element, expirationTime) {\n    if (current !== null) {\n      if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n       isCompatibleFamilyForHotReloading(current, element) )) {\n        // Move based on index\n        var existing = useFiber(current, element.props);\n        existing.ref = coerceRef(returnFiber, current, element);\n        existing.return = returnFiber;\n\n        {\n          existing._debugSource = element._source;\n          existing._debugOwner = element._owner;\n        }\n\n        return existing;\n      }\n    } // Insert\n\n\n    var created = createFiberFromElement(element, returnFiber.mode, expirationTime);\n    created.ref = coerceRef(returnFiber, current, element);\n    created.return = returnFiber;\n    return created;\n  }\n\n  function updatePortal(returnFiber, current, portal, expirationTime) {\n    if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {\n      // Insert\n      var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, portal.children || []);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function updateFragment(returnFiber, current, fragment, expirationTime, key) {\n    if (current === null || current.tag !== Fragment) {\n      // Insert\n      var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, fragment);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function createChild(returnFiber, newChild, expirationTime) {\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys. If the previous node is implicitly keyed\n      // we can continue to replace it without aborting even if it is not a text\n      // node.\n      var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);\n\n            _created.ref = coerceRef(returnFiber, null, newChild);\n            _created.return = returnFiber;\n            return _created;\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);\n\n            _created2.return = returnFiber;\n            return _created2;\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);\n\n        _created3.return = returnFiber;\n        return _created3;\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n\n  function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {\n    // Update the fiber if the keys match, otherwise return null.\n    var key = oldFiber !== null ? oldFiber.key : null;\n\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys. If the previous node is implicitly keyed\n      // we can continue to replace it without aborting even if it is not a text\n      // node.\n      if (key !== null) {\n        return null;\n      }\n\n      return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            if (newChild.key === key) {\n              if (newChild.type === REACT_FRAGMENT_TYPE) {\n                return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);\n              }\n\n              return updateElement(returnFiber, oldFiber, newChild, expirationTime);\n            } else {\n              return null;\n            }\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            if (newChild.key === key) {\n              return updatePortal(returnFiber, oldFiber, newChild, expirationTime);\n            } else {\n              return null;\n            }\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        if (key !== null) {\n          return null;\n        }\n\n        return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n\n  function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys, so we neither have to check the old nor\n      // new node for the key. If both are text nodes, they match.\n      var matchedFiber = existingChildren.get(newIdx) || null;\n      return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n            if (newChild.type === REACT_FRAGMENT_TYPE) {\n              return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);\n            }\n\n            return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n            return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        var _matchedFiber3 = existingChildren.get(newIdx) || null;\n\n        return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n  /**\n   * Warns if there is a duplicate or missing key\n   */\n\n\n  function warnOnInvalidKey(child, knownKeys) {\n    {\n      if (typeof child !== 'object' || child === null) {\n        return knownKeys;\n      }\n\n      switch (child.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n        case REACT_PORTAL_TYPE:\n          warnForMissingKey(child);\n          var key = child.key;\n\n          if (typeof key !== 'string') {\n            break;\n          }\n\n          if (knownKeys === null) {\n            knownKeys = new Set();\n            knownKeys.add(key);\n            break;\n          }\n\n          if (!knownKeys.has(key)) {\n            knownKeys.add(key);\n            break;\n          }\n\n          error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);\n\n          break;\n      }\n    }\n\n    return knownKeys;\n  }\n\n  function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {\n    // This algorithm can't optimize by searching from both ends since we\n    // don't have backpointers on fibers. I'm trying to see how far we can get\n    // with that model. If it ends up not being worth the tradeoffs, we can\n    // add it later.\n    // Even with a two ended optimization, we'd want to optimize for the case\n    // where there are few changes and brute force the comparison instead of\n    // going for the Map. It'd like to explore hitting that path first in\n    // forward-only mode and only go for the Map once we notice that we need\n    // lots of look ahead. This doesn't handle reversal as well as two ended\n    // search but that's unusual. Besides, for the two ended optimization to\n    // work on Iterables, we'd need to copy the whole set.\n    // In this first iteration, we'll just live with hitting the bad case\n    // (adding everything to a Map) in for every insert/move.\n    // If you change this code, also update reconcileChildrenIterator() which\n    // uses the same algorithm.\n    {\n      // First, validate keys.\n      var knownKeys = null;\n\n      for (var i = 0; i < newChildren.length; i++) {\n        var child = newChildren[i];\n        knownKeys = warnOnInvalidKey(child, knownKeys);\n      }\n    }\n\n    var resultingFirstChild = null;\n    var previousNewFiber = null;\n    var oldFiber = currentFirstChild;\n    var lastPlacedIndex = 0;\n    var newIdx = 0;\n    var nextOldFiber = null;\n\n    for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {\n      if (oldFiber.index > newIdx) {\n        nextOldFiber = oldFiber;\n        oldFiber = null;\n      } else {\n        nextOldFiber = oldFiber.sibling;\n      }\n\n      var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);\n\n      if (newFiber === null) {\n        // TODO: This breaks on empty slots like null children. That's\n        // unfortunate because it triggers the slow path all the time. We need\n        // a better way to communicate whether this was a miss or null,\n        // boolean, undefined, etc.\n        if (oldFiber === null) {\n          oldFiber = nextOldFiber;\n        }\n\n        break;\n      }\n\n      if (shouldTrackSideEffects) {\n        if (oldFiber && newFiber.alternate === null) {\n          // We matched the slot, but we didn't reuse the existing fiber, so we\n          // need to delete the existing child.\n          deleteChild(returnFiber, oldFiber);\n        }\n      }\n\n      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n      if (previousNewFiber === null) {\n        // TODO: Move out of the loop. This only happens for the first run.\n        resultingFirstChild = newFiber;\n      } else {\n        // TODO: Defer siblings if we're not at the right index for this slot.\n        // I.e. if we had null values before, then we want to defer this\n        // for each null value. However, we also don't want to call updateSlot\n        // with the previous one.\n        previousNewFiber.sibling = newFiber;\n      }\n\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n\n    if (newIdx === newChildren.length) {\n      // We've reached the end of the new children. We can delete the rest.\n      deleteRemainingChildren(returnFiber, oldFiber);\n      return resultingFirstChild;\n    }\n\n    if (oldFiber === null) {\n      // If we don't have any more existing children we can choose a fast path\n      // since the rest will all be insertions.\n      for (; newIdx < newChildren.length; newIdx++) {\n        var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);\n\n        if (_newFiber === null) {\n          continue;\n        }\n\n        lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = _newFiber;\n        } else {\n          previousNewFiber.sibling = _newFiber;\n        }\n\n        previousNewFiber = _newFiber;\n      }\n\n      return resultingFirstChild;\n    } // Add all children to a key map for quick lookups.\n\n\n    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n    for (; newIdx < newChildren.length; newIdx++) {\n      var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);\n\n      if (_newFiber2 !== null) {\n        if (shouldTrackSideEffects) {\n          if (_newFiber2.alternate !== null) {\n            // The new fiber is a work in progress, but if there exists a\n            // current, that means that we reused the fiber. We need to delete\n            // it from the child list so that we don't add it to the deletion\n            // list.\n            existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);\n          }\n        }\n\n        lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          resultingFirstChild = _newFiber2;\n        } else {\n          previousNewFiber.sibling = _newFiber2;\n        }\n\n        previousNewFiber = _newFiber2;\n      }\n    }\n\n    if (shouldTrackSideEffects) {\n      // Any existing children that weren't consumed above were deleted. We need\n      // to add them to the deletion list.\n      existingChildren.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    }\n\n    return resultingFirstChild;\n  }\n\n  function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {\n    // This is the same implementation as reconcileChildrenArray(),\n    // but using the iterator instead.\n    var iteratorFn = getIteratorFn(newChildrenIterable);\n\n    if (!(typeof iteratorFn === 'function')) {\n      {\n        throw Error( \"An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    {\n      // We don't support rendering Generators because it's a mutation.\n      // See https://github.com/facebook/react/issues/12995\n      if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag\n      newChildrenIterable[Symbol.toStringTag] === 'Generator') {\n        if (!didWarnAboutGenerators) {\n          error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');\n        }\n\n        didWarnAboutGenerators = true;\n      } // Warn about using Maps as children\n\n\n      if (newChildrenIterable.entries === iteratorFn) {\n        if (!didWarnAboutMaps) {\n          error('Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.');\n        }\n\n        didWarnAboutMaps = true;\n      } // First, validate keys.\n      // We'll get a different iterator later for the main pass.\n\n\n      var _newChildren = iteratorFn.call(newChildrenIterable);\n\n      if (_newChildren) {\n        var knownKeys = null;\n\n        var _step = _newChildren.next();\n\n        for (; !_step.done; _step = _newChildren.next()) {\n          var child = _step.value;\n          knownKeys = warnOnInvalidKey(child, knownKeys);\n        }\n      }\n    }\n\n    var newChildren = iteratorFn.call(newChildrenIterable);\n\n    if (!(newChildren != null)) {\n      {\n        throw Error( \"An iterable object provided no iterator.\" );\n      }\n    }\n\n    var resultingFirstChild = null;\n    var previousNewFiber = null;\n    var oldFiber = currentFirstChild;\n    var lastPlacedIndex = 0;\n    var newIdx = 0;\n    var nextOldFiber = null;\n    var step = newChildren.next();\n\n    for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {\n      if (oldFiber.index > newIdx) {\n        nextOldFiber = oldFiber;\n        oldFiber = null;\n      } else {\n        nextOldFiber = oldFiber.sibling;\n      }\n\n      var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);\n\n      if (newFiber === null) {\n        // TODO: This breaks on empty slots like null children. That's\n        // unfortunate because it triggers the slow path all the time. We need\n        // a better way to communicate whether this was a miss or null,\n        // boolean, undefined, etc.\n        if (oldFiber === null) {\n          oldFiber = nextOldFiber;\n        }\n\n        break;\n      }\n\n      if (shouldTrackSideEffects) {\n        if (oldFiber && newFiber.alternate === null) {\n          // We matched the slot, but we didn't reuse the existing fiber, so we\n          // need to delete the existing child.\n          deleteChild(returnFiber, oldFiber);\n        }\n      }\n\n      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n      if (previousNewFiber === null) {\n        // TODO: Move out of the loop. This only happens for the first run.\n        resultingFirstChild = newFiber;\n      } else {\n        // TODO: Defer siblings if we're not at the right index for this slot.\n        // I.e. if we had null values before, then we want to defer this\n        // for each null value. However, we also don't want to call updateSlot\n        // with the previous one.\n        previousNewFiber.sibling = newFiber;\n      }\n\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n\n    if (step.done) {\n      // We've reached the end of the new children. We can delete the rest.\n      deleteRemainingChildren(returnFiber, oldFiber);\n      return resultingFirstChild;\n    }\n\n    if (oldFiber === null) {\n      // If we don't have any more existing children we can choose a fast path\n      // since the rest will all be insertions.\n      for (; !step.done; newIdx++, step = newChildren.next()) {\n        var _newFiber3 = createChild(returnFiber, step.value, expirationTime);\n\n        if (_newFiber3 === null) {\n          continue;\n        }\n\n        lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = _newFiber3;\n        } else {\n          previousNewFiber.sibling = _newFiber3;\n        }\n\n        previousNewFiber = _newFiber3;\n      }\n\n      return resultingFirstChild;\n    } // Add all children to a key map for quick lookups.\n\n\n    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n    for (; !step.done; newIdx++, step = newChildren.next()) {\n      var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);\n\n      if (_newFiber4 !== null) {\n        if (shouldTrackSideEffects) {\n          if (_newFiber4.alternate !== null) {\n            // The new fiber is a work in progress, but if there exists a\n            // current, that means that we reused the fiber. We need to delete\n            // it from the child list so that we don't add it to the deletion\n            // list.\n            existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);\n          }\n        }\n\n        lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          resultingFirstChild = _newFiber4;\n        } else {\n          previousNewFiber.sibling = _newFiber4;\n        }\n\n        previousNewFiber = _newFiber4;\n      }\n    }\n\n    if (shouldTrackSideEffects) {\n      // Any existing children that weren't consumed above were deleted. We need\n      // to add them to the deletion list.\n      existingChildren.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    }\n\n    return resultingFirstChild;\n  }\n\n  function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {\n    // There's no need to check for keys on text nodes since we don't have a\n    // way to define them.\n    if (currentFirstChild !== null && currentFirstChild.tag === HostText) {\n      // We already have an existing node so let's just update it and delete\n      // the rest.\n      deleteRemainingChildren(returnFiber, currentFirstChild.sibling);\n      var existing = useFiber(currentFirstChild, textContent);\n      existing.return = returnFiber;\n      return existing;\n    } // The existing first child is not a text node so we need to create one\n    // and delete the existing ones.\n\n\n    deleteRemainingChildren(returnFiber, currentFirstChild);\n    var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n    created.return = returnFiber;\n    return created;\n  }\n\n  function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {\n    var key = element.key;\n    var child = currentFirstChild;\n\n    while (child !== null) {\n      // TODO: If key === null and child.key === null, then this only applies to\n      // the first item in the list.\n      if (child.key === key) {\n        switch (child.tag) {\n          case Fragment:\n            {\n              if (element.type === REACT_FRAGMENT_TYPE) {\n                deleteRemainingChildren(returnFiber, child.sibling);\n                var existing = useFiber(child, element.props.children);\n                existing.return = returnFiber;\n\n                {\n                  existing._debugSource = element._source;\n                  existing._debugOwner = element._owner;\n                }\n\n                return existing;\n              }\n\n              break;\n            }\n\n          case Block:\n\n          // We intentionally fallthrough here if enableBlocksAPI is not on.\n          // eslint-disable-next-lined no-fallthrough\n\n          default:\n            {\n              if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n               isCompatibleFamilyForHotReloading(child, element) )) {\n                deleteRemainingChildren(returnFiber, child.sibling);\n\n                var _existing3 = useFiber(child, element.props);\n\n                _existing3.ref = coerceRef(returnFiber, child, element);\n                _existing3.return = returnFiber;\n\n                {\n                  _existing3._debugSource = element._source;\n                  _existing3._debugOwner = element._owner;\n                }\n\n                return _existing3;\n              }\n\n              break;\n            }\n        } // Didn't match.\n\n\n        deleteRemainingChildren(returnFiber, child);\n        break;\n      } else {\n        deleteChild(returnFiber, child);\n      }\n\n      child = child.sibling;\n    }\n\n    if (element.type === REACT_FRAGMENT_TYPE) {\n      var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);\n      created.return = returnFiber;\n      return created;\n    } else {\n      var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);\n\n      _created4.ref = coerceRef(returnFiber, currentFirstChild, element);\n      _created4.return = returnFiber;\n      return _created4;\n    }\n  }\n\n  function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {\n    var key = portal.key;\n    var child = currentFirstChild;\n\n    while (child !== null) {\n      // TODO: If key === null and child.key === null, then this only applies to\n      // the first item in the list.\n      if (child.key === key) {\n        if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {\n          deleteRemainingChildren(returnFiber, child.sibling);\n          var existing = useFiber(child, portal.children || []);\n          existing.return = returnFiber;\n          return existing;\n        } else {\n          deleteRemainingChildren(returnFiber, child);\n          break;\n        }\n      } else {\n        deleteChild(returnFiber, child);\n      }\n\n      child = child.sibling;\n    }\n\n    var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n    created.return = returnFiber;\n    return created;\n  } // This API will tag the children with the side-effect of the reconciliation\n  // itself. They will be added to the side-effect list as we pass through the\n  // children and the parent.\n\n\n  function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {\n    // This function is not recursive.\n    // If the top level item is an array, we treat it as a set of children,\n    // not as a fragment. Nested arrays on the other hand will be treated as\n    // fragment nodes. Recursion happens at the normal flow.\n    // Handle top level unkeyed fragments as if they were arrays.\n    // This leads to an ambiguity between <>{[...]}</> and <>...</>.\n    // We treat the ambiguous cases above the same.\n    var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;\n\n    if (isUnkeyedTopLevelFragment) {\n      newChild = newChild.props.children;\n    } // Handle object types\n\n\n    var isObject = typeof newChild === 'object' && newChild !== null;\n\n    if (isObject) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));\n\n        case REACT_PORTAL_TYPE:\n          return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));\n      }\n    }\n\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));\n    }\n\n    if (isArray$1(newChild)) {\n      return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);\n    }\n\n    if (getIteratorFn(newChild)) {\n      return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);\n    }\n\n    if (isObject) {\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {\n      // If the new child is undefined, and the return fiber is a composite\n      // component, throw an error. If Fiber return types are disabled,\n      // we already threw above.\n      switch (returnFiber.tag) {\n        case ClassComponent:\n          {\n            {\n              var instance = returnFiber.stateNode;\n\n              if (instance.render._isMockFunction) {\n                // We allow auto-mocks to proceed as if they're returning null.\n                break;\n              }\n            }\n          }\n        // Intentionally fall through to the next case, which handles both\n        // functions and classes\n        // eslint-disable-next-lined no-fallthrough\n\n        case FunctionComponent:\n          {\n            var Component = returnFiber.type;\n\n            {\n              {\n                throw Error( (Component.displayName || Component.name || 'Component') + \"(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.\" );\n              }\n            }\n          }\n      }\n    } // Remaining cases are all treated as empty.\n\n\n    return deleteRemainingChildren(returnFiber, currentFirstChild);\n  }\n\n  return reconcileChildFibers;\n}\n\nvar reconcileChildFibers = ChildReconciler(true);\nvar mountChildFibers = ChildReconciler(false);\nfunction cloneChildFibers(current, workInProgress) {\n  if (!(current === null || workInProgress.child === current.child)) {\n    {\n      throw Error( \"Resuming work not yet implemented.\" );\n    }\n  }\n\n  if (workInProgress.child === null) {\n    return;\n  }\n\n  var currentChild = workInProgress.child;\n  var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);\n  workInProgress.child = newChild;\n  newChild.return = workInProgress;\n\n  while (currentChild.sibling !== null) {\n    currentChild = currentChild.sibling;\n    newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);\n    newChild.return = workInProgress;\n  }\n\n  newChild.sibling = null;\n} // Reset a workInProgress child set to prepare it for a second pass.\n\nfunction resetChildFibers(workInProgress, renderExpirationTime) {\n  var child = workInProgress.child;\n\n  while (child !== null) {\n    resetWorkInProgress(child, renderExpirationTime);\n    child = child.sibling;\n  }\n}\n\nvar NO_CONTEXT = {};\nvar contextStackCursor$1 = createCursor(NO_CONTEXT);\nvar contextFiberStackCursor = createCursor(NO_CONTEXT);\nvar rootInstanceStackCursor = createCursor(NO_CONTEXT);\n\nfunction requiredContext(c) {\n  if (!(c !== NO_CONTEXT)) {\n    {\n      throw Error( \"Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  return c;\n}\n\nfunction getRootHostContainer() {\n  var rootInstance = requiredContext(rootInstanceStackCursor.current);\n  return rootInstance;\n}\n\nfunction pushHostContainer(fiber, nextRootInstance) {\n  // Push current root instance onto the stack;\n  // This allows us to reset root when portals are popped.\n  push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.\n  // This enables us to pop only Fibers that provide unique contexts.\n\n  push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.\n  // However, we can't just call getRootHostContext() and push it because\n  // we'd have a different number of entries on the stack depending on\n  // whether getRootHostContext() throws somewhere in renderer code or not.\n  // So we push an empty value first. This lets us safely unwind on errors.\n\n  push(contextStackCursor$1, NO_CONTEXT, fiber);\n  var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.\n\n  pop(contextStackCursor$1, fiber);\n  push(contextStackCursor$1, nextRootContext, fiber);\n}\n\nfunction popHostContainer(fiber) {\n  pop(contextStackCursor$1, fiber);\n  pop(contextFiberStackCursor, fiber);\n  pop(rootInstanceStackCursor, fiber);\n}\n\nfunction getHostContext() {\n  var context = requiredContext(contextStackCursor$1.current);\n  return context;\n}\n\nfunction pushHostContext(fiber) {\n  var rootInstance = requiredContext(rootInstanceStackCursor.current);\n  var context = requiredContext(contextStackCursor$1.current);\n  var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.\n\n  if (context === nextContext) {\n    return;\n  } // Track the context and the Fiber that provided it.\n  // This enables us to pop only Fibers that provide unique contexts.\n\n\n  push(contextFiberStackCursor, fiber, fiber);\n  push(contextStackCursor$1, nextContext, fiber);\n}\n\nfunction popHostContext(fiber) {\n  // Do not pop unless this Fiber provided the current context.\n  // pushHostContext() only pushes Fibers that provide unique contexts.\n  if (contextFiberStackCursor.current !== fiber) {\n    return;\n  }\n\n  pop(contextStackCursor$1, fiber);\n  pop(contextFiberStackCursor, fiber);\n}\n\nvar DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is\n// inherited deeply down the subtree. The upper bits only affect\n// this immediate suspense boundary and gets reset each new\n// boundary or suspense list.\n\nvar SubtreeSuspenseContextMask = 1; // Subtree Flags:\n// InvisibleParentSuspenseContext indicates that one of our parent Suspense\n// boundaries is not currently showing visible main content.\n// Either because it is already showing a fallback or is not mounted at all.\n// We can use this to determine if it is desirable to trigger a fallback at\n// the parent. If not, then we might need to trigger undesirable boundaries\n// and/or suspend the commit to avoid hiding the parent content.\n\nvar InvisibleParentSuspenseContext = 1; // Shallow Flags:\n// ForceSuspenseFallback can be used by SuspenseList to force newly added\n// items into their fallback state during one of the render passes.\n\nvar ForceSuspenseFallback = 2;\nvar suspenseStackCursor = createCursor(DefaultSuspenseContext);\nfunction hasSuspenseContext(parentContext, flag) {\n  return (parentContext & flag) !== 0;\n}\nfunction setDefaultShallowSuspenseContext(parentContext) {\n  return parentContext & SubtreeSuspenseContextMask;\n}\nfunction setShallowSuspenseContext(parentContext, shallowContext) {\n  return parentContext & SubtreeSuspenseContextMask | shallowContext;\n}\nfunction addSubtreeSuspenseContext(parentContext, subtreeContext) {\n  return parentContext | subtreeContext;\n}\nfunction pushSuspenseContext(fiber, newContext) {\n  push(suspenseStackCursor, newContext, fiber);\n}\nfunction popSuspenseContext(fiber) {\n  pop(suspenseStackCursor, fiber);\n}\n\nfunction shouldCaptureSuspense(workInProgress, hasInvisibleParent) {\n  // If it was the primary children that just suspended, capture and render the\n  // fallback. Otherwise, don't capture and bubble to the next boundary.\n  var nextState = workInProgress.memoizedState;\n\n  if (nextState !== null) {\n    if (nextState.dehydrated !== null) {\n      // A dehydrated boundary always captures.\n      return true;\n    }\n\n    return false;\n  }\n\n  var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop.\n\n  if (props.fallback === undefined) {\n    return false;\n  } // Regular boundaries always capture.\n\n\n  if (props.unstable_avoidThisFallback !== true) {\n    return true;\n  } // If it's a boundary we should avoid, then we prefer to bubble up to the\n  // parent boundary if it is currently invisible.\n\n\n  if (hasInvisibleParent) {\n    return false;\n  } // If the parent is not able to handle it, we must handle it.\n\n\n  return true;\n}\nfunction findFirstSuspended(row) {\n  var node = row;\n\n  while (node !== null) {\n    if (node.tag === SuspenseComponent) {\n      var state = node.memoizedState;\n\n      if (state !== null) {\n        var dehydrated = state.dehydrated;\n\n        if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {\n          return node;\n        }\n      }\n    } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't\n    // keep track of whether it suspended or not.\n    node.memoizedProps.revealOrder !== undefined) {\n      var didSuspend = (node.effectTag & DidCapture) !== NoEffect;\n\n      if (didSuspend) {\n        return node;\n      }\n    } else if (node.child !== null) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === row) {\n      return null;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === row) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n\n  return null;\n}\n\nfunction createDeprecatedResponderListener(responder, props) {\n  var eventResponderListener = {\n    responder: responder,\n    props: props\n  };\n\n  {\n    Object.freeze(eventResponderListener);\n  }\n\n  return eventResponderListener;\n}\n\nvar HasEffect =\n/* */\n1; // Represents the phase in which the effect (not the clean-up) fires.\n\nvar Layout =\n/*    */\n2;\nvar Passive$1 =\n/*   */\n4;\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher,\n    ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;\nvar didWarnAboutMismatchedHooksForComponent;\n\n{\n  didWarnAboutMismatchedHooksForComponent = new Set();\n}\n\n// These are set right before calling the component.\nvar renderExpirationTime = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from\n// the work-in-progress hook.\n\nvar currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The\n// current hook list is the list that belongs to the current fiber. The\n// work-in-progress hook list is a new list that will be added to the\n// work-in-progress fiber.\n\nvar currentHook = null;\nvar workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This\n// does not get reset if we do another render pass; only when we're completely\n// finished evaluating this component. This is an optimization so we know\n// whether we need to clear render phase updates after a throw.\n\nvar didScheduleRenderPhaseUpdate = false;\nvar RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook\n\nvar currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.\n// The list stores the order of hooks used during the initial render (mount).\n// Subsequent renders (updates) reference this list.\n\nvar hookTypesDev = null;\nvar hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore\n// the dependencies for Hooks that need them (e.g. useEffect or useMemo).\n// When true, such Hooks will always be \"remounted\". Only used during hot reload.\n\nvar ignorePreviousDependencies = false;\n\nfunction mountHookTypesDev() {\n  {\n    var hookName = currentHookNameInDev;\n\n    if (hookTypesDev === null) {\n      hookTypesDev = [hookName];\n    } else {\n      hookTypesDev.push(hookName);\n    }\n  }\n}\n\nfunction updateHookTypesDev() {\n  {\n    var hookName = currentHookNameInDev;\n\n    if (hookTypesDev !== null) {\n      hookTypesUpdateIndexDev++;\n\n      if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {\n        warnOnHookMismatchInDev(hookName);\n      }\n    }\n  }\n}\n\nfunction checkDepsAreArrayDev(deps) {\n  {\n    if (deps !== undefined && deps !== null && !Array.isArray(deps)) {\n      // Verify deps, but only on mount to avoid extra checks.\n      // It's unlikely their type would change as usually you define them inline.\n      error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);\n    }\n  }\n}\n\nfunction warnOnHookMismatchInDev(currentHookName) {\n  {\n    var componentName = getComponentName(currentlyRenderingFiber$1.type);\n\n    if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {\n      didWarnAboutMismatchedHooksForComponent.add(componentName);\n\n      if (hookTypesDev !== null) {\n        var table = '';\n        var secondColumnStart = 30;\n\n        for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {\n          var oldHookName = hookTypesDev[i];\n          var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;\n          var row = i + 1 + \". \" + oldHookName; // Extra space so second column lines up\n          // lol @ IE not supporting String#repeat\n\n          while (row.length < secondColumnStart) {\n            row += ' ';\n          }\n\n          row += newHookName + '\\n';\n          table += row;\n        }\n\n        error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\\n\\n' + '   Previous render            Next render\\n' + '   ------------------------------------------------------\\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\n', componentName, table);\n      }\n    }\n  }\n}\n\nfunction throwInvalidHookError() {\n  {\n    {\n      throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n    }\n  }\n}\n\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n  {\n    if (ignorePreviousDependencies) {\n      // Only true when this component is being hot reloaded.\n      return false;\n    }\n  }\n\n  if (prevDeps === null) {\n    {\n      error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);\n    }\n\n    return false;\n  }\n\n  {\n    // Don't bother comparing lengths in prod because these arrays should be\n    // passed inline.\n    if (nextDeps.length !== prevDeps.length) {\n      error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\\n\\n' + 'Previous: %s\\n' + 'Incoming: %s', currentHookNameInDev, \"[\" + prevDeps.join(', ') + \"]\", \"[\" + nextDeps.join(', ') + \"]\");\n    }\n  }\n\n  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {\n    if (objectIs(nextDeps[i], prevDeps[i])) {\n      continue;\n    }\n\n    return false;\n  }\n\n  return true;\n}\n\nfunction renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderExpirationTime) {\n  renderExpirationTime = nextRenderExpirationTime;\n  currentlyRenderingFiber$1 = workInProgress;\n\n  {\n    hookTypesDev = current !== null ? current._debugHookTypes : null;\n    hookTypesUpdateIndexDev = -1; // Used for hot reloading:\n\n    ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;\n  }\n\n  workInProgress.memoizedState = null;\n  workInProgress.updateQueue = null;\n  workInProgress.expirationTime = NoWork; // The following should have already been reset\n  // currentHook = null;\n  // workInProgressHook = null;\n  // didScheduleRenderPhaseUpdate = false;\n  // TODO Warn if no hooks are used at all during mount, then some are used during update.\n  // Currently we will identify the update render as a mount because memoizedState === null.\n  // This is tricky because it's valid for certain types of components (e.g. React.lazy)\n  // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.\n  // Non-stateful hooks (e.g. context) don't get added to memoizedState,\n  // so memoizedState would be null during updates and mounts.\n\n  {\n    if (current !== null && current.memoizedState !== null) {\n      ReactCurrentDispatcher.current = HooksDispatcherOnUpdateInDEV;\n    } else if (hookTypesDev !== null) {\n      // This dispatcher handles an edge case where a component is updating,\n      // but no stateful hooks have been used.\n      // We want to match the production code behavior (which will use HooksDispatcherOnMount),\n      // but with the extra DEV validation to ensure hooks ordering hasn't changed.\n      // This dispatcher does that.\n      ReactCurrentDispatcher.current = HooksDispatcherOnMountWithHookTypesInDEV;\n    } else {\n      ReactCurrentDispatcher.current = HooksDispatcherOnMountInDEV;\n    }\n  }\n\n  var children = Component(props, secondArg); // Check if there was a render phase update\n\n  if (workInProgress.expirationTime === renderExpirationTime) {\n    // Keep rendering in a loop for as long as render phase updates continue to\n    // be scheduled. Use a counter to prevent infinite loops.\n    var numberOfReRenders = 0;\n\n    do {\n      workInProgress.expirationTime = NoWork;\n\n      if (!(numberOfReRenders < RE_RENDER_LIMIT)) {\n        {\n          throw Error( \"Too many re-renders. React limits the number of renders to prevent an infinite loop.\" );\n        }\n      }\n\n      numberOfReRenders += 1;\n\n      {\n        // Even when hot reloading, allow dependencies to stabilize\n        // after first render to prevent infinite render phase updates.\n        ignorePreviousDependencies = false;\n      } // Start over from the beginning of the list\n\n\n      currentHook = null;\n      workInProgressHook = null;\n      workInProgress.updateQueue = null;\n\n      {\n        // Also validate hook order for cascading updates.\n        hookTypesUpdateIndexDev = -1;\n      }\n\n      ReactCurrentDispatcher.current =  HooksDispatcherOnRerenderInDEV ;\n      children = Component(props, secondArg);\n    } while (workInProgress.expirationTime === renderExpirationTime);\n  } // We can assume the previous dispatcher is always this one, since we set it\n  // at the beginning of the render phase and there's no re-entrancy.\n\n\n  ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n  {\n    workInProgress._debugHookTypes = hookTypesDev;\n  } // This check uses currentHook so that it works the same in DEV and prod bundles.\n  // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.\n\n\n  var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;\n  renderExpirationTime = NoWork;\n  currentlyRenderingFiber$1 = null;\n  currentHook = null;\n  workInProgressHook = null;\n\n  {\n    currentHookNameInDev = null;\n    hookTypesDev = null;\n    hookTypesUpdateIndexDev = -1;\n  }\n\n  didScheduleRenderPhaseUpdate = false;\n\n  if (!!didRenderTooFewHooks) {\n    {\n      throw Error( \"Rendered fewer hooks than expected. This may be caused by an accidental early return statement.\" );\n    }\n  }\n\n  return children;\n}\nfunction bailoutHooks(current, workInProgress, expirationTime) {\n  workInProgress.updateQueue = current.updateQueue;\n  workInProgress.effectTag &= ~(Passive | Update);\n\n  if (current.expirationTime <= expirationTime) {\n    current.expirationTime = NoWork;\n  }\n}\nfunction resetHooksAfterThrow() {\n  // We can assume the previous dispatcher is always this one, since we set it\n  // at the beginning of the render phase and there's no re-entrancy.\n  ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n  if (didScheduleRenderPhaseUpdate) {\n    // There were render phase updates. These are only valid for this render\n    // phase, which we are now aborting. Remove the updates from the queues so\n    // they do not persist to the next render. Do not remove updates from hooks\n    // that weren't processed.\n    //\n    // Only reset the updates from the queue if it has a clone. If it does\n    // not have a clone, that means it wasn't processed, and the updates were\n    // scheduled before we entered the render phase.\n    var hook = currentlyRenderingFiber$1.memoizedState;\n\n    while (hook !== null) {\n      var queue = hook.queue;\n\n      if (queue !== null) {\n        queue.pending = null;\n      }\n\n      hook = hook.next;\n    }\n  }\n\n  renderExpirationTime = NoWork;\n  currentlyRenderingFiber$1 = null;\n  currentHook = null;\n  workInProgressHook = null;\n\n  {\n    hookTypesDev = null;\n    hookTypesUpdateIndexDev = -1;\n    currentHookNameInDev = null;\n  }\n\n  didScheduleRenderPhaseUpdate = false;\n}\n\nfunction mountWorkInProgressHook() {\n  var hook = {\n    memoizedState: null,\n    baseState: null,\n    baseQueue: null,\n    queue: null,\n    next: null\n  };\n\n  if (workInProgressHook === null) {\n    // This is the first hook in the list\n    currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;\n  } else {\n    // Append to the end of the list\n    workInProgressHook = workInProgressHook.next = hook;\n  }\n\n  return workInProgressHook;\n}\n\nfunction updateWorkInProgressHook() {\n  // This function is used both for updates and for re-renders triggered by a\n  // render phase update. It assumes there is either a current hook we can\n  // clone, or a work-in-progress hook from a previous render pass that we can\n  // use as a base. When we reach the end of the base list, we must switch to\n  // the dispatcher used for mounts.\n  var nextCurrentHook;\n\n  if (currentHook === null) {\n    var current = currentlyRenderingFiber$1.alternate;\n\n    if (current !== null) {\n      nextCurrentHook = current.memoizedState;\n    } else {\n      nextCurrentHook = null;\n    }\n  } else {\n    nextCurrentHook = currentHook.next;\n  }\n\n  var nextWorkInProgressHook;\n\n  if (workInProgressHook === null) {\n    nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;\n  } else {\n    nextWorkInProgressHook = workInProgressHook.next;\n  }\n\n  if (nextWorkInProgressHook !== null) {\n    // There's already a work-in-progress. Reuse it.\n    workInProgressHook = nextWorkInProgressHook;\n    nextWorkInProgressHook = workInProgressHook.next;\n    currentHook = nextCurrentHook;\n  } else {\n    // Clone from the current hook.\n    if (!(nextCurrentHook !== null)) {\n      {\n        throw Error( \"Rendered more hooks than during the previous render.\" );\n      }\n    }\n\n    currentHook = nextCurrentHook;\n    var newHook = {\n      memoizedState: currentHook.memoizedState,\n      baseState: currentHook.baseState,\n      baseQueue: currentHook.baseQueue,\n      queue: currentHook.queue,\n      next: null\n    };\n\n    if (workInProgressHook === null) {\n      // This is the first hook in the list.\n      currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;\n    } else {\n      // Append to the end of the list.\n      workInProgressHook = workInProgressHook.next = newHook;\n    }\n  }\n\n  return workInProgressHook;\n}\n\nfunction createFunctionComponentUpdateQueue() {\n  return {\n    lastEffect: null\n  };\n}\n\nfunction basicStateReducer(state, action) {\n  // $FlowFixMe: Flow doesn't like mixed types\n  return typeof action === 'function' ? action(state) : action;\n}\n\nfunction mountReducer(reducer, initialArg, init) {\n  var hook = mountWorkInProgressHook();\n  var initialState;\n\n  if (init !== undefined) {\n    initialState = init(initialArg);\n  } else {\n    initialState = initialArg;\n  }\n\n  hook.memoizedState = hook.baseState = initialState;\n  var queue = hook.queue = {\n    pending: null,\n    dispatch: null,\n    lastRenderedReducer: reducer,\n    lastRenderedState: initialState\n  };\n  var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n  return [hook.memoizedState, dispatch];\n}\n\nfunction updateReducer(reducer, initialArg, init) {\n  var hook = updateWorkInProgressHook();\n  var queue = hook.queue;\n\n  if (!(queue !== null)) {\n    {\n      throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n    }\n  }\n\n  queue.lastRenderedReducer = reducer;\n  var current = currentHook; // The last rebase update that is NOT part of the base state.\n\n  var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.\n\n  var pendingQueue = queue.pending;\n\n  if (pendingQueue !== null) {\n    // We have new updates that haven't been processed yet.\n    // We'll add them to the base queue.\n    if (baseQueue !== null) {\n      // Merge the pending queue and the base queue.\n      var baseFirst = baseQueue.next;\n      var pendingFirst = pendingQueue.next;\n      baseQueue.next = pendingFirst;\n      pendingQueue.next = baseFirst;\n    }\n\n    current.baseQueue = baseQueue = pendingQueue;\n    queue.pending = null;\n  }\n\n  if (baseQueue !== null) {\n    // We have a queue to process.\n    var first = baseQueue.next;\n    var newState = current.baseState;\n    var newBaseState = null;\n    var newBaseQueueFirst = null;\n    var newBaseQueueLast = null;\n    var update = first;\n\n    do {\n      var updateExpirationTime = update.expirationTime;\n\n      if (updateExpirationTime < renderExpirationTime) {\n        // Priority is insufficient. Skip this update. If this is the first\n        // skipped update, the previous update/state is the new base\n        // update/state.\n        var clone = {\n          expirationTime: update.expirationTime,\n          suspenseConfig: update.suspenseConfig,\n          action: update.action,\n          eagerReducer: update.eagerReducer,\n          eagerState: update.eagerState,\n          next: null\n        };\n\n        if (newBaseQueueLast === null) {\n          newBaseQueueFirst = newBaseQueueLast = clone;\n          newBaseState = newState;\n        } else {\n          newBaseQueueLast = newBaseQueueLast.next = clone;\n        } // Update the remaining priority in the queue.\n\n\n        if (updateExpirationTime > currentlyRenderingFiber$1.expirationTime) {\n          currentlyRenderingFiber$1.expirationTime = updateExpirationTime;\n          markUnprocessedUpdateTime(updateExpirationTime);\n        }\n      } else {\n        // This update does have sufficient priority.\n        if (newBaseQueueLast !== null) {\n          var _clone = {\n            expirationTime: Sync,\n            // This update is going to be committed so we never want uncommit it.\n            suspenseConfig: update.suspenseConfig,\n            action: update.action,\n            eagerReducer: update.eagerReducer,\n            eagerState: update.eagerState,\n            next: null\n          };\n          newBaseQueueLast = newBaseQueueLast.next = _clone;\n        } // Mark the event time of this update as relevant to this render pass.\n        // TODO: This should ideally use the true event time of this update rather than\n        // its priority which is a derived and not reverseable value.\n        // TODO: We should skip this update if it was already committed but currently\n        // we have no way of detecting the difference between a committed and suspended\n        // update here.\n\n\n        markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n        if (update.eagerReducer === reducer) {\n          // If this update was processed eagerly, and its reducer matches the\n          // current reducer, we can use the eagerly computed state.\n          newState = update.eagerState;\n        } else {\n          var action = update.action;\n          newState = reducer(newState, action);\n        }\n      }\n\n      update = update.next;\n    } while (update !== null && update !== first);\n\n    if (newBaseQueueLast === null) {\n      newBaseState = newState;\n    } else {\n      newBaseQueueLast.next = newBaseQueueFirst;\n    } // Mark that the fiber performed work, but only if the new state is\n    // different from the current state.\n\n\n    if (!objectIs(newState, hook.memoizedState)) {\n      markWorkInProgressReceivedUpdate();\n    }\n\n    hook.memoizedState = newState;\n    hook.baseState = newBaseState;\n    hook.baseQueue = newBaseQueueLast;\n    queue.lastRenderedState = newState;\n  }\n\n  var dispatch = queue.dispatch;\n  return [hook.memoizedState, dispatch];\n}\n\nfunction rerenderReducer(reducer, initialArg, init) {\n  var hook = updateWorkInProgressHook();\n  var queue = hook.queue;\n\n  if (!(queue !== null)) {\n    {\n      throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n    }\n  }\n\n  queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous\n  // work-in-progress hook.\n\n  var dispatch = queue.dispatch;\n  var lastRenderPhaseUpdate = queue.pending;\n  var newState = hook.memoizedState;\n\n  if (lastRenderPhaseUpdate !== null) {\n    // The queue doesn't persist past this render pass.\n    queue.pending = null;\n    var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;\n    var update = firstRenderPhaseUpdate;\n\n    do {\n      // Process this render phase update. We don't have to check the\n      // priority because it will always be the same as the current\n      // render's.\n      var action = update.action;\n      newState = reducer(newState, action);\n      update = update.next;\n    } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is\n    // different from the current state.\n\n\n    if (!objectIs(newState, hook.memoizedState)) {\n      markWorkInProgressReceivedUpdate();\n    }\n\n    hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to\n    // the base state unless the queue is empty.\n    // TODO: Not sure if this is the desired semantics, but it's what we\n    // do for gDSFP. I can't remember why.\n\n    if (hook.baseQueue === null) {\n      hook.baseState = newState;\n    }\n\n    queue.lastRenderedState = newState;\n  }\n\n  return [newState, dispatch];\n}\n\nfunction mountState(initialState) {\n  var hook = mountWorkInProgressHook();\n\n  if (typeof initialState === 'function') {\n    // $FlowFixMe: Flow doesn't like mixed types\n    initialState = initialState();\n  }\n\n  hook.memoizedState = hook.baseState = initialState;\n  var queue = hook.queue = {\n    pending: null,\n    dispatch: null,\n    lastRenderedReducer: basicStateReducer,\n    lastRenderedState: initialState\n  };\n  var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n  return [hook.memoizedState, dispatch];\n}\n\nfunction updateState(initialState) {\n  return updateReducer(basicStateReducer);\n}\n\nfunction rerenderState(initialState) {\n  return rerenderReducer(basicStateReducer);\n}\n\nfunction pushEffect(tag, create, destroy, deps) {\n  var effect = {\n    tag: tag,\n    create: create,\n    destroy: destroy,\n    deps: deps,\n    // Circular\n    next: null\n  };\n  var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;\n\n  if (componentUpdateQueue === null) {\n    componentUpdateQueue = createFunctionComponentUpdateQueue();\n    currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;\n    componentUpdateQueue.lastEffect = effect.next = effect;\n  } else {\n    var lastEffect = componentUpdateQueue.lastEffect;\n\n    if (lastEffect === null) {\n      componentUpdateQueue.lastEffect = effect.next = effect;\n    } else {\n      var firstEffect = lastEffect.next;\n      lastEffect.next = effect;\n      effect.next = firstEffect;\n      componentUpdateQueue.lastEffect = effect;\n    }\n  }\n\n  return effect;\n}\n\nfunction mountRef(initialValue) {\n  var hook = mountWorkInProgressHook();\n  var ref = {\n    current: initialValue\n  };\n\n  {\n    Object.seal(ref);\n  }\n\n  hook.memoizedState = ref;\n  return ref;\n}\n\nfunction updateRef(initialValue) {\n  var hook = updateWorkInProgressHook();\n  return hook.memoizedState;\n}\n\nfunction mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n  hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, undefined, nextDeps);\n}\n\nfunction updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var destroy = undefined;\n\n  if (currentHook !== null) {\n    var prevEffect = currentHook.memoizedState;\n    destroy = prevEffect.destroy;\n\n    if (nextDeps !== null) {\n      var prevDeps = prevEffect.deps;\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        pushEffect(hookEffectTag, create, destroy, nextDeps);\n        return;\n      }\n    }\n  }\n\n  currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n  hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, destroy, nextDeps);\n}\n\nfunction mountEffect(create, deps) {\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n    }\n  }\n\n  return mountEffectImpl(Update | Passive, Passive$1, create, deps);\n}\n\nfunction updateEffect(create, deps) {\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n    }\n  }\n\n  return updateEffectImpl(Update | Passive, Passive$1, create, deps);\n}\n\nfunction mountLayoutEffect(create, deps) {\n  return mountEffectImpl(Update, Layout, create, deps);\n}\n\nfunction updateLayoutEffect(create, deps) {\n  return updateEffectImpl(Update, Layout, create, deps);\n}\n\nfunction imperativeHandleEffect(create, ref) {\n  if (typeof ref === 'function') {\n    var refCallback = ref;\n\n    var _inst = create();\n\n    refCallback(_inst);\n    return function () {\n      refCallback(null);\n    };\n  } else if (ref !== null && ref !== undefined) {\n    var refObject = ref;\n\n    {\n      if (!refObject.hasOwnProperty('current')) {\n        error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');\n      }\n    }\n\n    var _inst2 = create();\n\n    refObject.current = _inst2;\n    return function () {\n      refObject.current = null;\n    };\n  }\n}\n\nfunction mountImperativeHandle(ref, create, deps) {\n  {\n    if (typeof create !== 'function') {\n      error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n    }\n  } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n  return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n}\n\nfunction updateImperativeHandle(ref, create, deps) {\n  {\n    if (typeof create !== 'function') {\n      error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n    }\n  } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n  return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n}\n\nfunction mountDebugValue(value, formatterFn) {// This hook is normally a no-op.\n  // The react-debug-hooks package injects its own implementation\n  // so that e.g. DevTools can display custom hook values.\n}\n\nvar updateDebugValue = mountDebugValue;\n\nfunction mountCallback(callback, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  hook.memoizedState = [callback, nextDeps];\n  return callback;\n}\n\nfunction updateCallback(callback, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var prevState = hook.memoizedState;\n\n  if (prevState !== null) {\n    if (nextDeps !== null) {\n      var prevDeps = prevState[1];\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        return prevState[0];\n      }\n    }\n  }\n\n  hook.memoizedState = [callback, nextDeps];\n  return callback;\n}\n\nfunction mountMemo(nextCreate, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var nextValue = nextCreate();\n  hook.memoizedState = [nextValue, nextDeps];\n  return nextValue;\n}\n\nfunction updateMemo(nextCreate, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var prevState = hook.memoizedState;\n\n  if (prevState !== null) {\n    // Assume these are defined. If they're not, areHookInputsEqual will warn.\n    if (nextDeps !== null) {\n      var prevDeps = prevState[1];\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        return prevState[0];\n      }\n    }\n  }\n\n  var nextValue = nextCreate();\n  hook.memoizedState = [nextValue, nextDeps];\n  return nextValue;\n}\n\nfunction mountDeferredValue(value, config) {\n  var _mountState = mountState(value),\n      prevValue = _mountState[0],\n      setValue = _mountState[1];\n\n  mountEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction updateDeferredValue(value, config) {\n  var _updateState = updateState(),\n      prevValue = _updateState[0],\n      setValue = _updateState[1];\n\n  updateEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction rerenderDeferredValue(value, config) {\n  var _rerenderState = rerenderState(),\n      prevValue = _rerenderState[0],\n      setValue = _rerenderState[1];\n\n  updateEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction startTransition(setPending, config, callback) {\n  var priorityLevel = getCurrentPriorityLevel();\n  runWithPriority$1(priorityLevel < UserBlockingPriority$1 ? UserBlockingPriority$1 : priorityLevel, function () {\n    setPending(true);\n  });\n  runWithPriority$1(priorityLevel > NormalPriority ? NormalPriority : priorityLevel, function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setPending(false);\n      callback();\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  });\n}\n\nfunction mountTransition(config) {\n  var _mountState2 = mountState(false),\n      isPending = _mountState2[0],\n      setPending = _mountState2[1];\n\n  var start = mountCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction updateTransition(config) {\n  var _updateState2 = updateState(),\n      isPending = _updateState2[0],\n      setPending = _updateState2[1];\n\n  var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction rerenderTransition(config) {\n  var _rerenderState2 = rerenderState(),\n      isPending = _rerenderState2[0],\n      setPending = _rerenderState2[1];\n\n  var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction dispatchAction(fiber, queue, action) {\n  {\n    if (typeof arguments[3] === 'function') {\n      error(\"State updates from the useState() and useReducer() Hooks don't support the \" + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');\n    }\n  }\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var suspenseConfig = requestCurrentSuspenseConfig();\n  var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n  var update = {\n    expirationTime: expirationTime,\n    suspenseConfig: suspenseConfig,\n    action: action,\n    eagerReducer: null,\n    eagerState: null,\n    next: null\n  };\n\n  {\n    update.priority = getCurrentPriorityLevel();\n  } // Append the update to the end of the list.\n\n\n  var pending = queue.pending;\n\n  if (pending === null) {\n    // This is the first update. Create a circular list.\n    update.next = update;\n  } else {\n    update.next = pending.next;\n    pending.next = update;\n  }\n\n  queue.pending = update;\n  var alternate = fiber.alternate;\n\n  if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {\n    // This is a render phase update. Stash it in a lazily-created map of\n    // queue -> linked list of updates. After this render pass, we'll restart\n    // and apply the stashed updates on top of the work-in-progress hook.\n    didScheduleRenderPhaseUpdate = true;\n    update.expirationTime = renderExpirationTime;\n    currentlyRenderingFiber$1.expirationTime = renderExpirationTime;\n  } else {\n    if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {\n      // The queue is currently empty, which means we can eagerly compute the\n      // next state before entering the render phase. If the new state is the\n      // same as the current state, we may be able to bail out entirely.\n      var lastRenderedReducer = queue.lastRenderedReducer;\n\n      if (lastRenderedReducer !== null) {\n        var prevDispatcher;\n\n        {\n          prevDispatcher = ReactCurrentDispatcher.current;\n          ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n        }\n\n        try {\n          var currentState = queue.lastRenderedState;\n          var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute\n          // it, on the update object. If the reducer hasn't changed by the\n          // time we enter the render phase, then the eager state can be used\n          // without calling the reducer again.\n\n          update.eagerReducer = lastRenderedReducer;\n          update.eagerState = eagerState;\n\n          if (objectIs(eagerState, currentState)) {\n            // Fast path. We can bail out without scheduling React to re-render.\n            // It's still possible that we'll need to rebase this update later,\n            // if the component re-renders for a different reason and by that\n            // time the reducer has changed.\n            return;\n          }\n        } catch (error) {// Suppress the error. It will throw again in the render phase.\n        } finally {\n          {\n            ReactCurrentDispatcher.current = prevDispatcher;\n          }\n        }\n      }\n    }\n\n    {\n      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n      if ('undefined' !== typeof jest) {\n        warnIfNotScopedWithMatchingAct(fiber);\n        warnIfNotCurrentlyActingUpdatesInDev(fiber);\n      }\n    }\n\n    scheduleWork(fiber, expirationTime);\n  }\n}\n\nvar ContextOnlyDispatcher = {\n  readContext: readContext,\n  useCallback: throwInvalidHookError,\n  useContext: throwInvalidHookError,\n  useEffect: throwInvalidHookError,\n  useImperativeHandle: throwInvalidHookError,\n  useLayoutEffect: throwInvalidHookError,\n  useMemo: throwInvalidHookError,\n  useReducer: throwInvalidHookError,\n  useRef: throwInvalidHookError,\n  useState: throwInvalidHookError,\n  useDebugValue: throwInvalidHookError,\n  useResponder: throwInvalidHookError,\n  useDeferredValue: throwInvalidHookError,\n  useTransition: throwInvalidHookError\n};\nvar HooksDispatcherOnMountInDEV = null;\nvar HooksDispatcherOnMountWithHookTypesInDEV = null;\nvar HooksDispatcherOnUpdateInDEV = null;\nvar HooksDispatcherOnRerenderInDEV = null;\nvar InvalidNestedHooksDispatcherOnMountInDEV = null;\nvar InvalidNestedHooksDispatcherOnUpdateInDEV = null;\nvar InvalidNestedHooksDispatcherOnRerenderInDEV = null;\n\n{\n  var warnInvalidContextAccess = function () {\n    error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n  };\n\n  var warnInvalidHookAccess = function () {\n    error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');\n  };\n\n  HooksDispatcherOnMountInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      mountHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      mountHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      mountHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      mountHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      mountHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      mountHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  HooksDispatcherOnMountWithHookTypesInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  HooksDispatcherOnUpdateInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return updateDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return updateTransition(config);\n    }\n  };\n  HooksDispatcherOnRerenderInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return rerenderReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return rerenderState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return rerenderDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return rerenderTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnMountInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnUpdateInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnRerenderInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return rerenderReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return rerenderState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return rerenderDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return rerenderTransition(config);\n    }\n  };\n}\n\nvar now$1 = Scheduler.unstable_now;\nvar commitTime = 0;\nvar profilerStartTime = -1;\n\nfunction getCommitTime() {\n  return commitTime;\n}\n\nfunction recordCommitTime() {\n\n  commitTime = now$1();\n}\n\nfunction startProfilerTimer(fiber) {\n\n  profilerStartTime = now$1();\n\n  if (fiber.actualStartTime < 0) {\n    fiber.actualStartTime = now$1();\n  }\n}\n\nfunction stopProfilerTimerIfRunning(fiber) {\n\n  profilerStartTime = -1;\n}\n\nfunction stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {\n\n  if (profilerStartTime >= 0) {\n    var elapsedTime = now$1() - profilerStartTime;\n    fiber.actualDuration += elapsedTime;\n\n    if (overrideBaseTime) {\n      fiber.selfBaseDuration = elapsedTime;\n    }\n\n    profilerStartTime = -1;\n  }\n}\n\n// This may have been an insertion or a hydration.\n\nvar hydrationParentFiber = null;\nvar nextHydratableInstance = null;\nvar isHydrating = false;\n\nfunction enterHydrationState(fiber) {\n\n  var parentInstance = fiber.stateNode.containerInfo;\n  nextHydratableInstance = getFirstHydratableChild(parentInstance);\n  hydrationParentFiber = fiber;\n  isHydrating = true;\n  return true;\n}\n\nfunction deleteHydratableInstance(returnFiber, instance) {\n  {\n    switch (returnFiber.tag) {\n      case HostRoot:\n        didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);\n        break;\n\n      case HostComponent:\n        didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);\n        break;\n    }\n  }\n\n  var childToDelete = createFiberFromHostInstanceForDeletion();\n  childToDelete.stateNode = instance;\n  childToDelete.return = returnFiber;\n  childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However,\n  // these children are not part of the reconciliation list of children.\n  // Even if we abort and rereconcile the children, that will try to hydrate\n  // again and the nodes are still in the host tree so these will be\n  // recreated.\n\n  if (returnFiber.lastEffect !== null) {\n    returnFiber.lastEffect.nextEffect = childToDelete;\n    returnFiber.lastEffect = childToDelete;\n  } else {\n    returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n  }\n}\n\nfunction insertNonHydratedInstance(returnFiber, fiber) {\n  fiber.effectTag = fiber.effectTag & ~Hydrating | Placement;\n\n  {\n    switch (returnFiber.tag) {\n      case HostRoot:\n        {\n          var parentContainer = returnFiber.stateNode.containerInfo;\n\n          switch (fiber.tag) {\n            case HostComponent:\n              var type = fiber.type;\n              var props = fiber.pendingProps;\n              didNotFindHydratableContainerInstance(parentContainer, type);\n              break;\n\n            case HostText:\n              var text = fiber.pendingProps;\n              didNotFindHydratableContainerTextInstance(parentContainer, text);\n              break;\n          }\n\n          break;\n        }\n\n      case HostComponent:\n        {\n          var parentType = returnFiber.type;\n          var parentProps = returnFiber.memoizedProps;\n          var parentInstance = returnFiber.stateNode;\n\n          switch (fiber.tag) {\n            case HostComponent:\n              var _type = fiber.type;\n              var _props = fiber.pendingProps;\n              didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type);\n              break;\n\n            case HostText:\n              var _text = fiber.pendingProps;\n              didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);\n              break;\n\n            case SuspenseComponent:\n              didNotFindHydratableSuspenseInstance(parentType, parentProps);\n              break;\n          }\n\n          break;\n        }\n\n      default:\n        return;\n    }\n  }\n}\n\nfunction tryHydrate(fiber, nextInstance) {\n  switch (fiber.tag) {\n    case HostComponent:\n      {\n        var type = fiber.type;\n        var props = fiber.pendingProps;\n        var instance = canHydrateInstance(nextInstance, type);\n\n        if (instance !== null) {\n          fiber.stateNode = instance;\n          return true;\n        }\n\n        return false;\n      }\n\n    case HostText:\n      {\n        var text = fiber.pendingProps;\n        var textInstance = canHydrateTextInstance(nextInstance, text);\n\n        if (textInstance !== null) {\n          fiber.stateNode = textInstance;\n          return true;\n        }\n\n        return false;\n      }\n\n    case SuspenseComponent:\n      {\n\n        return false;\n      }\n\n    default:\n      return false;\n  }\n}\n\nfunction tryToClaimNextHydratableInstance(fiber) {\n  if (!isHydrating) {\n    return;\n  }\n\n  var nextInstance = nextHydratableInstance;\n\n  if (!nextInstance) {\n    // Nothing to hydrate. Make it an insertion.\n    insertNonHydratedInstance(hydrationParentFiber, fiber);\n    isHydrating = false;\n    hydrationParentFiber = fiber;\n    return;\n  }\n\n  var firstAttemptedInstance = nextInstance;\n\n  if (!tryHydrate(fiber, nextInstance)) {\n    // If we can't hydrate this instance let's try the next one.\n    // We use this as a heuristic. It's based on intuition and not data so it\n    // might be flawed or unnecessary.\n    nextInstance = getNextHydratableSibling(firstAttemptedInstance);\n\n    if (!nextInstance || !tryHydrate(fiber, nextInstance)) {\n      // Nothing to hydrate. Make it an insertion.\n      insertNonHydratedInstance(hydrationParentFiber, fiber);\n      isHydrating = false;\n      hydrationParentFiber = fiber;\n      return;\n    } // We matched the next one, we'll now assume that the first one was\n    // superfluous and we'll delete it. Since we can't eagerly delete it\n    // we'll have to schedule a deletion. To do that, this node needs a dummy\n    // fiber associated with it.\n\n\n    deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);\n  }\n\n  hydrationParentFiber = fiber;\n  nextHydratableInstance = getFirstHydratableChild(nextInstance);\n}\n\nfunction prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {\n\n  var instance = fiber.stateNode;\n  var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component.\n\n  fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n  // is a new ref we mark this as an update.\n\n  if (updatePayload !== null) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction prepareToHydrateHostTextInstance(fiber) {\n\n  var textInstance = fiber.stateNode;\n  var textContent = fiber.memoizedProps;\n  var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);\n\n  {\n    if (shouldUpdate) {\n      // We assume that prepareToHydrateHostTextInstance is called in a context where the\n      // hydration parent is the parent host component of this host text.\n      var returnFiber = hydrationParentFiber;\n\n      if (returnFiber !== null) {\n        switch (returnFiber.tag) {\n          case HostRoot:\n            {\n              var parentContainer = returnFiber.stateNode.containerInfo;\n              didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);\n              break;\n            }\n\n          case HostComponent:\n            {\n              var parentType = returnFiber.type;\n              var parentProps = returnFiber.memoizedProps;\n              var parentInstance = returnFiber.stateNode;\n              didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);\n              break;\n            }\n        }\n      }\n    }\n  }\n\n  return shouldUpdate;\n}\n\nfunction skipPastDehydratedSuspenseInstance(fiber) {\n\n  var suspenseState = fiber.memoizedState;\n  var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;\n\n  if (!suspenseInstance) {\n    {\n      throw Error( \"Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);\n}\n\nfunction popToNextHostParent(fiber) {\n  var parent = fiber.return;\n\n  while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {\n    parent = parent.return;\n  }\n\n  hydrationParentFiber = parent;\n}\n\nfunction popHydrationState(fiber) {\n\n  if (fiber !== hydrationParentFiber) {\n    // We're deeper than the current hydration context, inside an inserted\n    // tree.\n    return false;\n  }\n\n  if (!isHydrating) {\n    // If we're not currently hydrating but we're in a hydration context, then\n    // we were an insertion and now need to pop up reenter hydration of our\n    // siblings.\n    popToNextHostParent(fiber);\n    isHydrating = true;\n    return false;\n  }\n\n  var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now.\n  // We only do this deeper than head and body since they tend to have random\n  // other nodes in them. We also ignore components with pure text content in\n  // side of them.\n  // TODO: Better heuristic.\n\n  if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {\n    var nextInstance = nextHydratableInstance;\n\n    while (nextInstance) {\n      deleteHydratableInstance(fiber, nextInstance);\n      nextInstance = getNextHydratableSibling(nextInstance);\n    }\n  }\n\n  popToNextHostParent(fiber);\n\n  if (fiber.tag === SuspenseComponent) {\n    nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);\n  } else {\n    nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;\n  }\n\n  return true;\n}\n\nfunction resetHydrationState() {\n\n  hydrationParentFiber = null;\n  nextHydratableInstance = null;\n  isHydrating = false;\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar didReceiveUpdate = false;\nvar didWarnAboutBadClass;\nvar didWarnAboutModulePatternComponent;\nvar didWarnAboutContextTypeOnFunctionComponent;\nvar didWarnAboutGetDerivedStateOnFunctionComponent;\nvar didWarnAboutFunctionRefs;\nvar didWarnAboutReassigningProps;\nvar didWarnAboutRevealOrder;\nvar didWarnAboutTailOptions;\n\n{\n  didWarnAboutBadClass = {};\n  didWarnAboutModulePatternComponent = {};\n  didWarnAboutContextTypeOnFunctionComponent = {};\n  didWarnAboutGetDerivedStateOnFunctionComponent = {};\n  didWarnAboutFunctionRefs = {};\n  didWarnAboutReassigningProps = false;\n  didWarnAboutRevealOrder = {};\n  didWarnAboutTailOptions = {};\n}\n\nfunction reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime) {\n  if (current === null) {\n    // If this is a fresh new component that hasn't been rendered yet, we\n    // won't update its child set by applying minimal side-effects. Instead,\n    // we will add them all to the child before it gets rendered. That means\n    // we can optimize this reconciliation pass by not tracking side-effects.\n    workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  } else {\n    // If the current child is the same as the work in progress, it means that\n    // we haven't yet started any work on these children. Therefore, we use\n    // the clone algorithm to create a copy of all the current children.\n    // If we had any progressed work already, that is invalid at this point so\n    // let's throw it out.\n    workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);\n  }\n}\n\nfunction forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime) {\n  // This function is fork of reconcileChildren. It's used in cases where we\n  // want to reconcile without matching against the existing set. This has the\n  // effect of all current children being unmounted; even if the type and key\n  // are the same, the old child is unmounted and a new child is created.\n  //\n  // To do this, we're going to go through the reconcile algorithm twice. In\n  // the first pass, we schedule a deletion for all the current children by\n  // passing null.\n  workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we\n  // pass null in place of where we usually pass the current child set. This has\n  // the effect of remounting all children regardless of whether their\n  // identities match.\n\n  workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n}\n\nfunction updateForwardRef(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  // TODO: current can be non-null here even if the component\n  // hasn't yet mounted. This happens after the first render suspends.\n  // We'll need to figure out if this is fine or can cause issues.\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  }\n\n  var render = Component.render;\n  var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent\n\n  var nextChildren;\n  prepareToReadContext(workInProgress, renderExpirationTime);\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n\n    if ( workInProgress.mode & StrictMode) {\n      // Only double-render components with Hooks\n      if (workInProgress.memoizedState !== null) {\n        nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n      }\n    }\n\n    setIsRendering(false);\n  }\n\n  if (current !== null && !didReceiveUpdate) {\n    bailoutHooks(current, workInProgress, renderExpirationTime);\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n  if (current === null) {\n    var type = Component.type;\n\n    if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.\n    Component.defaultProps === undefined) {\n      var resolvedType = type;\n\n      {\n        resolvedType = resolveFunctionForHotReloading(type);\n      } // If this is a plain function component without default props,\n      // and with only the default shallow comparison, we upgrade it\n      // to a SimpleMemoComponent to allow fast path updates.\n\n\n      workInProgress.tag = SimpleMemoComponent;\n      workInProgress.type = resolvedType;\n\n      {\n        validateFunctionComponentInDev(workInProgress, type);\n      }\n\n      return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime);\n    }\n\n    {\n      var innerPropTypes = type.propTypes;\n\n      if (innerPropTypes) {\n        // Inner memo component props aren't currently validated in createElement.\n        // We could move it there, but we'd still need this for lazy code path.\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(type), getCurrentFiberStackInDev);\n      }\n    }\n\n    var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);\n    child.ref = workInProgress.ref;\n    child.return = workInProgress;\n    workInProgress.child = child;\n    return child;\n  }\n\n  {\n    var _type = Component.type;\n    var _innerPropTypes = _type.propTypes;\n\n    if (_innerPropTypes) {\n      // Inner memo component props aren't currently validated in createElement.\n      // We could move it there, but we'd still need this for lazy code path.\n      checkPropTypes(_innerPropTypes, nextProps, // Resolved props\n      'prop', getComponentName(_type), getCurrentFiberStackInDev);\n    }\n  }\n\n  var currentChild = current.child; // This is always exactly one child\n\n  if (updateExpirationTime < renderExpirationTime) {\n    // This will be the props with resolved defaultProps,\n    // unlike current.memoizedProps which will be the unresolved ones.\n    var prevProps = currentChild.memoizedProps; // Default to shallow comparison\n\n    var compare = Component.compare;\n    compare = compare !== null ? compare : shallowEqual;\n\n    if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    }\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  var newChild = createWorkInProgress(currentChild, nextProps);\n  newChild.ref = workInProgress.ref;\n  newChild.return = workInProgress;\n  workInProgress.child = newChild;\n  return newChild;\n}\n\nfunction updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n  // TODO: current can be non-null here even if the component\n  // hasn't yet mounted. This happens when the inner render suspends.\n  // We'll need to figure out if this is fine or can cause issues.\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var outerMemoType = workInProgress.elementType;\n\n      if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {\n        // We warn when you define propTypes on lazy()\n        // so let's just skip over it to find memo() outer wrapper.\n        // Inner props for memo are validated later.\n        outerMemoType = refineResolvedLazyComponent(outerMemoType);\n      }\n\n      var outerPropTypes = outerMemoType && outerMemoType.propTypes;\n\n      if (outerPropTypes) {\n        checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)\n        'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);\n      } // Inner propTypes will be validated in the function component path.\n\n    }\n  }\n\n  if (current !== null) {\n    var prevProps = current.memoizedProps;\n\n    if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.\n     workInProgress.type === current.type )) {\n      didReceiveUpdate = false;\n\n      if (updateExpirationTime < renderExpirationTime) {\n        // The pending update priority was cleared at the beginning of\n        // beginWork. We're about to bail out, but there might be additional\n        // updates at a lower priority. Usually, the priority level of the\n        // remaining updates is accumlated during the evaluation of the\n        // component (i.e. when processing the update queue). But since since\n        // we're bailing out early *without* evaluating the component, we need\n        // to account for it here, too. Reset to the value of the current fiber.\n        // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,\n        // because a MemoComponent fiber does not have hooks or an update queue;\n        // rather, it wraps around an inner component, which may or may not\n        // contains hooks.\n        // TODO: Move the reset at in beginWork out of the common path so that\n        // this is no longer necessary.\n        workInProgress.expirationTime = current.expirationTime;\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    }\n  }\n\n  return updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime);\n}\n\nfunction updateFragment(current, workInProgress, renderExpirationTime) {\n  var nextChildren = workInProgress.pendingProps;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateMode(current, workInProgress, renderExpirationTime) {\n  var nextChildren = workInProgress.pendingProps.children;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateProfiler(current, workInProgress, renderExpirationTime) {\n  {\n    workInProgress.effectTag |= Update;\n  }\n\n  var nextProps = workInProgress.pendingProps;\n  var nextChildren = nextProps.children;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction markRef(current, workInProgress) {\n  var ref = workInProgress.ref;\n\n  if (current === null && ref !== null || current !== null && current.ref !== ref) {\n    // Schedule a Ref effect\n    workInProgress.effectTag |= Ref;\n  }\n}\n\nfunction updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  }\n\n  var context;\n\n  {\n    var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);\n    context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  var nextChildren;\n  prepareToReadContext(workInProgress, renderExpirationTime);\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n\n    if ( workInProgress.mode & StrictMode) {\n      // Only double-render components with Hooks\n      if (workInProgress.memoizedState !== null) {\n        nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n      }\n    }\n\n    setIsRendering(false);\n  }\n\n  if (current !== null && !didReceiveUpdate) {\n    bailoutHooks(current, workInProgress, renderExpirationTime);\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateClassComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  } // Push context providers early to prevent context stack mismatches.\n  // During mounting we don't know the child context yet as the instance doesn't exist.\n  // We will invalidate the child context in finishClassComponent() right after rendering.\n\n\n  var hasContext;\n\n  if (isContextProvider(Component)) {\n    hasContext = true;\n    pushContextProvider(workInProgress);\n  } else {\n    hasContext = false;\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var instance = workInProgress.stateNode;\n  var shouldUpdate;\n\n  if (instance === null) {\n    if (current !== null) {\n      // A class component without an instance only mounts if it suspended\n      // inside a non-concurrent tree, in an inconsistent state. We want to\n      // treat it like a new mount, even though an empty version of it already\n      // committed. Disconnect the alternate pointers.\n      current.alternate = null;\n      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n      workInProgress.effectTag |= Placement;\n    } // In the initial pass we might need to construct the instance.\n\n\n    constructClassInstance(workInProgress, Component, nextProps);\n    mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n    shouldUpdate = true;\n  } else if (current === null) {\n    // In a resume, we'll already have an instance we can reuse.\n    shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n  } else {\n    shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderExpirationTime);\n  }\n\n  var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);\n\n  {\n    var inst = workInProgress.stateNode;\n\n    if (inst.props !== nextProps) {\n      if (!didWarnAboutReassigningProps) {\n        error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component');\n      }\n\n      didWarnAboutReassigningProps = true;\n    }\n  }\n\n  return nextUnitOfWork;\n}\n\nfunction finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {\n  // Refs should update even if shouldComponentUpdate returns false\n  markRef(current, workInProgress);\n  var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n  if (!shouldUpdate && !didCaptureError) {\n    // Context providers should defer to sCU for rendering\n    if (hasContext) {\n      invalidateContextProvider(workInProgress, Component, false);\n    }\n\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  }\n\n  var instance = workInProgress.stateNode; // Rerender\n\n  ReactCurrentOwner$1.current = workInProgress;\n  var nextChildren;\n\n  if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {\n    // If we captured an error, but getDerivedStateFromError is not defined,\n    // unmount all the children. componentDidCatch will schedule an update to\n    // re-render a fallback. This is temporary until we migrate everyone to\n    // the new API.\n    // TODO: Warn in a future release.\n    nextChildren = null;\n\n    {\n      stopProfilerTimerIfRunning();\n    }\n  } else {\n    {\n      setIsRendering(true);\n      nextChildren = instance.render();\n\n      if ( workInProgress.mode & StrictMode) {\n        instance.render();\n      }\n\n      setIsRendering(false);\n    }\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n\n  if (current !== null && didCaptureError) {\n    // If we're recovering from an error, reconcile without reusing any of\n    // the existing children. Conceptually, the normal children and the children\n    // that are shown on error are two different sets, so we shouldn't reuse\n    // normal children even if their identities match.\n    forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime);\n  } else {\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  } // Memoize state using the values we just used to render.\n  // TODO: Restructure so we never read values from the instance.\n\n\n  workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.\n\n  if (hasContext) {\n    invalidateContextProvider(workInProgress, Component, true);\n  }\n\n  return workInProgress.child;\n}\n\nfunction pushHostRootContext(workInProgress) {\n  var root = workInProgress.stateNode;\n\n  if (root.pendingContext) {\n    pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);\n  } else if (root.context) {\n    // Should always be set\n    pushTopLevelContextObject(workInProgress, root.context, false);\n  }\n\n  pushHostContainer(workInProgress, root.containerInfo);\n}\n\nfunction updateHostRoot(current, workInProgress, renderExpirationTime) {\n  pushHostRootContext(workInProgress);\n  var updateQueue = workInProgress.updateQueue;\n\n  if (!(current !== null && updateQueue !== null)) {\n    {\n      throw Error( \"If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  var nextProps = workInProgress.pendingProps;\n  var prevState = workInProgress.memoizedState;\n  var prevChildren = prevState !== null ? prevState.element : null;\n  cloneUpdateQueue(current, workInProgress);\n  processUpdateQueue(workInProgress, nextProps, null, renderExpirationTime);\n  var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  var nextChildren = nextState.element;\n\n  if (nextChildren === prevChildren) {\n    // If the state is the same as before, that's a bailout because we had\n    // no work that expires at this time.\n    resetHydrationState();\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  }\n\n  var root = workInProgress.stateNode;\n\n  if (root.hydrate && enterHydrationState(workInProgress)) {\n    // If we don't have any current children this might be the first pass.\n    // We always try to hydrate. If this isn't a hydration pass there won't\n    // be any children to hydrate which is effectively the same thing as\n    // not hydrating.\n    var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n    workInProgress.child = child;\n    var node = child;\n\n    while (node) {\n      // Mark each child as hydrating. This is a fast path to know whether this\n      // tree is part of a hydrating tree. This is used to determine if a child\n      // node has fully mounted yet, and for scheduling event replaying.\n      // Conceptually this is similar to Placement in that a new subtree is\n      // inserted into the React tree here. It just happens to not need DOM\n      // mutations because it already exists.\n      node.effectTag = node.effectTag & ~Placement | Hydrating;\n      node = node.sibling;\n    }\n  } else {\n    // Otherwise reset hydration state in case we aborted and resumed another\n    // root.\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    resetHydrationState();\n  }\n\n  return workInProgress.child;\n}\n\nfunction updateHostComponent(current, workInProgress, renderExpirationTime) {\n  pushHostContext(workInProgress);\n\n  if (current === null) {\n    tryToClaimNextHydratableInstance(workInProgress);\n  }\n\n  var type = workInProgress.type;\n  var nextProps = workInProgress.pendingProps;\n  var prevProps = current !== null ? current.memoizedProps : null;\n  var nextChildren = nextProps.children;\n  var isDirectTextChild = shouldSetTextContent(type, nextProps);\n\n  if (isDirectTextChild) {\n    // We special case a direct text child of a host node. This is a common\n    // case. We won't handle it as a reified child. We will instead handle\n    // this in the host environment that also has access to this prop. That\n    // avoids allocating another HostText fiber and traversing it.\n    nextChildren = null;\n  } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {\n    // If we're switching from a direct text child to a normal child, or to\n    // empty, we need to schedule the text content to be reset.\n    workInProgress.effectTag |= ContentReset;\n  }\n\n  markRef(current, workInProgress); // Check the host config to see if the children are offscreen/hidden.\n\n  if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) {\n    {\n      markSpawnedWork(Never);\n    } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n    workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n    return null;\n  }\n\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateHostText(current, workInProgress) {\n  if (current === null) {\n    tryToClaimNextHydratableInstance(workInProgress);\n  } // Nothing to do here. This is terminal. We'll do the completion step\n  // immediately after.\n\n\n  return null;\n}\n\nfunction mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {\n  if (_current !== null) {\n    // A lazy component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  }\n\n  var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet.\n  // Cancel and resume right after we know the tag.\n\n  cancelWorkTimer(workInProgress);\n  var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type.\n\n  workInProgress.type = Component;\n  var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);\n  startWorkTimer(workInProgress);\n  var resolvedProps = resolveDefaultProps(Component, props);\n  var child;\n\n  switch (resolvedTag) {\n    case FunctionComponent:\n      {\n        {\n          validateFunctionComponentInDev(workInProgress, Component);\n          workInProgress.type = Component = resolveFunctionForHotReloading(Component);\n        }\n\n        child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case ClassComponent:\n      {\n        {\n          workInProgress.type = Component = resolveClassForHotReloading(Component);\n        }\n\n        child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case ForwardRef:\n      {\n        {\n          workInProgress.type = Component = resolveForwardRefForHotReloading(Component);\n        }\n\n        child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case MemoComponent:\n      {\n        {\n          if (workInProgress.type !== workInProgress.elementType) {\n            var outerPropTypes = Component.propTypes;\n\n            if (outerPropTypes) {\n              checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only\n              'prop', getComponentName(Component), getCurrentFiberStackInDev);\n            }\n          }\n        }\n\n        child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too\n        updateExpirationTime, renderExpirationTime);\n        return child;\n      }\n  }\n\n  var hint = '';\n\n  {\n    if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {\n      hint = ' Did you wrap a component in React.lazy() more than once?';\n    }\n  } // This message intentionally doesn't mention ForwardRef or MemoComponent\n  // because the fact that it's a separate type of work is an\n  // implementation detail.\n\n\n  {\n    {\n      throw Error( \"Element type is invalid. Received a promise that resolves to: \" + Component + \". Lazy element type must resolve to a class or function.\" + hint );\n    }\n  }\n}\n\nfunction mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {\n  if (_current !== null) {\n    // An incomplete component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  } // Promote the fiber to a class and try rendering again.\n\n\n  workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`\n  // Push context providers early to prevent context stack mismatches.\n  // During mounting we don't know the child context yet as the instance doesn't exist.\n  // We will invalidate the child context in finishClassComponent() right after rendering.\n\n  var hasContext;\n\n  if (isContextProvider(Component)) {\n    hasContext = true;\n    pushContextProvider(workInProgress);\n  } else {\n    hasContext = false;\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  constructClassInstance(workInProgress, Component, nextProps);\n  mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n  return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n}\n\nfunction mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {\n  if (_current !== null) {\n    // An indeterminate component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  }\n\n  var props = workInProgress.pendingProps;\n  var context;\n\n  {\n    var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);\n    context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var value;\n\n  {\n    if (Component.prototype && typeof Component.prototype.render === 'function') {\n      var componentName = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutBadClass[componentName]) {\n        error(\"The <%s /> component appears to have a render method, but doesn't extend React.Component. \" + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);\n\n        didWarnAboutBadClass[componentName] = true;\n      }\n    }\n\n    if (workInProgress.mode & StrictMode) {\n      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);\n    }\n\n    setIsRendering(true);\n    ReactCurrentOwner$1.current = workInProgress;\n    value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n    setIsRendering(false);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n\n  if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {\n    {\n      var _componentName = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutModulePatternComponent[_componentName]) {\n        error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + \"If you can't use a class try assigning the prototype on the function as a workaround. \" + \"`%s.prototype = React.Component.prototype`. Don't use an arrow function since it \" + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);\n\n        didWarnAboutModulePatternComponent[_componentName] = true;\n      }\n    } // Proceed under the assumption that this is a class instance\n\n\n    workInProgress.tag = ClassComponent; // Throw out any hooks that were used.\n\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.\n    // During mounting we don't know the child context yet as the instance doesn't exist.\n    // We will invalidate the child context in finishClassComponent() right after rendering.\n\n    var hasContext = false;\n\n    if (isContextProvider(Component)) {\n      hasContext = true;\n      pushContextProvider(workInProgress);\n    } else {\n      hasContext = false;\n    }\n\n    workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;\n    initializeUpdateQueue(workInProgress);\n    var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n\n    if (typeof getDerivedStateFromProps === 'function') {\n      applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);\n    }\n\n    adoptClassInstance(workInProgress, value);\n    mountClassInstance(workInProgress, Component, props, renderExpirationTime);\n    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n  } else {\n    // Proceed under the assumption that this is a function component\n    workInProgress.tag = FunctionComponent;\n\n    {\n\n      if ( workInProgress.mode & StrictMode) {\n        // Only double-render components with Hooks\n        if (workInProgress.memoizedState !== null) {\n          value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n        }\n      }\n    }\n\n    reconcileChildren(null, workInProgress, value, renderExpirationTime);\n\n    {\n      validateFunctionComponentInDev(workInProgress, Component);\n    }\n\n    return workInProgress.child;\n  }\n}\n\nfunction validateFunctionComponentInDev(workInProgress, Component) {\n  {\n    if (Component) {\n      if (Component.childContextTypes) {\n        error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');\n      }\n    }\n\n    if (workInProgress.ref !== null) {\n      var info = '';\n      var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n      if (ownerName) {\n        info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n      }\n\n      var warningKey = ownerName || workInProgress._debugID || '';\n      var debugSource = workInProgress._debugSource;\n\n      if (debugSource) {\n        warningKey = debugSource.fileName + ':' + debugSource.lineNumber;\n      }\n\n      if (!didWarnAboutFunctionRefs[warningKey]) {\n        didWarnAboutFunctionRefs[warningKey] = true;\n\n        error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);\n      }\n    }\n\n    if (typeof Component.getDerivedStateFromProps === 'function') {\n      var _componentName2 = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) {\n        error('%s: Function components do not support getDerivedStateFromProps.', _componentName2);\n\n        didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true;\n      }\n    }\n\n    if (typeof Component.contextType === 'object' && Component.contextType !== null) {\n      var _componentName3 = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) {\n        error('%s: Function components do not support contextType.', _componentName3);\n\n        didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true;\n      }\n    }\n  }\n}\n\nvar SUSPENDED_MARKER = {\n  dehydrated: null,\n  retryTime: NoWork\n};\n\nfunction shouldRemainOnFallback(suspenseContext, current, workInProgress) {\n  // If the context is telling us that we should show a fallback, and we're not\n  // already showing content, then we should show the fallback instead.\n  return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current === null || current.memoizedState !== null);\n}\n\nfunction updateSuspenseComponent(current, workInProgress, renderExpirationTime) {\n  var mode = workInProgress.mode;\n  var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.\n\n  {\n    if (shouldSuspend(workInProgress)) {\n      workInProgress.effectTag |= DidCapture;\n    }\n  }\n\n  var suspenseContext = suspenseStackCursor.current;\n  var nextDidTimeout = false;\n  var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n  if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {\n    // Something in this boundary's subtree already suspended. Switch to\n    // rendering the fallback children.\n    nextDidTimeout = true;\n    workInProgress.effectTag &= ~DidCapture;\n  } else {\n    // Attempting the main content\n    if (current === null || current.memoizedState !== null) {\n      // This is a new mount or this boundary is already showing a fallback state.\n      // Mark this subtree context as having at least one invisible parent that could\n      // handle the fallback state.\n      // Boundaries without fallbacks or should be avoided are not considered since\n      // they cannot handle preferred fallback states.\n      if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) {\n        suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);\n      }\n    }\n  }\n\n  suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n  pushSuspenseContext(workInProgress, suspenseContext); // This next part is a bit confusing. If the children timeout, we switch to\n  // showing the fallback children in place of the \"primary\" children.\n  // However, we don't want to delete the primary children because then their\n  // state will be lost (both the React state and the host state, e.g.\n  // uncontrolled form inputs). Instead we keep them mounted and hide them.\n  // Both the fallback children AND the primary children are rendered at the\n  // same time. Once the primary children are un-suspended, we can delete\n  // the fallback children — don't need to preserve their state.\n  //\n  // The two sets of children are siblings in the host environment, but\n  // semantically, for purposes of reconciliation, they are two separate sets.\n  // So we store them using two fragment fibers.\n  //\n  // However, we want to avoid allocating extra fibers for every placeholder.\n  // They're only necessary when the children time out, because that's the\n  // only time when both sets are mounted.\n  //\n  // So, the extra fragment fibers are only used if the children time out.\n  // Otherwise, we render the primary children directly. This requires some\n  // custom reconciliation logic to preserve the state of the primary\n  // children. It's essentially a very basic form of re-parenting.\n\n  if (current === null) {\n    // If we're currently hydrating, try to hydrate this boundary.\n    // But only if this has a fallback.\n    if (nextProps.fallback !== undefined) {\n      tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.\n    } // This is the initial mount. This branch is pretty simple because there's\n    // no previous state that needs to be preserved.\n\n\n    if (nextDidTimeout) {\n      // Mount separate fragments for primary and fallback children.\n      var nextFallbackChildren = nextProps.fallback;\n      var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);\n      primaryChildFragment.return = workInProgress;\n\n      if ((workInProgress.mode & BlockingMode) === NoMode) {\n        // Outside of blocking mode, we commit the effects from the\n        // partially completed, timed-out tree, too.\n        var progressedState = workInProgress.memoizedState;\n        var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;\n        primaryChildFragment.child = progressedPrimaryChild;\n        var progressedChild = progressedPrimaryChild;\n\n        while (progressedChild !== null) {\n          progressedChild.return = primaryChildFragment;\n          progressedChild = progressedChild.sibling;\n        }\n      }\n\n      var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);\n      fallbackChildFragment.return = workInProgress;\n      primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the\n      // fallback children.\n\n      workInProgress.memoizedState = SUSPENDED_MARKER;\n      workInProgress.child = primaryChildFragment;\n      return fallbackChildFragment;\n    } else {\n      // Mount the primary children without an intermediate fragment fiber.\n      var nextPrimaryChildren = nextProps.children;\n      workInProgress.memoizedState = null;\n      return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);\n    }\n  } else {\n    // This is an update. This branch is more complicated because we need to\n    // ensure the state of the primary children is preserved.\n    var prevState = current.memoizedState;\n\n    if (prevState !== null) {\n      // wrapped in a fragment fiber.\n\n\n      var currentPrimaryChildFragment = current.child;\n      var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;\n\n      if (nextDidTimeout) {\n        // Still timed out. Reuse the current primary children by cloning\n        // its fragment. We're going to skip over these entirely.\n        var _nextFallbackChildren2 = nextProps.fallback;\n\n        var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps);\n\n        _primaryChildFragment2.return = workInProgress;\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var _progressedState = workInProgress.memoizedState;\n\n          var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;\n\n          if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {\n            _primaryChildFragment2.child = _progressedPrimaryChild;\n            var _progressedChild2 = _progressedPrimaryChild;\n\n            while (_progressedChild2 !== null) {\n              _progressedChild2.return = _primaryChildFragment2;\n              _progressedChild2 = _progressedChild2.sibling;\n            }\n          }\n        } // Because primaryChildFragment is a new fiber that we're inserting as the\n        // parent of a new tree, we need to set its treeBaseDuration.\n\n\n        if ( workInProgress.mode & ProfileMode) {\n          // treeBaseDuration is the sum of all the child tree base durations.\n          var _treeBaseDuration = 0;\n          var _hiddenChild = _primaryChildFragment2.child;\n\n          while (_hiddenChild !== null) {\n            _treeBaseDuration += _hiddenChild.treeBaseDuration;\n            _hiddenChild = _hiddenChild.sibling;\n          }\n\n          _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;\n        } // Clone the fallback child fragment, too. These we'll continue\n        // working on.\n\n\n        var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2);\n\n        _fallbackChildFragment2.return = workInProgress;\n        _primaryChildFragment2.sibling = _fallbackChildFragment2;\n        _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = _primaryChildFragment2;\n        return _fallbackChildFragment2;\n      } else {\n        // No longer suspended. Switch back to showing the primary children,\n        // and remove the intermediate fragment fiber.\n        var _nextPrimaryChildren = nextProps.children;\n        var currentPrimaryChild = currentPrimaryChildFragment.child;\n        var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback\n        // children. Wait until the complete phase, after we've confirmed the\n        // fallback is no longer needed.\n        // TODO: Would it be better to store the fallback fragment on\n        // the stateNode?\n        // Continue rendering the children, like we normally do.\n\n        workInProgress.memoizedState = null;\n        return workInProgress.child = primaryChild;\n      }\n    } else {\n      // The current tree has not already timed out. That means the primary\n      // children are not wrapped in a fragment fiber.\n      var _currentPrimaryChild = current.child;\n\n      if (nextDidTimeout) {\n        // Timed out. Wrap the children in a fragment fiber to keep them\n        // separate from the fallback children.\n        var _nextFallbackChildren3 = nextProps.fallback;\n\n        var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't\n        // going to render this fragment.\n        null, mode, NoWork, null);\n\n        _primaryChildFragment3.return = workInProgress;\n        _primaryChildFragment3.child = _currentPrimaryChild;\n\n        if (_currentPrimaryChild !== null) {\n          _currentPrimaryChild.return = _primaryChildFragment3;\n        } // Even though we're creating a new fiber, there are no new children,\n        // because we're reusing an already mounted tree. So we don't need to\n        // schedule a placement.\n        // primaryChildFragment.effectTag |= Placement;\n\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var _progressedState2 = workInProgress.memoizedState;\n\n          var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;\n\n          _primaryChildFragment3.child = _progressedPrimaryChild2;\n          var _progressedChild3 = _progressedPrimaryChild2;\n\n          while (_progressedChild3 !== null) {\n            _progressedChild3.return = _primaryChildFragment3;\n            _progressedChild3 = _progressedChild3.sibling;\n          }\n        } // Because primaryChildFragment is a new fiber that we're inserting as the\n        // parent of a new tree, we need to set its treeBaseDuration.\n\n\n        if ( workInProgress.mode & ProfileMode) {\n          // treeBaseDuration is the sum of all the child tree base durations.\n          var _treeBaseDuration2 = 0;\n          var _hiddenChild2 = _primaryChildFragment3.child;\n\n          while (_hiddenChild2 !== null) {\n            _treeBaseDuration2 += _hiddenChild2.treeBaseDuration;\n            _hiddenChild2 = _hiddenChild2.sibling;\n          }\n\n          _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2;\n        } // Create a fragment from the fallback children, too.\n\n\n        var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null);\n\n        _fallbackChildFragment3.return = workInProgress;\n        _primaryChildFragment3.sibling = _fallbackChildFragment3;\n        _fallbackChildFragment3.effectTag |= Placement;\n        _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = _primaryChildFragment3;\n        return _fallbackChildFragment3;\n      } else {\n        // Still haven't timed out. Continue rendering the children, like we\n        // normally do.\n        workInProgress.memoizedState = null;\n        var _nextPrimaryChildren2 = nextProps.children;\n        return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);\n      }\n    }\n  }\n}\n\nfunction scheduleWorkOnFiber(fiber, renderExpirationTime) {\n  if (fiber.expirationTime < renderExpirationTime) {\n    fiber.expirationTime = renderExpirationTime;\n  }\n\n  var alternate = fiber.alternate;\n\n  if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n    alternate.expirationTime = renderExpirationTime;\n  }\n\n  scheduleWorkOnParentPath(fiber.return, renderExpirationTime);\n}\n\nfunction propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) {\n  // Mark any Suspense boundaries with fallbacks as having work to do.\n  // If they were previously forced into fallbacks, they may now be able\n  // to unblock.\n  var node = firstChild;\n\n  while (node !== null) {\n    if (node.tag === SuspenseComponent) {\n      var state = node.memoizedState;\n\n      if (state !== null) {\n        scheduleWorkOnFiber(node, renderExpirationTime);\n      }\n    } else if (node.tag === SuspenseListComponent) {\n      // If the tail is hidden there might not be an Suspense boundaries\n      // to schedule work on. In this case we have to schedule it on the\n      // list itself.\n      // We don't have to traverse to the children of the list since\n      // the list will propagate the change when it rerenders.\n      scheduleWorkOnFiber(node, renderExpirationTime);\n    } else if (node.child !== null) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === workInProgress) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === workInProgress) {\n        return;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction findLastContentRow(firstChild) {\n  // This is going to find the last row among these children that is already\n  // showing content on the screen, as opposed to being in fallback state or\n  // new. If a row has multiple Suspense boundaries, any of them being in the\n  // fallback state, counts as the whole row being in a fallback state.\n  // Note that the \"rows\" will be workInProgress, but any nested children\n  // will still be current since we haven't rendered them yet. The mounted\n  // order may not be the same as the new order. We use the new order.\n  var row = firstChild;\n  var lastContentRow = null;\n\n  while (row !== null) {\n    var currentRow = row.alternate; // New rows can't be content rows.\n\n    if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n      lastContentRow = row;\n    }\n\n    row = row.sibling;\n  }\n\n  return lastContentRow;\n}\n\nfunction validateRevealOrder(revealOrder) {\n  {\n    if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {\n      didWarnAboutRevealOrder[revealOrder] = true;\n\n      if (typeof revealOrder === 'string') {\n        switch (revealOrder.toLowerCase()) {\n          case 'together':\n          case 'forwards':\n          case 'backwards':\n            {\n              error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase \"%s\" instead.', revealOrder, revealOrder.toLowerCase());\n\n              break;\n            }\n\n          case 'forward':\n          case 'backward':\n            {\n              error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use \"%ss\" instead.', revealOrder, revealOrder.toLowerCase());\n\n              break;\n            }\n\n          default:\n            error('\"%s\" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n\n            break;\n        }\n      } else {\n        error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n      }\n    }\n  }\n}\n\nfunction validateTailOptions(tailMode, revealOrder) {\n  {\n    if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {\n      if (tailMode !== 'collapsed' && tailMode !== 'hidden') {\n        didWarnAboutTailOptions[tailMode] = true;\n\n        error('\"%s\" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean \"collapsed\" or \"hidden\"?', tailMode);\n      } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {\n        didWarnAboutTailOptions[tailMode] = true;\n\n        error('<SuspenseList tail=\"%s\" /> is only valid if revealOrder is ' + '\"forwards\" or \"backwards\". ' + 'Did you mean to specify revealOrder=\"forwards\"?', tailMode);\n      }\n    }\n  }\n}\n\nfunction validateSuspenseListNestedChild(childSlot, index) {\n  {\n    var isArray = Array.isArray(childSlot);\n    var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function';\n\n    if (isArray || isIterable) {\n      var type = isArray ? 'array' : 'iterable';\n\n      error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);\n\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction validateSuspenseListChildren(children, revealOrder) {\n  {\n    if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {\n      if (Array.isArray(children)) {\n        for (var i = 0; i < children.length; i++) {\n          if (!validateSuspenseListNestedChild(children[i], i)) {\n            return;\n          }\n        }\n      } else {\n        var iteratorFn = getIteratorFn(children);\n\n        if (typeof iteratorFn === 'function') {\n          var childrenIterator = iteratorFn.call(children);\n\n          if (childrenIterator) {\n            var step = childrenIterator.next();\n            var _i = 0;\n\n            for (; !step.done; step = childrenIterator.next()) {\n              if (!validateSuspenseListNestedChild(step.value, _i)) {\n                return;\n              }\n\n              _i++;\n            }\n          }\n        } else {\n          error('A single row was passed to a <SuspenseList revealOrder=\"%s\" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);\n        }\n      }\n    }\n  }\n}\n\nfunction initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) {\n  var renderState = workInProgress.memoizedState;\n\n  if (renderState === null) {\n    workInProgress.memoizedState = {\n      isBackwards: isBackwards,\n      rendering: null,\n      renderingStartTime: 0,\n      last: lastContentRow,\n      tail: tail,\n      tailExpiration: 0,\n      tailMode: tailMode,\n      lastEffect: lastEffectBeforeRendering\n    };\n  } else {\n    // We can reuse the existing object from previous renders.\n    renderState.isBackwards = isBackwards;\n    renderState.rendering = null;\n    renderState.renderingStartTime = 0;\n    renderState.last = lastContentRow;\n    renderState.tail = tail;\n    renderState.tailExpiration = 0;\n    renderState.tailMode = tailMode;\n    renderState.lastEffect = lastEffectBeforeRendering;\n  }\n} // This can end up rendering this component multiple passes.\n// The first pass splits the children fibers into two sets. A head and tail.\n// We first render the head. If anything is in fallback state, we do another\n// pass through beginWork to rerender all children (including the tail) with\n// the force suspend context. If the first render didn't have anything in\n// in fallback state. Then we render each row in the tail one-by-one.\n// That happens in the completeWork phase without going back to beginWork.\n\n\nfunction updateSuspenseListComponent(current, workInProgress, renderExpirationTime) {\n  var nextProps = workInProgress.pendingProps;\n  var revealOrder = nextProps.revealOrder;\n  var tailMode = nextProps.tail;\n  var newChildren = nextProps.children;\n  validateRevealOrder(revealOrder);\n  validateTailOptions(tailMode, revealOrder);\n  validateSuspenseListChildren(newChildren, revealOrder);\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  var suspenseContext = suspenseStackCursor.current;\n  var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);\n\n  if (shouldForceFallback) {\n    suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n    workInProgress.effectTag |= DidCapture;\n  } else {\n    var didSuspendBefore = current !== null && (current.effectTag & DidCapture) !== NoEffect;\n\n    if (didSuspendBefore) {\n      // If we previously forced a fallback, we need to schedule work\n      // on any nested boundaries to let them know to try to render\n      // again. This is the same as context updating.\n      propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime);\n    }\n\n    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n  }\n\n  pushSuspenseContext(workInProgress, suspenseContext);\n\n  if ((workInProgress.mode & BlockingMode) === NoMode) {\n    // Outside of blocking mode, SuspenseList doesn't work so we just\n    // use make it a noop by treating it as the default revealOrder.\n    workInProgress.memoizedState = null;\n  } else {\n    switch (revealOrder) {\n      case 'forwards':\n        {\n          var lastContentRow = findLastContentRow(workInProgress.child);\n          var tail;\n\n          if (lastContentRow === null) {\n            // The whole list is part of the tail.\n            // TODO: We could fast path by just rendering the tail now.\n            tail = workInProgress.child;\n            workInProgress.child = null;\n          } else {\n            // Disconnect the tail rows after the content row.\n            // We're going to render them separately later.\n            tail = lastContentRow.sibling;\n            lastContentRow.sibling = null;\n          }\n\n          initSuspenseListRenderState(workInProgress, false, // isBackwards\n          tail, lastContentRow, tailMode, workInProgress.lastEffect);\n          break;\n        }\n\n      case 'backwards':\n        {\n          // We're going to find the first row that has existing content.\n          // At the same time we're going to reverse the list of everything\n          // we pass in the meantime. That's going to be our tail in reverse\n          // order.\n          var _tail = null;\n          var row = workInProgress.child;\n          workInProgress.child = null;\n\n          while (row !== null) {\n            var currentRow = row.alternate; // New rows can't be content rows.\n\n            if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n              // This is the beginning of the main content.\n              workInProgress.child = row;\n              break;\n            }\n\n            var nextRow = row.sibling;\n            row.sibling = _tail;\n            _tail = row;\n            row = nextRow;\n          } // TODO: If workInProgress.child is null, we can continue on the tail immediately.\n\n\n          initSuspenseListRenderState(workInProgress, true, // isBackwards\n          _tail, null, // last\n          tailMode, workInProgress.lastEffect);\n          break;\n        }\n\n      case 'together':\n        {\n          initSuspenseListRenderState(workInProgress, false, // isBackwards\n          null, // tail\n          null, // last\n          undefined, workInProgress.lastEffect);\n          break;\n        }\n\n      default:\n        {\n          // The default reveal order is the same as not having\n          // a boundary.\n          workInProgress.memoizedState = null;\n        }\n    }\n  }\n\n  return workInProgress.child;\n}\n\nfunction updatePortalComponent(current, workInProgress, renderExpirationTime) {\n  pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n  var nextChildren = workInProgress.pendingProps;\n\n  if (current === null) {\n    // Portals are special because we don't append the children during mount\n    // but at commit. Therefore we need to track insertions which the normal\n    // flow doesn't do during mount. This doesn't happen at the root because\n    // the root always starts with a \"current\" with a null child.\n    // TODO: Consider unifying this with how the root works.\n    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  } else {\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  }\n\n  return workInProgress.child;\n}\n\nfunction updateContextProvider(current, workInProgress, renderExpirationTime) {\n  var providerType = workInProgress.type;\n  var context = providerType._context;\n  var newProps = workInProgress.pendingProps;\n  var oldProps = workInProgress.memoizedProps;\n  var newValue = newProps.value;\n\n  {\n    var providerPropTypes = workInProgress.type.propTypes;\n\n    if (providerPropTypes) {\n      checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);\n    }\n  }\n\n  pushProvider(workInProgress, newValue);\n\n  if (oldProps !== null) {\n    var oldValue = oldProps.value;\n    var changedBits = calculateChangedBits(context, newValue, oldValue);\n\n    if (changedBits === 0) {\n      // No change. Bailout early if children are the same.\n      if (oldProps.children === newProps.children && !hasContextChanged()) {\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    } else {\n      // The context value changed. Search for matching consumers and schedule\n      // them to update.\n      propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);\n    }\n  }\n\n  var newChildren = newProps.children;\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nvar hasWarnedAboutUsingContextAsConsumer = false;\n\nfunction updateContextConsumer(current, workInProgress, renderExpirationTime) {\n  var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In\n  // DEV mode, we create a separate object for Context.Consumer that acts\n  // like a proxy to Context. This proxy object adds unnecessary code in PROD\n  // so we use the old behaviour (Context.Consumer references Context) to\n  // reduce size and overhead. The separate object references context via\n  // a property called \"_context\", which also gives us the ability to check\n  // in DEV mode if this property exists or not and warn if it does not.\n\n  {\n    if (context._context === undefined) {\n      // This may be because it's a Context (rather than a Consumer).\n      // Or it may be because it's older React where they're the same thing.\n      // We only want to warn if we're sure it's a new React.\n      if (context !== context.Consumer) {\n        if (!hasWarnedAboutUsingContextAsConsumer) {\n          hasWarnedAboutUsingContextAsConsumer = true;\n\n          error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n        }\n      }\n    } else {\n      context = context._context;\n    }\n  }\n\n  var newProps = workInProgress.pendingProps;\n  var render = newProps.children;\n\n  {\n    if (typeof render !== 'function') {\n      error('A context consumer was rendered with multiple children, or a child ' + \"that isn't a function. A context consumer expects a single child \" + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');\n    }\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var newValue = readContext(context, newProps.unstable_observedBits);\n  var newChildren;\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    newChildren = render(newValue);\n    setIsRendering(false);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction markWorkInProgressReceivedUpdate() {\n  didReceiveUpdate = true;\n}\n\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime) {\n  cancelWorkTimer(workInProgress);\n\n  if (current !== null) {\n    // Reuse previous dependencies\n    workInProgress.dependencies = current.dependencies;\n  }\n\n  {\n    // Don't update \"base\" render times for bailouts.\n    stopProfilerTimerIfRunning();\n  }\n\n  var updateExpirationTime = workInProgress.expirationTime;\n\n  if (updateExpirationTime !== NoWork) {\n    markUnprocessedUpdateTime(updateExpirationTime);\n  } // Check if the children have any pending work.\n\n\n  var childExpirationTime = workInProgress.childExpirationTime;\n\n  if (childExpirationTime < renderExpirationTime) {\n    // The children don't have any work either. We can skip them.\n    // TODO: Once we add back resuming, we should check if the children are\n    // a work-in-progress set. If so, we need to transfer their effects.\n    return null;\n  } else {\n    // This fiber doesn't have work, but its subtree does. Clone the child\n    // fibers and continue.\n    cloneChildFibers(current, workInProgress);\n    return workInProgress.child;\n  }\n}\n\nfunction remountFiber(current, oldWorkInProgress, newWorkInProgress) {\n  {\n    var returnFiber = oldWorkInProgress.return;\n\n    if (returnFiber === null) {\n      throw new Error('Cannot swap the root fiber.');\n    } // Disconnect from the old current.\n    // It will get deleted.\n\n\n    current.alternate = null;\n    oldWorkInProgress.alternate = null; // Connect to the new tree.\n\n    newWorkInProgress.index = oldWorkInProgress.index;\n    newWorkInProgress.sibling = oldWorkInProgress.sibling;\n    newWorkInProgress.return = oldWorkInProgress.return;\n    newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.\n\n    if (oldWorkInProgress === returnFiber.child) {\n      returnFiber.child = newWorkInProgress;\n    } else {\n      var prevSibling = returnFiber.child;\n\n      if (prevSibling === null) {\n        throw new Error('Expected parent to have a child.');\n      }\n\n      while (prevSibling.sibling !== oldWorkInProgress) {\n        prevSibling = prevSibling.sibling;\n\n        if (prevSibling === null) {\n          throw new Error('Expected to find the previous sibling.');\n        }\n      }\n\n      prevSibling.sibling = newWorkInProgress;\n    } // Delete the old fiber and place the new one.\n    // Since the old fiber is disconnected, we have to schedule it manually.\n\n\n    var last = returnFiber.lastEffect;\n\n    if (last !== null) {\n      last.nextEffect = current;\n      returnFiber.lastEffect = current;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = current;\n    }\n\n    current.nextEffect = null;\n    current.effectTag = Deletion;\n    newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber.\n\n    return newWorkInProgress;\n  }\n}\n\nfunction beginWork(current, workInProgress, renderExpirationTime) {\n  var updateExpirationTime = workInProgress.expirationTime;\n\n  {\n    if (workInProgress._debugNeedsRemount && current !== null) {\n      // This will restart the begin phase with a new fiber.\n      return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime));\n    }\n  }\n\n  if (current !== null) {\n    var oldProps = current.memoizedProps;\n    var newProps = workInProgress.pendingProps;\n\n    if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:\n     workInProgress.type !== current.type )) {\n      // If props or context changed, mark the fiber as having performed work.\n      // This may be unset if the props are determined to be equal later (memo).\n      didReceiveUpdate = true;\n    } else if (updateExpirationTime < renderExpirationTime) {\n      didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering\n      // the begin phase. There's still some bookkeeping we that needs to be done\n      // in this optimized path, mostly pushing stuff onto the stack.\n\n      switch (workInProgress.tag) {\n        case HostRoot:\n          pushHostRootContext(workInProgress);\n          resetHydrationState();\n          break;\n\n        case HostComponent:\n          pushHostContext(workInProgress);\n\n          if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) {\n            {\n              markSpawnedWork(Never);\n            } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n            workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n            return null;\n          }\n\n          break;\n\n        case ClassComponent:\n          {\n            var Component = workInProgress.type;\n\n            if (isContextProvider(Component)) {\n              pushContextProvider(workInProgress);\n            }\n\n            break;\n          }\n\n        case HostPortal:\n          pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n          break;\n\n        case ContextProvider:\n          {\n            var newValue = workInProgress.memoizedProps.value;\n            pushProvider(workInProgress, newValue);\n            break;\n          }\n\n        case Profiler:\n          {\n            // Profiler should only call onRender when one of its descendants actually rendered.\n            var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n            if (hasChildWork) {\n              workInProgress.effectTag |= Update;\n            }\n          }\n\n          break;\n\n        case SuspenseComponent:\n          {\n            var state = workInProgress.memoizedState;\n\n            if (state !== null) {\n              // whether to retry the primary children, or to skip over it and\n              // go straight to the fallback. Check the priority of the primary\n              // child fragment.\n\n\n              var primaryChildFragment = workInProgress.child;\n              var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;\n\n              if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {\n                // The primary children have pending work. Use the normal path\n                // to attempt to render the primary children again.\n                return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n              } else {\n                pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient\n                // priority. Bailout.\n\n                var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n\n                if (child !== null) {\n                  // The fallback children have pending work. Skip over the\n                  // primary children and work on the fallback.\n                  return child.sibling;\n                } else {\n                  return null;\n                }\n              }\n            } else {\n              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));\n            }\n\n            break;\n          }\n\n        case SuspenseListComponent:\n          {\n            var didSuspendBefore = (current.effectTag & DidCapture) !== NoEffect;\n\n            var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n            if (didSuspendBefore) {\n              if (_hasChildWork) {\n                // If something was in fallback state last time, and we have all the\n                // same children then we're still in progressive loading state.\n                // Something might get unblocked by state updates or retries in the\n                // tree which will affect the tail. So we need to use the normal\n                // path to compute the correct tail.\n                return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n              } // If none of the children had any work, that means that none of\n              // them got retried so they'll still be blocked in the same way\n              // as before. We can fast bail out.\n\n\n              workInProgress.effectTag |= DidCapture;\n            } // If nothing suspended before and we're rendering the same children,\n            // then the tail doesn't matter. Anything new that suspends will work\n            // in the \"together\" mode, so we can continue from the state we had.\n\n\n            var renderState = workInProgress.memoizedState;\n\n            if (renderState !== null) {\n              // Reset to the \"together\" mode in case we've started a different\n              // update in the past but didn't complete it.\n              renderState.rendering = null;\n              renderState.tail = null;\n            }\n\n            pushSuspenseContext(workInProgress, suspenseStackCursor.current);\n\n            if (_hasChildWork) {\n              break;\n            } else {\n              // If none of the children had any work, that means that none of\n              // them got retried so they'll still be blocked in the same way\n              // as before. We can fast bail out.\n              return null;\n            }\n          }\n      }\n\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    } else {\n      // An update was scheduled on this fiber, but there are no new props\n      // nor legacy context. Set this to false. If an update queue or context\n      // consumer produces a changed value, it will set this to true. Otherwise,\n      // the component will assume the children have not changed and bail out.\n      didReceiveUpdate = false;\n    }\n  } else {\n    didReceiveUpdate = false;\n  } // Before entering the begin phase, clear pending update priority.\n  // TODO: This assumes that we're about to evaluate the component and process\n  // the update queue. However, there's an exception: SimpleMemoComponent\n  // sometimes bails out later in the begin phase. This indicates that we should\n  // move this assignment out of the common path and into each branch.\n\n\n  workInProgress.expirationTime = NoWork;\n\n  switch (workInProgress.tag) {\n    case IndeterminateComponent:\n      {\n        return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderExpirationTime);\n      }\n\n    case LazyComponent:\n      {\n        var elementType = workInProgress.elementType;\n        return mountLazyComponent(current, workInProgress, elementType, updateExpirationTime, renderExpirationTime);\n      }\n\n    case FunctionComponent:\n      {\n        var _Component = workInProgress.type;\n        var unresolvedProps = workInProgress.pendingProps;\n        var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);\n        return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderExpirationTime);\n      }\n\n    case ClassComponent:\n      {\n        var _Component2 = workInProgress.type;\n        var _unresolvedProps = workInProgress.pendingProps;\n\n        var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);\n\n        return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderExpirationTime);\n      }\n\n    case HostRoot:\n      return updateHostRoot(current, workInProgress, renderExpirationTime);\n\n    case HostComponent:\n      return updateHostComponent(current, workInProgress, renderExpirationTime);\n\n    case HostText:\n      return updateHostText(current, workInProgress);\n\n    case SuspenseComponent:\n      return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n\n    case HostPortal:\n      return updatePortalComponent(current, workInProgress, renderExpirationTime);\n\n    case ForwardRef:\n      {\n        var type = workInProgress.type;\n        var _unresolvedProps2 = workInProgress.pendingProps;\n\n        var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);\n\n        return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderExpirationTime);\n      }\n\n    case Fragment:\n      return updateFragment(current, workInProgress, renderExpirationTime);\n\n    case Mode:\n      return updateMode(current, workInProgress, renderExpirationTime);\n\n    case Profiler:\n      return updateProfiler(current, workInProgress, renderExpirationTime);\n\n    case ContextProvider:\n      return updateContextProvider(current, workInProgress, renderExpirationTime);\n\n    case ContextConsumer:\n      return updateContextConsumer(current, workInProgress, renderExpirationTime);\n\n    case MemoComponent:\n      {\n        var _type2 = workInProgress.type;\n        var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.\n\n        var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);\n\n        {\n          if (workInProgress.type !== workInProgress.elementType) {\n            var outerPropTypes = _type2.propTypes;\n\n            if (outerPropTypes) {\n              checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only\n              'prop', getComponentName(_type2), getCurrentFiberStackInDev);\n            }\n          }\n        }\n\n        _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);\n        return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);\n      }\n\n    case SimpleMemoComponent:\n      {\n        return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);\n      }\n\n    case IncompleteClassComponent:\n      {\n        var _Component3 = workInProgress.type;\n        var _unresolvedProps4 = workInProgress.pendingProps;\n\n        var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);\n\n        return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);\n      }\n\n    case SuspenseListComponent:\n      {\n        return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n      }\n  }\n\n  {\n    {\n      throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction markUpdate(workInProgress) {\n  // Tag the fiber with an update effect. This turns a Placement into\n  // a PlacementAndUpdate.\n  workInProgress.effectTag |= Update;\n}\n\nfunction markRef$1(workInProgress) {\n  workInProgress.effectTag |= Ref;\n}\n\nvar appendAllChildren;\nvar updateHostContainer;\nvar updateHostComponent$1;\nvar updateHostText$1;\n\n{\n  // Mutation mode\n  appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {\n    // We only have the top Fiber that was created but we need recurse down its\n    // children to find all the terminal nodes.\n    var node = workInProgress.child;\n\n    while (node !== null) {\n      if (node.tag === HostComponent || node.tag === HostText) {\n        appendInitialChild(parent, node.stateNode);\n      } else if (node.tag === HostPortal) ; else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === workInProgress) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === workInProgress) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  };\n\n  updateHostContainer = function (workInProgress) {// Noop\n  };\n\n  updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {\n    // If we have an alternate, that means this is an update and we need to\n    // schedule a side-effect to do the updates.\n    var oldProps = current.memoizedProps;\n\n    if (oldProps === newProps) {\n      // In mutation mode, this is sufficient for a bailout because\n      // we won't touch this node even if children changed.\n      return;\n    } // If we get updated because one of our children updated, we don't\n    // have newProps so we'll have to reuse them.\n    // TODO: Split the update API as separate for the props vs. children.\n    // Even better would be if children weren't special cased at all tho.\n\n\n    var instance = workInProgress.stateNode;\n    var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host\n    // component is hitting the resume path. Figure out why. Possibly\n    // related to `hidden`.\n\n    var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.\n\n    workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n    // is a new ref we mark this as an update. All the work is done in commitWork.\n\n    if (updatePayload) {\n      markUpdate(workInProgress);\n    }\n  };\n\n  updateHostText$1 = function (current, workInProgress, oldText, newText) {\n    // If the text differs, mark it as an update. All the work in done in commitWork.\n    if (oldText !== newText) {\n      markUpdate(workInProgress);\n    }\n  };\n}\n\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n  switch (renderState.tailMode) {\n    case 'hidden':\n      {\n        // Any insertions at the end of the tail list after this point\n        // should be invisible. If there are already mounted boundaries\n        // anything before them are not considered for collapsing.\n        // Therefore we need to go through the whole tail to find if\n        // there are any.\n        var tailNode = renderState.tail;\n        var lastTailNode = null;\n\n        while (tailNode !== null) {\n          if (tailNode.alternate !== null) {\n            lastTailNode = tailNode;\n          }\n\n          tailNode = tailNode.sibling;\n        } // Next we're simply going to delete all insertions after the\n        // last rendered item.\n\n\n        if (lastTailNode === null) {\n          // All remaining items in the tail are insertions.\n          renderState.tail = null;\n        } else {\n          // Detach the insertion after the last node that was already\n          // inserted.\n          lastTailNode.sibling = null;\n        }\n\n        break;\n      }\n\n    case 'collapsed':\n      {\n        // Any insertions at the end of the tail list after this point\n        // should be invisible. If there are already mounted boundaries\n        // anything before them are not considered for collapsing.\n        // Therefore we need to go through the whole tail to find if\n        // there are any.\n        var _tailNode = renderState.tail;\n        var _lastTailNode = null;\n\n        while (_tailNode !== null) {\n          if (_tailNode.alternate !== null) {\n            _lastTailNode = _tailNode;\n          }\n\n          _tailNode = _tailNode.sibling;\n        } // Next we're simply going to delete all insertions after the\n        // last rendered item.\n\n\n        if (_lastTailNode === null) {\n          // All remaining items in the tail are insertions.\n          if (!hasRenderedATailFallback && renderState.tail !== null) {\n            // We suspended during the head. We want to show at least one\n            // row at the tail. So we'll keep on and cut off the rest.\n            renderState.tail.sibling = null;\n          } else {\n            renderState.tail = null;\n          }\n        } else {\n          // Detach the insertion after the last node that was already\n          // inserted.\n          _lastTailNode.sibling = null;\n        }\n\n        break;\n      }\n  }\n}\n\nfunction completeWork(current, workInProgress, renderExpirationTime) {\n  var newProps = workInProgress.pendingProps;\n\n  switch (workInProgress.tag) {\n    case IndeterminateComponent:\n    case LazyComponent:\n    case SimpleMemoComponent:\n    case FunctionComponent:\n    case ForwardRef:\n    case Fragment:\n    case Mode:\n    case Profiler:\n    case ContextConsumer:\n    case MemoComponent:\n      return null;\n\n    case ClassComponent:\n      {\n        var Component = workInProgress.type;\n\n        if (isContextProvider(Component)) {\n          popContext(workInProgress);\n        }\n\n        return null;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(workInProgress);\n        popTopLevelContextObject(workInProgress);\n        var fiberRoot = workInProgress.stateNode;\n\n        if (fiberRoot.pendingContext) {\n          fiberRoot.context = fiberRoot.pendingContext;\n          fiberRoot.pendingContext = null;\n        }\n\n        if (current === null || current.child === null) {\n          // If we hydrated, pop so that we can delete any remaining children\n          // that weren't hydrated.\n          var wasHydrated = popHydrationState(workInProgress);\n\n          if (wasHydrated) {\n            // If we hydrated, then we'll need to schedule an update for\n            // the commit side-effects on the root.\n            markUpdate(workInProgress);\n          }\n        }\n\n        updateHostContainer(workInProgress);\n        return null;\n      }\n\n    case HostComponent:\n      {\n        popHostContext(workInProgress);\n        var rootContainerInstance = getRootHostContainer();\n        var type = workInProgress.type;\n\n        if (current !== null && workInProgress.stateNode != null) {\n          updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);\n\n          if (current.ref !== workInProgress.ref) {\n            markRef$1(workInProgress);\n          }\n        } else {\n          if (!newProps) {\n            if (!(workInProgress.stateNode !== null)) {\n              {\n                throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n              }\n            } // This can happen when we abort work.\n\n\n            return null;\n          }\n\n          var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context\n          // \"stack\" as the parent. Then append children as we go in beginWork\n          // or completeWork depending on whether we want to add them top->down or\n          // bottom->up. Top->down is faster in IE11.\n\n          var _wasHydrated = popHydrationState(workInProgress);\n\n          if (_wasHydrated) {\n            // TODO: Move this and createInstance step into the beginPhase\n            // to consolidate.\n            if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {\n              // If changes to the hydrated node need to be applied at the\n              // commit-phase we mark this as such.\n              markUpdate(workInProgress);\n            }\n          } else {\n            var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);\n            appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners\n\n            workInProgress.stateNode = instance;\n            // (eg DOM renderer supports auto-focus for certain elements).\n            // Make sure such renderers get scheduled for later work.\n\n\n            if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {\n              markUpdate(workInProgress);\n            }\n          }\n\n          if (workInProgress.ref !== null) {\n            // If there is a ref on a host node we need to schedule a callback\n            markRef$1(workInProgress);\n          }\n        }\n\n        return null;\n      }\n\n    case HostText:\n      {\n        var newText = newProps;\n\n        if (current && workInProgress.stateNode != null) {\n          var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need\n          // to schedule a side-effect to do the updates.\n\n          updateHostText$1(current, workInProgress, oldText, newText);\n        } else {\n          if (typeof newText !== 'string') {\n            if (!(workInProgress.stateNode !== null)) {\n              {\n                throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n              }\n            } // This can happen when we abort work.\n\n          }\n\n          var _rootContainerInstance = getRootHostContainer();\n\n          var _currentHostContext = getHostContext();\n\n          var _wasHydrated2 = popHydrationState(workInProgress);\n\n          if (_wasHydrated2) {\n            if (prepareToHydrateHostTextInstance(workInProgress)) {\n              markUpdate(workInProgress);\n            }\n          } else {\n            workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);\n          }\n        }\n\n        return null;\n      }\n\n    case SuspenseComponent:\n      {\n        popSuspenseContext(workInProgress);\n        var nextState = workInProgress.memoizedState;\n\n        if ((workInProgress.effectTag & DidCapture) !== NoEffect) {\n          // Something suspended. Re-render with the fallback children.\n          workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list.\n\n          return workInProgress;\n        }\n\n        var nextDidTimeout = nextState !== null;\n        var prevDidTimeout = false;\n\n        if (current === null) {\n          if (workInProgress.memoizedProps.fallback !== undefined) {\n            popHydrationState(workInProgress);\n          }\n        } else {\n          var prevState = current.memoizedState;\n          prevDidTimeout = prevState !== null;\n\n          if (!nextDidTimeout && prevState !== null) {\n            // We just switched from the fallback to the normal children.\n            // Delete the fallback.\n            // TODO: Would it be better to store the fallback fragment on\n            // the stateNode during the begin phase?\n            var currentFallbackChild = current.child.sibling;\n\n            if (currentFallbackChild !== null) {\n              // Deletions go at the beginning of the return fiber's effect list\n              var first = workInProgress.firstEffect;\n\n              if (first !== null) {\n                workInProgress.firstEffect = currentFallbackChild;\n                currentFallbackChild.nextEffect = first;\n              } else {\n                workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;\n                currentFallbackChild.nextEffect = null;\n              }\n\n              currentFallbackChild.effectTag = Deletion;\n            }\n          }\n        }\n\n        if (nextDidTimeout && !prevDidTimeout) {\n          // If this subtreee is running in blocking mode we can suspend,\n          // otherwise we won't suspend.\n          // TODO: This will still suspend a synchronous tree if anything\n          // in the concurrent tree already suspended during this render.\n          // This is a known bug.\n          if ((workInProgress.mode & BlockingMode) !== NoMode) {\n            // TODO: Move this back to throwException because this is too late\n            // if this is a large tree which is common for initial loads. We\n            // don't know if we should restart a render or not until we get\n            // this marker, and this is too late.\n            // If this render already had a ping or lower pri updates,\n            // and this is the first time we know we're going to suspend we\n            // should be able to immediately restart from within throwException.\n            var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true;\n\n            if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {\n              // If this was in an invisible tree or a new render, then showing\n              // this boundary is ok.\n              renderDidSuspend();\n            } else {\n              // Otherwise, we're going to have to hide content so we should\n              // suspend for longer if possible.\n              renderDidSuspendDelayIfPossible();\n            }\n          }\n        }\n\n        {\n          // TODO: Only schedule updates if these values are non equal, i.e. it changed.\n          if (nextDidTimeout || prevDidTimeout) {\n            // If this boundary just timed out, schedule an effect to attach a\n            // retry listener to the promise. This flag is also used to hide the\n            // primary children. In mutation mode, we also need the flag to\n            // *unhide* children that were previously hidden, so check if this\n            // is currently timed out, too.\n            workInProgress.effectTag |= Update;\n          }\n        }\n\n        return null;\n      }\n\n    case HostPortal:\n      popHostContainer(workInProgress);\n      updateHostContainer(workInProgress);\n      return null;\n\n    case ContextProvider:\n      // Pop provider fiber\n      popProvider(workInProgress);\n      return null;\n\n    case IncompleteClassComponent:\n      {\n        // Same as class component case. I put it down here so that the tags are\n        // sequential to ensure this switch is compiled to a jump table.\n        var _Component = workInProgress.type;\n\n        if (isContextProvider(_Component)) {\n          popContext(workInProgress);\n        }\n\n        return null;\n      }\n\n    case SuspenseListComponent:\n      {\n        popSuspenseContext(workInProgress);\n        var renderState = workInProgress.memoizedState;\n\n        if (renderState === null) {\n          // We're running in the default, \"independent\" mode.\n          // We don't do anything in this mode.\n          return null;\n        }\n\n        var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect;\n        var renderedTail = renderState.rendering;\n\n        if (renderedTail === null) {\n          // We just rendered the head.\n          if (!didSuspendAlready) {\n            // This is the first pass. We need to figure out if anything is still\n            // suspended in the rendered set.\n            // If new content unsuspended, but there's still some content that\n            // didn't. Then we need to do a second pass that forces everything\n            // to keep showing their fallbacks.\n            // We might be suspended if something in this render pass suspended, or\n            // something in the previous committed pass suspended. Otherwise,\n            // there's no chance so we can skip the expensive call to\n            // findFirstSuspended.\n            var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect);\n\n            if (!cannotBeSuspended) {\n              var row = workInProgress.child;\n\n              while (row !== null) {\n                var suspended = findFirstSuspended(row);\n\n                if (suspended !== null) {\n                  didSuspendAlready = true;\n                  workInProgress.effectTag |= DidCapture;\n                  cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as\n                  // part of the second pass. In that case nothing will subscribe to\n                  // its thennables. Instead, we'll transfer its thennables to the\n                  // SuspenseList so that it can retry if they resolve.\n                  // There might be multiple of these in the list but since we're\n                  // going to wait for all of them anyway, it doesn't really matter\n                  // which ones gets to ping. In theory we could get clever and keep\n                  // track of how many dependencies remain but it gets tricky because\n                  // in the meantime, we can add/remove/change items and dependencies.\n                  // We might bail out of the loop before finding any but that\n                  // doesn't matter since that means that the other boundaries that\n                  // we did find already has their listeners attached.\n\n                  var newThennables = suspended.updateQueue;\n\n                  if (newThennables !== null) {\n                    workInProgress.updateQueue = newThennables;\n                    workInProgress.effectTag |= Update;\n                  } // Rerender the whole list, but this time, we'll force fallbacks\n                  // to stay in place.\n                  // Reset the effect list before doing the second pass since that's now invalid.\n\n\n                  if (renderState.lastEffect === null) {\n                    workInProgress.firstEffect = null;\n                  }\n\n                  workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state.\n\n                  resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately\n                  // rerender the children.\n\n                  pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));\n                  return workInProgress.child;\n                }\n\n                row = row.sibling;\n              }\n            }\n          } else {\n            cutOffTailIfNeeded(renderState, false);\n          } // Next we're going to render the tail.\n\n        } else {\n          // Append the rendered row to the child list.\n          if (!didSuspendAlready) {\n            var _suspended = findFirstSuspended(renderedTail);\n\n            if (_suspended !== null) {\n              workInProgress.effectTag |= DidCapture;\n              didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't\n              // get lost if this row ends up dropped during a second pass.\n\n              var _newThennables = _suspended.updateQueue;\n\n              if (_newThennables !== null) {\n                workInProgress.updateQueue = _newThennables;\n                workInProgress.effectTag |= Update;\n              }\n\n              cutOffTailIfNeeded(renderState, true); // This might have been modified.\n\n              if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) {\n                // We need to delete the row we just rendered.\n                // Reset the effect list to what it was before we rendered this\n                // child. The nested children have already appended themselves.\n                var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point.\n\n                if (lastEffect !== null) {\n                  lastEffect.nextEffect = null;\n                } // We're done.\n\n\n                return null;\n              }\n            } else if ( // The time it took to render last row is greater than time until\n            // the expiration.\n            now() * 2 - renderState.renderingStartTime > renderState.tailExpiration && renderExpirationTime > Never) {\n              // We have now passed our CPU deadline and we'll just give up further\n              // attempts to render the main content and only render fallbacks.\n              // The assumption is that this is usually faster.\n              workInProgress.effectTag |= DidCapture;\n              didSuspendAlready = true;\n              cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this\n              // to get it started back up to attempt the next item. If we can show\n              // them, then they really have the same priority as this render.\n              // So we'll pick it back up the very next render pass once we've had\n              // an opportunity to yield for paint.\n\n              var nextPriority = renderExpirationTime - 1;\n              workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority;\n\n              {\n                markSpawnedWork(nextPriority);\n              }\n            }\n          }\n\n          if (renderState.isBackwards) {\n            // The effect list of the backwards tail will have been added\n            // to the end. This breaks the guarantee that life-cycles fire in\n            // sibling order but that isn't a strong guarantee promised by React.\n            // Especially since these might also just pop in during future commits.\n            // Append to the beginning of the list.\n            renderedTail.sibling = workInProgress.child;\n            workInProgress.child = renderedTail;\n          } else {\n            var previousSibling = renderState.last;\n\n            if (previousSibling !== null) {\n              previousSibling.sibling = renderedTail;\n            } else {\n              workInProgress.child = renderedTail;\n            }\n\n            renderState.last = renderedTail;\n          }\n        }\n\n        if (renderState.tail !== null) {\n          // We still have tail rows to render.\n          if (renderState.tailExpiration === 0) {\n            // Heuristic for how long we're willing to spend rendering rows\n            // until we just give up and show what we have so far.\n            var TAIL_EXPIRATION_TIMEOUT_MS = 500;\n            renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; // TODO: This is meant to mimic the train model or JND but this\n            // is a per component value. It should really be since the start\n            // of the total render or last commit. Consider using something like\n            // globalMostRecentFallbackTime. That doesn't account for being\n            // suspended for part of the time or when it's a new render.\n            // It should probably use a global start time value instead.\n          } // Pop a row.\n\n\n          var next = renderState.tail;\n          renderState.rendering = next;\n          renderState.tail = next.sibling;\n          renderState.lastEffect = workInProgress.lastEffect;\n          renderState.renderingStartTime = now();\n          next.sibling = null; // Restore the context.\n          // TODO: We can probably just avoid popping it instead and only\n          // setting it the first time we go from not suspended to suspended.\n\n          var suspenseContext = suspenseStackCursor.current;\n\n          if (didSuspendAlready) {\n            suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n          } else {\n            suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n          }\n\n          pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.\n\n          return next;\n        }\n\n        return null;\n      }\n  }\n\n  {\n    {\n      throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction unwindWork(workInProgress, renderExpirationTime) {\n  switch (workInProgress.tag) {\n    case ClassComponent:\n      {\n        var Component = workInProgress.type;\n\n        if (isContextProvider(Component)) {\n          popContext(workInProgress);\n        }\n\n        var effectTag = workInProgress.effectTag;\n\n        if (effectTag & ShouldCapture) {\n          workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;\n          return workInProgress;\n        }\n\n        return null;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(workInProgress);\n        popTopLevelContextObject(workInProgress);\n        var _effectTag = workInProgress.effectTag;\n\n        if (!((_effectTag & DidCapture) === NoEffect)) {\n          {\n            throw Error( \"The root failed to unmount after an error. This is likely a bug in React. Please file an issue.\" );\n          }\n        }\n\n        workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;\n        return workInProgress;\n      }\n\n    case HostComponent:\n      {\n        // TODO: popHydrationState\n        popHostContext(workInProgress);\n        return null;\n      }\n\n    case SuspenseComponent:\n      {\n        popSuspenseContext(workInProgress);\n\n        var _effectTag2 = workInProgress.effectTag;\n\n        if (_effectTag2 & ShouldCapture) {\n          workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.\n\n          return workInProgress;\n        }\n\n        return null;\n      }\n\n    case SuspenseListComponent:\n      {\n        popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been\n        // caught by a nested boundary. If not, it should bubble through.\n\n        return null;\n      }\n\n    case HostPortal:\n      popHostContainer(workInProgress);\n      return null;\n\n    case ContextProvider:\n      popProvider(workInProgress);\n      return null;\n\n    default:\n      return null;\n  }\n}\n\nfunction unwindInterruptedWork(interruptedWork) {\n  switch (interruptedWork.tag) {\n    case ClassComponent:\n      {\n        var childContextTypes = interruptedWork.type.childContextTypes;\n\n        if (childContextTypes !== null && childContextTypes !== undefined) {\n          popContext(interruptedWork);\n        }\n\n        break;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(interruptedWork);\n        popTopLevelContextObject(interruptedWork);\n        break;\n      }\n\n    case HostComponent:\n      {\n        popHostContext(interruptedWork);\n        break;\n      }\n\n    case HostPortal:\n      popHostContainer(interruptedWork);\n      break;\n\n    case SuspenseComponent:\n      popSuspenseContext(interruptedWork);\n      break;\n\n    case SuspenseListComponent:\n      popSuspenseContext(interruptedWork);\n      break;\n\n    case ContextProvider:\n      popProvider(interruptedWork);\n      break;\n  }\n}\n\nfunction createCapturedValue(value, source) {\n  // If the value is an error, call this function immediately after it is thrown\n  // so the stack is accurate.\n  return {\n    value: value,\n    source: source,\n    stack: getStackByFiberInDevAndProd(source)\n  };\n}\n\nfunction logCapturedError(capturedError) {\n\n  var error = capturedError.error;\n\n  {\n    var componentName = capturedError.componentName,\n        componentStack = capturedError.componentStack,\n        errorBoundaryName = capturedError.errorBoundaryName,\n        errorBoundaryFound = capturedError.errorBoundaryFound,\n        willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling\n    // `preventDefault()` in window `error` handler.\n    // We record this information as an expando on the error.\n\n    if (error != null && error._suppressLogging) {\n      if (errorBoundaryFound && willRetry) {\n        // The error is recoverable and was silenced.\n        // Ignore it and don't print the stack addendum.\n        // This is handy for testing error boundaries without noise.\n        return;\n      } // The error is fatal. Since the silencing might have\n      // been accidental, we'll surface it anyway.\n      // However, the browser would have silenced the original error\n      // so we'll print it first, and then print the stack addendum.\n\n\n      console['error'](error); // Don't transform to our wrapper\n      // For a more detailed description of this block, see:\n      // https://github.com/facebook/react/pull/13384\n    }\n\n    var componentNameMessage = componentName ? \"The above error occurred in the <\" + componentName + \"> component:\" : 'The above error occurred in one of your React components:';\n    var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.\n\n    if (errorBoundaryFound && errorBoundaryName) {\n      if (willRetry) {\n        errorBoundaryMessage = \"React will try to recreate this component tree from scratch \" + (\"using the error boundary you provided, \" + errorBoundaryName + \".\");\n      } else {\n        errorBoundaryMessage = \"This error was initially handled by the error boundary \" + errorBoundaryName + \".\\n\" + \"Recreating the tree from scratch failed so React will unmount the tree.\";\n      }\n    } else {\n      errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';\n    }\n\n    var combinedMessage = \"\" + componentNameMessage + componentStack + \"\\n\\n\" + (\"\" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.\n    // We don't include the original error message and JS stack because the browser\n    // has already printed it. Even if the application swallows the error, it is still\n    // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.\n\n    console['error'](combinedMessage); // Don't transform to our wrapper\n  }\n}\n\nvar didWarnAboutUndefinedSnapshotBeforeUpdate = null;\n\n{\n  didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();\n}\n\nvar PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;\nfunction logError(boundary, errorInfo) {\n  var source = errorInfo.source;\n  var stack = errorInfo.stack;\n\n  if (stack === null && source !== null) {\n    stack = getStackByFiberInDevAndProd(source);\n  }\n\n  var capturedError = {\n    componentName: source !== null ? getComponentName(source.type) : null,\n    componentStack: stack !== null ? stack : '',\n    error: errorInfo.value,\n    errorBoundary: null,\n    errorBoundaryName: null,\n    errorBoundaryFound: false,\n    willRetry: false\n  };\n\n  if (boundary !== null && boundary.tag === ClassComponent) {\n    capturedError.errorBoundary = boundary.stateNode;\n    capturedError.errorBoundaryName = getComponentName(boundary.type);\n    capturedError.errorBoundaryFound = true;\n    capturedError.willRetry = true;\n  }\n\n  try {\n    logCapturedError(capturedError);\n  } catch (e) {\n    // This method must not throw, or React internal state will get messed up.\n    // If console.error is overridden, or logCapturedError() shows a dialog that throws,\n    // we want to report this error outside of the normal stack as a last resort.\n    // https://github.com/facebook/react/issues/13188\n    setTimeout(function () {\n      throw e;\n    });\n  }\n}\n\nvar callComponentWillUnmountWithTimer = function (current, instance) {\n  startPhaseTimer(current, 'componentWillUnmount');\n  instance.props = current.memoizedProps;\n  instance.state = current.memoizedState;\n  instance.componentWillUnmount();\n  stopPhaseTimer();\n}; // Capture errors so they don't interrupt unmounting.\n\n\nfunction safelyCallComponentWillUnmount(current, instance) {\n  {\n    invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance);\n\n    if (hasCaughtError()) {\n      var unmountError = clearCaughtError();\n      captureCommitPhaseError(current, unmountError);\n    }\n  }\n}\n\nfunction safelyDetachRef(current) {\n  var ref = current.ref;\n\n  if (ref !== null) {\n    if (typeof ref === 'function') {\n      {\n        invokeGuardedCallback(null, ref, null, null);\n\n        if (hasCaughtError()) {\n          var refError = clearCaughtError();\n          captureCommitPhaseError(current, refError);\n        }\n      }\n    } else {\n      ref.current = null;\n    }\n  }\n}\n\nfunction safelyCallDestroy(current, destroy) {\n  {\n    invokeGuardedCallback(null, destroy, null);\n\n    if (hasCaughtError()) {\n      var error = clearCaughtError();\n      captureCommitPhaseError(current, error);\n    }\n  }\n}\n\nfunction commitBeforeMutationLifeCycles(current, finishedWork) {\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        return;\n      }\n\n    case ClassComponent:\n      {\n        if (finishedWork.effectTag & Snapshot) {\n          if (current !== null) {\n            var prevProps = current.memoizedProps;\n            var prevState = current.memoizedState;\n            startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');\n            var instance = finishedWork.stateNode; // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);\n\n            {\n              var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;\n\n              if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {\n                didWarnSet.add(finishedWork.type);\n\n                error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));\n              }\n            }\n\n            instance.__reactInternalSnapshotBeforeUpdate = snapshot;\n            stopPhaseTimer();\n          }\n        }\n\n        return;\n      }\n\n    case HostRoot:\n    case HostComponent:\n    case HostText:\n    case HostPortal:\n    case IncompleteClassComponent:\n      // Nothing to do for these component types\n      return;\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction commitHookEffectListUnmount(tag, finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n  if (lastEffect !== null) {\n    var firstEffect = lastEffect.next;\n    var effect = firstEffect;\n\n    do {\n      if ((effect.tag & tag) === tag) {\n        // Unmount\n        var destroy = effect.destroy;\n        effect.destroy = undefined;\n\n        if (destroy !== undefined) {\n          destroy();\n        }\n      }\n\n      effect = effect.next;\n    } while (effect !== firstEffect);\n  }\n}\n\nfunction commitHookEffectListMount(tag, finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n  if (lastEffect !== null) {\n    var firstEffect = lastEffect.next;\n    var effect = firstEffect;\n\n    do {\n      if ((effect.tag & tag) === tag) {\n        // Mount\n        var create = effect.create;\n        effect.destroy = create();\n\n        {\n          var destroy = effect.destroy;\n\n          if (destroy !== undefined && typeof destroy !== 'function') {\n            var addendum = void 0;\n\n            if (destroy === null) {\n              addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';\n            } else if (typeof destroy.then === 'function') {\n              addendum = '\\n\\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\\n\\n' + 'useEffect(() => {\\n' + '  async function fetchData() {\\n' + '    // You can await here\\n' + '    const response = await MyAPI.getData(someId);\\n' + '    // ...\\n' + '  }\\n' + '  fetchData();\\n' + \"}, [someId]); // Or [] if effect doesn't need props or state\\n\\n\" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';\n            } else {\n              addendum = ' You returned: ' + destroy;\n            }\n\n            error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));\n          }\n        }\n      }\n\n      effect = effect.next;\n    } while (effect !== firstEffect);\n  }\n}\n\nfunction commitPassiveHookEffects(finishedWork) {\n  if ((finishedWork.effectTag & Passive) !== NoEffect) {\n    switch (finishedWork.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          // TODO (#17945) We should call all passive destroy functions (for all fibers)\n          // before calling any create functions. The current approach only serializes\n          // these for a single fiber.\n          commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork);\n          commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);\n          break;\n        }\n    }\n  }\n}\n\nfunction commitLifeCycles(finishedRoot, current, finishedWork, committedExpirationTime) {\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        // At this point layout effects have already been destroyed (during mutation phase).\n        // This is done to prevent sibling component effects from interfering with each other,\n        // e.g. a destroy function in one component should never override a ref set\n        // by a create function in another component during the same commit.\n        commitHookEffectListMount(Layout | HasEffect, finishedWork);\n\n        return;\n      }\n\n    case ClassComponent:\n      {\n        var instance = finishedWork.stateNode;\n\n        if (finishedWork.effectTag & Update) {\n          if (current === null) {\n            startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            instance.componentDidMount();\n            stopPhaseTimer();\n          } else {\n            var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);\n            var prevState = current.memoizedState;\n            startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);\n            stopPhaseTimer();\n          }\n        }\n\n        var updateQueue = finishedWork.updateQueue;\n\n        if (updateQueue !== null) {\n          {\n            if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n              if (instance.props !== finishedWork.memoizedProps) {\n                error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n              }\n\n              if (instance.state !== finishedWork.memoizedState) {\n                error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n              }\n            }\n          } // We could update instance props and state here,\n          // but instead we rely on them being set during last render.\n          // TODO: revisit this when we implement resuming.\n\n\n          commitUpdateQueue(finishedWork, updateQueue, instance);\n        }\n\n        return;\n      }\n\n    case HostRoot:\n      {\n        var _updateQueue = finishedWork.updateQueue;\n\n        if (_updateQueue !== null) {\n          var _instance = null;\n\n          if (finishedWork.child !== null) {\n            switch (finishedWork.child.tag) {\n              case HostComponent:\n                _instance = getPublicInstance(finishedWork.child.stateNode);\n                break;\n\n              case ClassComponent:\n                _instance = finishedWork.child.stateNode;\n                break;\n            }\n          }\n\n          commitUpdateQueue(finishedWork, _updateQueue, _instance);\n        }\n\n        return;\n      }\n\n    case HostComponent:\n      {\n        var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted\n        // (eg DOM renderer may schedule auto-focus for inputs and form controls).\n        // These effects should only be committed when components are first mounted,\n        // aka when there is no current/alternate.\n\n        if (current === null && finishedWork.effectTag & Update) {\n          var type = finishedWork.type;\n          var props = finishedWork.memoizedProps;\n          commitMount(_instance2, type, props);\n        }\n\n        return;\n      }\n\n    case HostText:\n      {\n        // We have no life-cycles associated with text.\n        return;\n      }\n\n    case HostPortal:\n      {\n        // We have no life-cycles associated with portals.\n        return;\n      }\n\n    case Profiler:\n      {\n        {\n          var onRender = finishedWork.memoizedProps.onRender;\n\n          if (typeof onRender === 'function') {\n            {\n              onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);\n            }\n          }\n        }\n\n        return;\n      }\n\n    case SuspenseComponent:\n      {\n        commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n        return;\n      }\n\n    case SuspenseListComponent:\n    case IncompleteClassComponent:\n    case FundamentalComponent:\n    case ScopeComponent:\n      return;\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction hideOrUnhideAllChildren(finishedWork, isHidden) {\n  {\n    // We only have the top Fiber that was inserted but we need to recurse down its\n    // children to find all the terminal nodes.\n    var node = finishedWork;\n\n    while (true) {\n      if (node.tag === HostComponent) {\n        var instance = node.stateNode;\n\n        if (isHidden) {\n          hideInstance(instance);\n        } else {\n          unhideInstance(node.stateNode, node.memoizedProps);\n        }\n      } else if (node.tag === HostText) {\n        var _instance3 = node.stateNode;\n\n        if (isHidden) {\n          hideTextInstance(_instance3);\n        } else {\n          unhideTextInstance(_instance3, node.memoizedProps);\n        }\n      } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) {\n        // Found a nested Suspense component that timed out. Skip over the\n        // primary child fragment, which should remain hidden.\n        var fallbackChildFragment = node.child.sibling;\n        fallbackChildFragment.return = node;\n        node = fallbackChildFragment;\n        continue;\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === finishedWork) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === finishedWork) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n}\n\nfunction commitAttachRef(finishedWork) {\n  var ref = finishedWork.ref;\n\n  if (ref !== null) {\n    var instance = finishedWork.stateNode;\n    var instanceToUse;\n\n    switch (finishedWork.tag) {\n      case HostComponent:\n        instanceToUse = getPublicInstance(instance);\n        break;\n\n      default:\n        instanceToUse = instance;\n    } // Moved outside to ensure DCE works with this flag\n\n    if (typeof ref === 'function') {\n      ref(instanceToUse);\n    } else {\n      {\n        if (!ref.hasOwnProperty('current')) {\n          error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));\n        }\n      }\n\n      ref.current = instanceToUse;\n    }\n  }\n}\n\nfunction commitDetachRef(current) {\n  var currentRef = current.ref;\n\n  if (currentRef !== null) {\n    if (typeof currentRef === 'function') {\n      currentRef(null);\n    } else {\n      currentRef.current = null;\n    }\n  }\n} // User-originating errors (lifecycles and refs) should not interrupt\n// deletion, so don't let them throw. Host-originating errors should\n// interrupt deletion, so it's okay\n\n\nfunction commitUnmount(finishedRoot, current, renderPriorityLevel) {\n  onCommitUnmount(current);\n\n  switch (current.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case MemoComponent:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        var updateQueue = current.updateQueue;\n\n        if (updateQueue !== null) {\n          var lastEffect = updateQueue.lastEffect;\n\n          if (lastEffect !== null) {\n            var firstEffect = lastEffect.next;\n\n            {\n              // When the owner fiber is deleted, the destroy function of a passive\n              // effect hook is called during the synchronous commit phase. This is\n              // a concession to implementation complexity. Calling it in the\n              // passive effect phase (like they usually are, when dependencies\n              // change during an update) would require either traversing the\n              // children of the deleted fiber again, or including unmount effects\n              // as part of the fiber effect list.\n              //\n              // Because this is during the sync commit phase, we need to change\n              // the priority.\n              //\n              // TODO: Reconsider this implementation trade off.\n              var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel;\n              runWithPriority$1(priorityLevel, function () {\n                var effect = firstEffect;\n\n                do {\n                  var _destroy = effect.destroy;\n\n                  if (_destroy !== undefined) {\n                    safelyCallDestroy(current, _destroy);\n                  }\n\n                  effect = effect.next;\n                } while (effect !== firstEffect);\n              });\n            }\n          }\n        }\n\n        return;\n      }\n\n    case ClassComponent:\n      {\n        safelyDetachRef(current);\n        var instance = current.stateNode;\n\n        if (typeof instance.componentWillUnmount === 'function') {\n          safelyCallComponentWillUnmount(current, instance);\n        }\n\n        return;\n      }\n\n    case HostComponent:\n      {\n\n        safelyDetachRef(current);\n        return;\n      }\n\n    case HostPortal:\n      {\n        // TODO: this is recursive.\n        // We are also not using this parent because\n        // the portal will get pushed immediately.\n        {\n          unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n        }\n\n        return;\n      }\n\n    case FundamentalComponent:\n      {\n\n        return;\n      }\n\n    case DehydratedFragment:\n      {\n\n        return;\n      }\n\n    case ScopeComponent:\n      {\n\n        return;\n      }\n  }\n}\n\nfunction commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) {\n  // While we're inside a removed host node we don't want to call\n  // removeChild on the inner nodes because they're removed by the top\n  // call anyway. We also want to call componentWillUnmount on all\n  // composites before this host node is removed from the tree. Therefore\n  // we do an inner loop while we're still inside the host node.\n  var node = root;\n\n  while (true) {\n    commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes.\n    // Skip portals because commitUnmount() currently visits them recursively.\n\n    if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above.\n    // If we don't use mutation we drill down into portals here instead.\n     node.tag !== HostPortal)) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === root) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === root) {\n        return;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction detachFiber(current) {\n  var alternate = current.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we\n  // should clear the child pointer of the parent alternate to let this\n  // get GC:ed but we don't know which for sure which parent is the current\n  // one so we'll settle for GC:ing the subtree of this child. This child\n  // itself will be GC:ed when the parent updates the next time.\n\n  current.return = null;\n  current.child = null;\n  current.memoizedState = null;\n  current.updateQueue = null;\n  current.dependencies = null;\n  current.alternate = null;\n  current.firstEffect = null;\n  current.lastEffect = null;\n  current.pendingProps = null;\n  current.memoizedProps = null;\n  current.stateNode = null;\n\n  if (alternate !== null) {\n    detachFiber(alternate);\n  }\n}\n\nfunction getHostParentFiber(fiber) {\n  var parent = fiber.return;\n\n  while (parent !== null) {\n    if (isHostParent(parent)) {\n      return parent;\n    }\n\n    parent = parent.return;\n  }\n\n  {\n    {\n      throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction isHostParent(fiber) {\n  return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;\n}\n\nfunction getHostSibling(fiber) {\n  // We're going to search forward into the tree until we find a sibling host\n  // node. Unfortunately, if multiple insertions are done in a row we have to\n  // search past them. This leads to exponential search for the next sibling.\n  // TODO: Find a more efficient way to do this.\n  var node = fiber;\n\n  siblings: while (true) {\n    // If we didn't find anything, let's try the next sibling.\n    while (node.sibling === null) {\n      if (node.return === null || isHostParent(node.return)) {\n        // If we pop out of the root or hit the parent the fiber we are the\n        // last sibling.\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n\n    while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {\n      // If it is not host node and, we might have a host node inside it.\n      // Try to search down until we find one.\n      if (node.effectTag & Placement) {\n        // If we don't have a child, try the siblings instead.\n        continue siblings;\n      } // If we don't have a child, try the siblings instead.\n      // We also skip portals because they are not part of this host tree.\n\n\n      if (node.child === null || node.tag === HostPortal) {\n        continue siblings;\n      } else {\n        node.child.return = node;\n        node = node.child;\n      }\n    } // Check if this host node is stable or about to be placed.\n\n\n    if (!(node.effectTag & Placement)) {\n      // Found it!\n      return node.stateNode;\n    }\n  }\n}\n\nfunction commitPlacement(finishedWork) {\n\n\n  var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.\n\n  var parent;\n  var isContainer;\n  var parentStateNode = parentFiber.stateNode;\n\n  switch (parentFiber.tag) {\n    case HostComponent:\n      parent = parentStateNode;\n      isContainer = false;\n      break;\n\n    case HostRoot:\n      parent = parentStateNode.containerInfo;\n      isContainer = true;\n      break;\n\n    case HostPortal:\n      parent = parentStateNode.containerInfo;\n      isContainer = true;\n      break;\n\n    case FundamentalComponent:\n\n    // eslint-disable-next-line-no-fallthrough\n\n    default:\n      {\n        {\n          throw Error( \"Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n  }\n\n  if (parentFiber.effectTag & ContentReset) {\n    // Reset the text content of the parent before doing any insertions\n    resetTextContent(parent); // Clear ContentReset from the effect tag\n\n    parentFiber.effectTag &= ~ContentReset;\n  }\n\n  var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its\n  // children to find all the terminal nodes.\n\n  if (isContainer) {\n    insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent);\n  } else {\n    insertOrAppendPlacementNode(finishedWork, before, parent);\n  }\n}\n\nfunction insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n  var tag = node.tag;\n  var isHost = tag === HostComponent || tag === HostText;\n\n  if (isHost || enableFundamentalAPI ) {\n    var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n    if (before) {\n      insertInContainerBefore(parent, stateNode, before);\n    } else {\n      appendChildToContainer(parent, stateNode);\n    }\n  } else if (tag === HostPortal) ; else {\n    var child = node.child;\n\n    if (child !== null) {\n      insertOrAppendPlacementNodeIntoContainer(child, before, parent);\n      var sibling = child.sibling;\n\n      while (sibling !== null) {\n        insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);\n        sibling = sibling.sibling;\n      }\n    }\n  }\n}\n\nfunction insertOrAppendPlacementNode(node, before, parent) {\n  var tag = node.tag;\n  var isHost = tag === HostComponent || tag === HostText;\n\n  if (isHost || enableFundamentalAPI ) {\n    var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n    if (before) {\n      insertBefore(parent, stateNode, before);\n    } else {\n      appendChild(parent, stateNode);\n    }\n  } else if (tag === HostPortal) ; else {\n    var child = node.child;\n\n    if (child !== null) {\n      insertOrAppendPlacementNode(child, before, parent);\n      var sibling = child.sibling;\n\n      while (sibling !== null) {\n        insertOrAppendPlacementNode(sibling, before, parent);\n        sibling = sibling.sibling;\n      }\n    }\n  }\n}\n\nfunction unmountHostComponents(finishedRoot, current, renderPriorityLevel) {\n  // We only have the top Fiber that was deleted but we need to recurse down its\n  // children to find all the terminal nodes.\n  var node = current; // Each iteration, currentParent is populated with node's host parent if not\n  // currentParentIsValid.\n\n  var currentParentIsValid = false; // Note: these two variables *must* always be updated together.\n\n  var currentParent;\n  var currentParentIsContainer;\n\n  while (true) {\n    if (!currentParentIsValid) {\n      var parent = node.return;\n\n      findParent: while (true) {\n        if (!(parent !== null)) {\n          {\n            throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var parentStateNode = parent.stateNode;\n\n        switch (parent.tag) {\n          case HostComponent:\n            currentParent = parentStateNode;\n            currentParentIsContainer = false;\n            break findParent;\n\n          case HostRoot:\n            currentParent = parentStateNode.containerInfo;\n            currentParentIsContainer = true;\n            break findParent;\n\n          case HostPortal:\n            currentParent = parentStateNode.containerInfo;\n            currentParentIsContainer = true;\n            break findParent;\n\n        }\n\n        parent = parent.return;\n      }\n\n      currentParentIsValid = true;\n    }\n\n    if (node.tag === HostComponent || node.tag === HostText) {\n      commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the\n      // node from the tree.\n\n      if (currentParentIsContainer) {\n        removeChildFromContainer(currentParent, node.stateNode);\n      } else {\n        removeChild(currentParent, node.stateNode);\n      } // Don't visit children because we already visited them.\n\n    } else if (node.tag === HostPortal) {\n      if (node.child !== null) {\n        // When we go into a portal, it becomes the parent to remove from.\n        // We will reassign it back when we pop the portal on the way up.\n        currentParent = node.stateNode.containerInfo;\n        currentParentIsContainer = true; // Visit children because portals might contain host components.\n\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n    } else {\n      commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below.\n\n      if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n    }\n\n    if (node === current) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === current) {\n        return;\n      }\n\n      node = node.return;\n\n      if (node.tag === HostPortal) {\n        // When we go out of the portal, we need to restore the parent.\n        // Since we don't keep a stack of them, we will search for it.\n        currentParentIsValid = false;\n      }\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction commitDeletion(finishedRoot, current, renderPriorityLevel) {\n  {\n    // Recursively delete all host nodes from the parent.\n    // Detach refs and call componentWillUnmount() on the whole subtree.\n    unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n  }\n\n  detachFiber(current);\n}\n\nfunction commitWork(current, finishedWork) {\n\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case MemoComponent:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        // Layout effects are destroyed during the mutation phase so that all\n        // destroy functions for all fibers are called before any create functions.\n        // This prevents sibling component effects from interfering with each other,\n        // e.g. a destroy function in one component should never override a ref set\n        // by a create function in another component during the same commit.\n        commitHookEffectListUnmount(Layout | HasEffect, finishedWork);\n        return;\n      }\n\n    case ClassComponent:\n      {\n        return;\n      }\n\n    case HostComponent:\n      {\n        var instance = finishedWork.stateNode;\n\n        if (instance != null) {\n          // Commit the work prepared earlier.\n          var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n          // as the newProps. The updatePayload will contain the real change in\n          // this case.\n\n          var oldProps = current !== null ? current.memoizedProps : newProps;\n          var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.\n\n          var updatePayload = finishedWork.updateQueue;\n          finishedWork.updateQueue = null;\n\n          if (updatePayload !== null) {\n            commitUpdate(instance, updatePayload, type, oldProps, newProps);\n          }\n        }\n\n        return;\n      }\n\n    case HostText:\n      {\n        if (!(finishedWork.stateNode !== null)) {\n          {\n            throw Error( \"This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var textInstance = finishedWork.stateNode;\n        var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n        // as the newProps. The updatePayload will contain the real change in\n        // this case.\n\n        var oldText = current !== null ? current.memoizedProps : newText;\n        commitTextUpdate(textInstance, oldText, newText);\n        return;\n      }\n\n    case HostRoot:\n      {\n        {\n          var _root = finishedWork.stateNode;\n\n          if (_root.hydrate) {\n            // We've just hydrated. No need to hydrate again.\n            _root.hydrate = false;\n            commitHydratedContainer(_root.containerInfo);\n          }\n        }\n\n        return;\n      }\n\n    case Profiler:\n      {\n        return;\n      }\n\n    case SuspenseComponent:\n      {\n        commitSuspenseComponent(finishedWork);\n        attachSuspenseRetryListeners(finishedWork);\n        return;\n      }\n\n    case SuspenseListComponent:\n      {\n        attachSuspenseRetryListeners(finishedWork);\n        return;\n      }\n\n    case IncompleteClassComponent:\n      {\n        return;\n      }\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction commitSuspenseComponent(finishedWork) {\n  var newState = finishedWork.memoizedState;\n  var newDidTimeout;\n  var primaryChildParent = finishedWork;\n\n  if (newState === null) {\n    newDidTimeout = false;\n  } else {\n    newDidTimeout = true;\n    primaryChildParent = finishedWork.child;\n    markCommitTimeOfFallback();\n  }\n\n  if ( primaryChildParent !== null) {\n    hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);\n  }\n}\n\nfunction commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n\n  var newState = finishedWork.memoizedState;\n\n  if (newState === null) {\n    var current = finishedWork.alternate;\n\n    if (current !== null) {\n      var prevState = current.memoizedState;\n\n      if (prevState !== null) {\n        var suspenseInstance = prevState.dehydrated;\n\n        if (suspenseInstance !== null) {\n          commitHydratedSuspenseInstance(suspenseInstance);\n        }\n      }\n    }\n  }\n}\n\nfunction attachSuspenseRetryListeners(finishedWork) {\n  // If this boundary just timed out, then it will have a set of thenables.\n  // For each thenable, attach a listener so that when it resolves, React\n  // attempts to re-render the boundary in the primary (pre-timeout) state.\n  var thenables = finishedWork.updateQueue;\n\n  if (thenables !== null) {\n    finishedWork.updateQueue = null;\n    var retryCache = finishedWork.stateNode;\n\n    if (retryCache === null) {\n      retryCache = finishedWork.stateNode = new PossiblyWeakSet();\n    }\n\n    thenables.forEach(function (thenable) {\n      // Memoize using the boundary fiber to prevent redundant listeners.\n      var retry = resolveRetryThenable.bind(null, finishedWork, thenable);\n\n      if (!retryCache.has(thenable)) {\n        {\n          if (thenable.__reactDoNotTraceInteractions !== true) {\n            retry = tracing.unstable_wrap(retry);\n          }\n        }\n\n        retryCache.add(thenable);\n        thenable.then(retry, retry);\n      }\n    });\n  }\n}\n\nfunction commitResetTextContent(current) {\n\n  resetTextContent(current.stateNode);\n}\n\nvar PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;\n\nfunction createRootErrorUpdate(fiber, errorInfo, expirationTime) {\n  var update = createUpdate(expirationTime, null); // Unmount the root by rendering null.\n\n  update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  update.payload = {\n    element: null\n  };\n  var error = errorInfo.value;\n\n  update.callback = function () {\n    onUncaughtError(error);\n    logError(fiber, errorInfo);\n  };\n\n  return update;\n}\n\nfunction createClassErrorUpdate(fiber, errorInfo, expirationTime) {\n  var update = createUpdate(expirationTime, null);\n  update.tag = CaptureUpdate;\n  var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n\n  if (typeof getDerivedStateFromError === 'function') {\n    var error$1 = errorInfo.value;\n\n    update.payload = function () {\n      logError(fiber, errorInfo);\n      return getDerivedStateFromError(error$1);\n    };\n  }\n\n  var inst = fiber.stateNode;\n\n  if (inst !== null && typeof inst.componentDidCatch === 'function') {\n    update.callback = function callback() {\n      {\n        markFailedErrorBoundaryForHotReloading(fiber);\n      }\n\n      if (typeof getDerivedStateFromError !== 'function') {\n        // To preserve the preexisting retry behavior of error boundaries,\n        // we keep track of which ones already failed during this batch.\n        // This gets reset before we yield back to the browser.\n        // TODO: Warn in strict mode if getDerivedStateFromError is\n        // not defined.\n        markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined\n\n        logError(fiber, errorInfo);\n      }\n\n      var error$1 = errorInfo.value;\n      var stack = errorInfo.stack;\n      this.componentDidCatch(error$1, {\n        componentStack: stack !== null ? stack : ''\n      });\n\n      {\n        if (typeof getDerivedStateFromError !== 'function') {\n          // If componentDidCatch is the only error boundary method defined,\n          // then it needs to call setState to recover from errors.\n          // If no state update is scheduled then the boundary will swallow the error.\n          if (fiber.expirationTime !== Sync) {\n            error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown');\n          }\n        }\n      }\n    };\n  } else {\n    update.callback = function () {\n      markFailedErrorBoundaryForHotReloading(fiber);\n    };\n  }\n\n  return update;\n}\n\nfunction attachPingListener(root, renderExpirationTime, thenable) {\n  // Attach a listener to the promise to \"ping\" the root and retry. But\n  // only if one does not already exist for the current render expiration\n  // time (which acts like a \"thread ID\" here).\n  var pingCache = root.pingCache;\n  var threadIDs;\n\n  if (pingCache === null) {\n    pingCache = root.pingCache = new PossiblyWeakMap$1();\n    threadIDs = new Set();\n    pingCache.set(thenable, threadIDs);\n  } else {\n    threadIDs = pingCache.get(thenable);\n\n    if (threadIDs === undefined) {\n      threadIDs = new Set();\n      pingCache.set(thenable, threadIDs);\n    }\n  }\n\n  if (!threadIDs.has(renderExpirationTime)) {\n    // Memoize using the thread ID to prevent redundant listeners.\n    threadIDs.add(renderExpirationTime);\n    var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);\n    thenable.then(ping, ping);\n  }\n}\n\nfunction throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {\n  // The source fiber did not complete.\n  sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid.\n\n  sourceFiber.firstEffect = sourceFiber.lastEffect = null;\n\n  if (value !== null && typeof value === 'object' && typeof value.then === 'function') {\n    // This is a thenable.\n    var thenable = value;\n\n    if ((sourceFiber.mode & BlockingMode) === NoMode) {\n      // Reset the memoizedState to what it was before we attempted\n      // to render it.\n      var currentSource = sourceFiber.alternate;\n\n      if (currentSource) {\n        sourceFiber.updateQueue = currentSource.updateQueue;\n        sourceFiber.memoizedState = currentSource.memoizedState;\n        sourceFiber.expirationTime = currentSource.expirationTime;\n      } else {\n        sourceFiber.updateQueue = null;\n        sourceFiber.memoizedState = null;\n      }\n    }\n\n    var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view.\n\n    var _workInProgress = returnFiber;\n\n    do {\n      if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) {\n        // Found the nearest boundary.\n        // Stash the promise on the boundary fiber. If the boundary times out, we'll\n        // attach another listener to flip the boundary back to its normal state.\n        var thenables = _workInProgress.updateQueue;\n\n        if (thenables === null) {\n          var updateQueue = new Set();\n          updateQueue.add(thenable);\n          _workInProgress.updateQueue = updateQueue;\n        } else {\n          thenables.add(thenable);\n        } // If the boundary is outside of blocking mode, we should *not*\n        // suspend the commit. Pretend as if the suspended component rendered\n        // null and keep rendering. In the commit phase, we'll schedule a\n        // subsequent synchronous update to re-render the Suspense.\n        //\n        // Note: It doesn't matter whether the component that suspended was\n        // inside a blocking mode tree. If the Suspense is outside of it, we\n        // should *not* suspend the commit.\n\n\n        if ((_workInProgress.mode & BlockingMode) === NoMode) {\n          _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete.\n          // But we shouldn't call any lifecycle methods or callbacks. Remove\n          // all lifecycle effect tags.\n\n          sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);\n\n          if (sourceFiber.tag === ClassComponent) {\n            var currentSourceFiber = sourceFiber.alternate;\n\n            if (currentSourceFiber === null) {\n              // This is a new mount. Change the tag so it's not mistaken for a\n              // completed class component. For example, we should not call\n              // componentWillUnmount if it is deleted.\n              sourceFiber.tag = IncompleteClassComponent;\n            } else {\n              // When we try rendering again, we should not reuse the current fiber,\n              // since it's known to be in an inconsistent state. Use a force update to\n              // prevent a bail out.\n              var update = createUpdate(Sync, null);\n              update.tag = ForceUpdate;\n              enqueueUpdate(sourceFiber, update);\n            }\n          } // The source fiber did not complete. Mark it with Sync priority to\n          // indicate that it still has pending work.\n\n\n          sourceFiber.expirationTime = Sync; // Exit without suspending.\n\n          return;\n        } // Confirmed that the boundary is in a concurrent mode tree. Continue\n        // with the normal suspend path.\n        //\n        // After this we'll use a set of heuristics to determine whether this\n        // render pass will run to completion or restart or \"suspend\" the commit.\n        // The actual logic for this is spread out in different places.\n        //\n        // This first principle is that if we're going to suspend when we complete\n        // a root, then we should also restart if we get an update or ping that\n        // might unsuspend it, and vice versa. The only reason to suspend is\n        // because you think you might want to restart before committing. However,\n        // it doesn't make sense to restart only while in the period we're suspended.\n        //\n        // Restarting too aggressively is also not good because it starves out any\n        // intermediate loading state. So we use heuristics to determine when.\n        // Suspense Heuristics\n        //\n        // If nothing threw a Promise or all the same fallbacks are already showing,\n        // then don't suspend/restart.\n        //\n        // If this is an initial render of a new tree of Suspense boundaries and\n        // those trigger a fallback, then don't suspend/restart. We want to ensure\n        // that we can show the initial loading state as quickly as possible.\n        //\n        // If we hit a \"Delayed\" case, such as when we'd switch from content back into\n        // a fallback, then we should always suspend/restart. SuspenseConfig applies to\n        // this case. If none is defined, JND is used instead.\n        //\n        // If we're already showing a fallback and it gets \"retried\", allowing us to show\n        // another level, but there's still an inner boundary that would show a fallback,\n        // then we suspend/restart for 500ms since the last time we showed a fallback\n        // anywhere in the tree. This effectively throttles progressive loading into a\n        // consistent train of commits. This also gives us an opportunity to restart to\n        // get to the completed state slightly earlier.\n        //\n        // If there's ambiguity due to batching it's resolved in preference of:\n        // 1) \"delayed\", 2) \"initial render\", 3) \"retry\".\n        //\n        // We want to ensure that a \"busy\" state doesn't get force committed. We want to\n        // ensure that new initial loading states can commit as soon as possible.\n\n\n        attachPingListener(root, renderExpirationTime, thenable);\n        _workInProgress.effectTag |= ShouldCapture;\n        _workInProgress.expirationTime = renderExpirationTime;\n        return;\n      } // This boundary already captured during this render. Continue to the next\n      // boundary.\n\n\n      _workInProgress = _workInProgress.return;\n    } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode.\n    // TODO: Use invariant so the message is stripped in prod?\n\n\n    value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\\n' + '\\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));\n  } // We didn't find a boundary that could handle this type of exception. Start\n  // over and traverse parent path again, this time treating the exception\n  // as an error.\n\n\n  renderDidError();\n  value = createCapturedValue(value, sourceFiber);\n  var workInProgress = returnFiber;\n\n  do {\n    switch (workInProgress.tag) {\n      case HostRoot:\n        {\n          var _errorInfo = value;\n          workInProgress.effectTag |= ShouldCapture;\n          workInProgress.expirationTime = renderExpirationTime;\n\n          var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);\n\n          enqueueCapturedUpdate(workInProgress, _update);\n          return;\n        }\n\n      case ClassComponent:\n        // Capture and retry\n        var errorInfo = value;\n        var ctor = workInProgress.type;\n        var instance = workInProgress.stateNode;\n\n        if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {\n          workInProgress.effectTag |= ShouldCapture;\n          workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state\n\n          var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);\n\n          enqueueCapturedUpdate(workInProgress, _update2);\n          return;\n        }\n\n        break;\n    }\n\n    workInProgress = workInProgress.return;\n  } while (workInProgress !== null);\n}\n\nvar ceil = Math.ceil;\nvar ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,\n    ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,\n    IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing;\nvar NoContext =\n/*                    */\n0;\nvar BatchedContext =\n/*               */\n1;\nvar EventContext =\n/*                 */\n2;\nvar DiscreteEventContext =\n/*         */\n4;\nvar LegacyUnbatchedContext =\n/*       */\n8;\nvar RenderContext =\n/*                */\n16;\nvar CommitContext =\n/*                */\n32;\nvar RootIncomplete = 0;\nvar RootFatalErrored = 1;\nvar RootErrored = 2;\nvar RootSuspended = 3;\nvar RootSuspendedWithDelay = 4;\nvar RootCompleted = 5;\n// Describes where we are in the React execution stack\nvar executionContext = NoContext; // The root we're working on\n\nvar workInProgressRoot = null; // The fiber we're working on\n\nvar workInProgress = null; // The expiration time we're rendering\n\nvar renderExpirationTime$1 = NoWork; // Whether to root completed, errored, suspended, etc.\n\nvar workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown\n\nvar workInProgressRootFatalError = null; // Most recent event time among processed updates during this render.\n// This is conceptually a time stamp but expressed in terms of an ExpirationTime\n// because we deal mostly with expiration times in the hot path, so this avoids\n// the conversion happening in the hot path.\n\nvar workInProgressRootLatestProcessedExpirationTime = Sync;\nvar workInProgressRootLatestSuspenseTimeout = Sync;\nvar workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only\n// includes unprocessed updates, not work in bailed out children.\n\nvar workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately.\n// This flag determines if it might be worthwhile to restart if an opportunity\n// happens latere.\n\nvar workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train\n// model where we don't commit new loading states in too quick succession.\n\nvar globalMostRecentFallbackTime = 0;\nvar FALLBACK_THROTTLE_MS = 500;\nvar nextEffect = null;\nvar hasUncaughtError = false;\nvar firstUncaughtError = null;\nvar legacyErrorBoundariesThatAlreadyFailed = null;\nvar rootDoesHavePassiveEffects = false;\nvar rootWithPendingPassiveEffects = null;\nvar pendingPassiveEffectsRenderPriority = NoPriority;\nvar pendingPassiveEffectsExpirationTime = NoWork;\nvar rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates\n\nvar NESTED_UPDATE_LIMIT = 50;\nvar nestedUpdateCount = 0;\nvar rootWithNestedUpdates = null;\nvar NESTED_PASSIVE_UPDATE_LIMIT = 50;\nvar nestedPassiveUpdateCount = 0;\nvar interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times\n// during the commit phase. This enables them to be traced across components\n// that spawn new work during render. E.g. hidden boundaries, suspended SSR\n// hydration or SuspenseList.\n\nvar spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start\n// time). However, if two updates are scheduled within the same event, we\n// should treat their start times as simultaneous, even if the actual clock\n// time has advanced between the first and second call.\n// In other words, because expiration times determine how updates are batched,\n// we want all updates of like priority that occur within the same event to\n// receive the same expiration time. Otherwise we get tearing.\n\nvar currentEventTime = NoWork;\nfunction requestCurrentTimeForUpdate() {\n  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n    // We're inside React, so it's fine to read the actual time.\n    return msToExpirationTime(now());\n  } // We're not inside React, so we may be in the middle of a browser event.\n\n\n  if (currentEventTime !== NoWork) {\n    // Use the same start time for all updates until we enter React again.\n    return currentEventTime;\n  } // This is the first update since React yielded. Compute a new start time.\n\n\n  currentEventTime = msToExpirationTime(now());\n  return currentEventTime;\n}\nfunction getCurrentTime() {\n  return msToExpirationTime(now());\n}\nfunction computeExpirationForFiber(currentTime, fiber, suspenseConfig) {\n  var mode = fiber.mode;\n\n  if ((mode & BlockingMode) === NoMode) {\n    return Sync;\n  }\n\n  var priorityLevel = getCurrentPriorityLevel();\n\n  if ((mode & ConcurrentMode) === NoMode) {\n    return priorityLevel === ImmediatePriority ? Sync : Batched;\n  }\n\n  if ((executionContext & RenderContext) !== NoContext) {\n    // Use whatever time we're already rendering\n    // TODO: Should there be a way to opt out, like with `runWithPriority`?\n    return renderExpirationTime$1;\n  }\n\n  var expirationTime;\n\n  if (suspenseConfig !== null) {\n    // Compute an expiration time based on the Suspense timeout.\n    expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n  } else {\n    // Compute an expiration time based on the Scheduler priority.\n    switch (priorityLevel) {\n      case ImmediatePriority:\n        expirationTime = Sync;\n        break;\n\n      case UserBlockingPriority$1:\n        // TODO: Rename this to computeUserBlockingExpiration\n        expirationTime = computeInteractiveExpiration(currentTime);\n        break;\n\n      case NormalPriority:\n      case LowPriority:\n        // TODO: Handle LowPriority\n        // TODO: Rename this to... something better.\n        expirationTime = computeAsyncExpiration(currentTime);\n        break;\n\n      case IdlePriority:\n        expirationTime = Idle;\n        break;\n\n      default:\n        {\n          {\n            throw Error( \"Expected a valid priority level\" );\n          }\n        }\n\n    }\n  } // If we're in the middle of rendering a tree, do not update at the same\n  // expiration time that is already rendering.\n  // TODO: We shouldn't have to do this if the update is on a different root.\n  // Refactor computeExpirationForFiber + scheduleUpdate so we have access to\n  // the root when we check for this condition.\n\n\n  if (workInProgressRoot !== null && expirationTime === renderExpirationTime$1) {\n    // This is a trick to move this update into a separate batch\n    expirationTime -= 1;\n  }\n\n  return expirationTime;\n}\nfunction scheduleUpdateOnFiber(fiber, expirationTime) {\n  checkForNestedUpdates();\n  warnAboutRenderPhaseUpdatesInDEV(fiber);\n  var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime);\n\n  if (root === null) {\n    warnAboutUpdateOnUnmountedFiberInDEV(fiber);\n    return;\n  }\n\n  checkForInterruption(fiber, expirationTime);\n  recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the\n  // priority as an argument to that function and this one.\n\n  var priorityLevel = getCurrentPriorityLevel();\n\n  if (expirationTime === Sync) {\n    if ( // Check if we're inside unbatchedUpdates\n    (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering\n    (executionContext & (RenderContext | CommitContext)) === NoContext) {\n      // Register pending interactions on the root to avoid losing traced interaction data.\n      schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed\n      // root inside of batchedUpdates should be synchronous, but layout updates\n      // should be deferred until the end of the batch.\n\n      performSyncWorkOnRoot(root);\n    } else {\n      ensureRootIsScheduled(root);\n      schedulePendingInteractions(root, expirationTime);\n\n      if (executionContext === NoContext) {\n        // Flush the synchronous work now, unless we're already working or inside\n        // a batch. This is intentionally inside scheduleUpdateOnFiber instead of\n        // scheduleCallbackForFiber to preserve the ability to schedule a callback\n        // without immediately flushing it. We only do this for user-initiated\n        // updates, to preserve historical behavior of legacy mode.\n        flushSyncCallbackQueue();\n      }\n    }\n  } else {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, expirationTime);\n  }\n\n  if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered\n  // discrete, even inside a discrete event.\n  priorityLevel === UserBlockingPriority$1 || priorityLevel === ImmediatePriority)) {\n    // This is the result of a discrete event. Track the lowest priority\n    // discrete update per root so we can flush them early, if needed.\n    if (rootsWithPendingDiscreteUpdates === null) {\n      rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]);\n    } else {\n      var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root);\n\n      if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) {\n        rootsWithPendingDiscreteUpdates.set(root, expirationTime);\n      }\n    }\n  }\n}\nvar scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending\n// work without treating it as a typical update that originates from an event;\n// e.g. retrying a Suspense boundary isn't an update, but it does schedule work\n// on a fiber.\n\nfunction markUpdateTimeFromFiberToRoot(fiber, expirationTime) {\n  // Update the source fiber's expiration time\n  if (fiber.expirationTime < expirationTime) {\n    fiber.expirationTime = expirationTime;\n  }\n\n  var alternate = fiber.alternate;\n\n  if (alternate !== null && alternate.expirationTime < expirationTime) {\n    alternate.expirationTime = expirationTime;\n  } // Walk the parent path to the root and update the child expiration time.\n\n\n  var node = fiber.return;\n  var root = null;\n\n  if (node === null && fiber.tag === HostRoot) {\n    root = fiber.stateNode;\n  } else {\n    while (node !== null) {\n      alternate = node.alternate;\n\n      if (node.childExpirationTime < expirationTime) {\n        node.childExpirationTime = expirationTime;\n\n        if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n          alternate.childExpirationTime = expirationTime;\n        }\n      } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n        alternate.childExpirationTime = expirationTime;\n      }\n\n      if (node.return === null && node.tag === HostRoot) {\n        root = node.stateNode;\n        break;\n      }\n\n      node = node.return;\n    }\n  }\n\n  if (root !== null) {\n    if (workInProgressRoot === root) {\n      // Received an update to a tree that's in the middle of rendering. Mark\n      // that's unprocessed work on this root.\n      markUnprocessedUpdateTime(expirationTime);\n\n      if (workInProgressRootExitStatus === RootSuspendedWithDelay) {\n        // The root already suspended with a delay, which means this render\n        // definitely won't finish. Since we have a new update, let's mark it as\n        // suspended now, right before marking the incoming update. This has the\n        // effect of interrupting the current render and switching to the update.\n        // TODO: This happens to work when receiving an update during the render\n        // phase, because of the trick inside computeExpirationForFiber to\n        // subtract 1 from `renderExpirationTime` to move it into a\n        // separate bucket. But we should probably model it with an exception,\n        // using the same mechanism we use to force hydration of a subtree.\n        // TODO: This does not account for low pri updates that were already\n        // scheduled before the root started rendering. Need to track the next\n        // pending expiration time (perhaps by backtracking the return path) and\n        // then trigger a restart in the `renderDidSuspendDelayIfPossible` path.\n        markRootSuspendedAtTime(root, renderExpirationTime$1);\n      }\n    } // Mark that the root has a pending update.\n\n\n    markRootUpdatedAtTime(root, expirationTime);\n  }\n\n  return root;\n}\n\nfunction getNextRootExpirationTimeToWorkOn(root) {\n  // Determines the next expiration time that the root should render, taking\n  // into account levels that may be suspended, or levels that may have\n  // received a ping.\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime !== NoWork) {\n    return lastExpiredTime;\n  } // \"Pending\" refers to any update that hasn't committed yet, including if it\n  // suspended. The \"suspended\" range is therefore a subset.\n\n\n  var firstPendingTime = root.firstPendingTime;\n\n  if (!isRootSuspendedAtTime(root, firstPendingTime)) {\n    // The highest priority pending time is not suspended. Let's work on that.\n    return firstPendingTime;\n  } // If the first pending time is suspended, check if there's a lower priority\n  // pending level that we know about. Or check if we received a ping. Work\n  // on whichever is higher priority.\n\n\n  var lastPingedTime = root.lastPingedTime;\n  var nextKnownPendingLevel = root.nextKnownPendingLevel;\n  var nextLevel = lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel;\n\n  if ( nextLevel <= Idle && firstPendingTime !== nextLevel) {\n    // Don't work on Idle/Never priority unless everything else is committed.\n    return NoWork;\n  }\n\n  return nextLevel;\n} // Use this function to schedule a task for a root. There's only one task per\n// root; if a task was already scheduled, we'll check to make sure the\n// expiration time of the existing task is the same as the expiration time of\n// the next level that the root has work on. This function is called on every\n// update, and right before exiting a task.\n\n\nfunction ensureRootIsScheduled(root) {\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime !== NoWork) {\n    // Special case: Expired work should flush synchronously.\n    root.callbackExpirationTime = Sync;\n    root.callbackPriority = ImmediatePriority;\n    root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n    return;\n  }\n\n  var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n  var existingCallbackNode = root.callbackNode;\n\n  if (expirationTime === NoWork) {\n    // There's nothing to work on.\n    if (existingCallbackNode !== null) {\n      root.callbackNode = null;\n      root.callbackExpirationTime = NoWork;\n      root.callbackPriority = NoPriority;\n    }\n\n    return;\n  } // TODO: If this is an update, we already read the current time. Pass the\n  // time as an argument.\n\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and\n  // expiration time. Otherwise, we'll cancel it and schedule a new one.\n\n  if (existingCallbackNode !== null) {\n    var existingCallbackPriority = root.callbackPriority;\n    var existingCallbackExpirationTime = root.callbackExpirationTime;\n\n    if ( // Callback must have the exact same expiration time.\n    existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority.\n    existingCallbackPriority >= priorityLevel) {\n      // Existing callback is sufficient.\n      return;\n    } // Need to schedule a new task.\n    // TODO: Instead of scheduling a new task, we should be able to change the\n    // priority of the existing one.\n\n\n    cancelCallback(existingCallbackNode);\n  }\n\n  root.callbackExpirationTime = expirationTime;\n  root.callbackPriority = priorityLevel;\n  var callbackNode;\n\n  if (expirationTime === Sync) {\n    // Sync React callbacks are scheduled on a special internal queue\n    callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n  } else {\n    callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects\n    // ordering because tasks are processed in timeout order.\n    {\n      timeout: expirationTimeToMs(expirationTime) - now()\n    });\n  }\n\n  root.callbackNode = callbackNode;\n} // This is the entry point for every concurrent task, i.e. anything that\n// goes through Scheduler.\n\n\nfunction performConcurrentWorkOnRoot(root, didTimeout) {\n  // Since we know we're in a React event, we can clear the current\n  // event time. The next update will compute a new event time.\n  currentEventTime = NoWork;\n\n  if (didTimeout) {\n    // The render task took too long to complete. Mark the current time as\n    // expired to synchronously render all expired work in a single batch.\n    var currentTime = requestCurrentTimeForUpdate();\n    markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback.\n\n    ensureRootIsScheduled(root);\n    return null;\n  } // Determine the next expiration time to work on, using the fields stored\n  // on the root.\n\n\n  var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n\n  if (expirationTime !== NoWork) {\n    var originalCallbackNode = root.callbackNode;\n\n    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n      {\n        throw Error( \"Should not already be working.\" );\n      }\n    }\n\n    flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n    // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n      prepareFreshStack(root, expirationTime);\n      startWorkOnPendingInteractions(root, expirationTime);\n    } // If we have a work-in-progress fiber, it means there's still work to do\n    // in this root.\n\n\n    if (workInProgress !== null) {\n      var prevExecutionContext = executionContext;\n      executionContext |= RenderContext;\n      var prevDispatcher = pushDispatcher();\n      var prevInteractions = pushInteractions(root);\n      startWorkLoopTimer(workInProgress);\n\n      do {\n        try {\n          workLoopConcurrent();\n          break;\n        } catch (thrownValue) {\n          handleError(root, thrownValue);\n        }\n      } while (true);\n\n      resetContextDependencies();\n      executionContext = prevExecutionContext;\n      popDispatcher(prevDispatcher);\n\n      {\n        popInteractions(prevInteractions);\n      }\n\n      if (workInProgressRootExitStatus === RootFatalErrored) {\n        var fatalError = workInProgressRootFatalError;\n        stopInterruptedWorkLoopTimer();\n        prepareFreshStack(root, expirationTime);\n        markRootSuspendedAtTime(root, expirationTime);\n        ensureRootIsScheduled(root);\n        throw fatalError;\n      }\n\n      if (workInProgress !== null) {\n        // There's still work left over. Exit without committing.\n        stopInterruptedWorkLoopTimer();\n      } else {\n        // We now have a consistent tree. The next step is either to commit it,\n        // or, if something suspended, wait to commit it after a timeout.\n        stopFinishedWorkLoopTimer();\n        var finishedWork = root.finishedWork = root.current.alternate;\n        root.finishedExpirationTime = expirationTime;\n        finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime);\n      }\n\n      ensureRootIsScheduled(root);\n\n      if (root.callbackNode === originalCallbackNode) {\n        // The task node scheduled for this root is the same one that's\n        // currently executed. Need to return a continuation.\n        return performConcurrentWorkOnRoot.bind(null, root);\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) {\n  // Set this to null to indicate there's no in-progress render.\n  workInProgressRoot = null;\n\n  switch (exitStatus) {\n    case RootIncomplete:\n    case RootFatalErrored:\n      {\n        {\n          {\n            throw Error( \"Root did not complete. This is a bug in React.\" );\n          }\n        }\n      }\n    // Flow knows about invariant, so it complains if I add a break\n    // statement, but eslint doesn't know about invariant, so it complains\n    // if I do. eslint-disable-next-line no-fallthrough\n\n    case RootErrored:\n      {\n        // If this was an async render, the error may have happened due to\n        // a mutation in a concurrent event. Try rendering one more time,\n        // synchronously, to see if the error goes away. If there are\n        // lower priority updates, let's include those, too, in case they\n        // fix the inconsistency. Render at Idle to include all updates.\n        // If it was Idle or Never or some not-yet-invented time, render\n        // at that time.\n        markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous\n        // and therefore not hit this path again.\n\n        break;\n      }\n\n    case RootSuspended:\n      {\n        markRootSuspendedAtTime(root, expirationTime);\n        var lastSuspendedTime = root.lastSuspendedTime;\n\n        if (expirationTime === lastSuspendedTime) {\n          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n        } // We have an acceptable loading state. We need to figure out if we\n        // should immediately commit it or wait a bit.\n        // If we have processed new updates during this render, we may now\n        // have a new loading state ready. We want to ensure that we commit\n        // that as soon as possible.\n\n\n        var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync;\n\n        if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current)) {\n          // If we have not processed any new updates during this pass, then\n          // this is either a retry of an existing fallback state or a\n          // hidden tree. Hidden trees shouldn't be batched with other work\n          // and after that's fixed it can only be a retry. We're going to\n          // throttle committing retries so that we don't show too many\n          // loading states too quickly.\n          var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.\n\n          if (msUntilTimeout > 10) {\n            if (workInProgressRootHasPendingPing) {\n              var lastPingedTime = root.lastPingedTime;\n\n              if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) {\n                // This render was pinged but we didn't get to restart\n                // earlier so try restarting now instead.\n                root.lastPingedTime = expirationTime;\n                prepareFreshStack(root, expirationTime);\n                break;\n              }\n            }\n\n            var nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n            if (nextTime !== NoWork && nextTime !== expirationTime) {\n              // There's additional work on this root.\n              break;\n            }\n\n            if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) {\n              // We should prefer to render the fallback of at the last\n              // suspended level. Ping the last suspended level to try\n              // rendering it again.\n              root.lastPingedTime = lastSuspendedTime;\n              break;\n            } // The render is suspended, it hasn't timed out, and there's no\n            // lower priority work to do. Instead of committing the fallback\n            // immediately, wait for more data to arrive.\n\n\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);\n            break;\n          }\n        } // The work expired. Commit immediately.\n\n\n        commitRoot(root);\n        break;\n      }\n\n    case RootSuspendedWithDelay:\n      {\n        markRootSuspendedAtTime(root, expirationTime);\n        var _lastSuspendedTime = root.lastSuspendedTime;\n\n        if (expirationTime === _lastSuspendedTime) {\n          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n        }\n\n        if ( // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current)) {\n          // We're suspended in a state that should be avoided. We'll try to\n          // avoid committing it for as long as the timeouts let us.\n          if (workInProgressRootHasPendingPing) {\n            var _lastPingedTime = root.lastPingedTime;\n\n            if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) {\n              // This render was pinged but we didn't get to restart earlier\n              // so try restarting now instead.\n              root.lastPingedTime = expirationTime;\n              prepareFreshStack(root, expirationTime);\n              break;\n            }\n          }\n\n          var _nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n          if (_nextTime !== NoWork && _nextTime !== expirationTime) {\n            // There's additional work on this root.\n            break;\n          }\n\n          if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) {\n            // We should prefer to render the fallback of at the last\n            // suspended level. Ping the last suspended level to try\n            // rendering it again.\n            root.lastPingedTime = _lastSuspendedTime;\n            break;\n          }\n\n          var _msUntilTimeout;\n\n          if (workInProgressRootLatestSuspenseTimeout !== Sync) {\n            // We have processed a suspense config whose expiration time we\n            // can use as the timeout.\n            _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now();\n          } else if (workInProgressRootLatestProcessedExpirationTime === Sync) {\n            // This should never normally happen because only new updates\n            // cause delayed states, so we should have processed something.\n            // However, this could also happen in an offscreen tree.\n            _msUntilTimeout = 0;\n          } else {\n            // If we don't have a suspense config, we're going to use a\n            // heuristic to determine how long we can suspend.\n            var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime);\n            var currentTimeMs = now();\n            var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs;\n            var timeElapsed = currentTimeMs - eventTimeMs;\n\n            if (timeElapsed < 0) {\n              // We get this wrong some time since we estimate the time.\n              timeElapsed = 0;\n            }\n\n            _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the\n            // event time is exact instead of inferred from expiration time\n            // we don't need this.\n\n            if (timeUntilExpirationMs < _msUntilTimeout) {\n              _msUntilTimeout = timeUntilExpirationMs;\n            }\n          } // Don't bother with a very short suspense time.\n\n\n          if (_msUntilTimeout > 10) {\n            // The render is suspended, it hasn't timed out, and there's no\n            // lower priority work to do. Instead of committing the fallback\n            // immediately, wait for more data to arrive.\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);\n            break;\n          }\n        } // The work expired. Commit immediately.\n\n\n        commitRoot(root);\n        break;\n      }\n\n    case RootCompleted:\n      {\n        // The work completed. Ready to commit.\n        if ( // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) {\n          // If we have exceeded the minimum loading delay, which probably\n          // means we have shown a spinner already, we might have to suspend\n          // a bit longer to ensure that the spinner is shown for\n          // enough time.\n          var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig);\n\n          if (_msUntilTimeout2 > 10) {\n            markRootSuspendedAtTime(root, expirationTime);\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2);\n            break;\n          }\n        }\n\n        commitRoot(root);\n        break;\n      }\n\n    default:\n      {\n        {\n          {\n            throw Error( \"Unknown root exit status.\" );\n          }\n        }\n      }\n  }\n} // This is the entry point for synchronous tasks that don't go\n// through Scheduler\n\n\nfunction performSyncWorkOnRoot(root) {\n  // Check if there's expired work on this root. Otherwise, render at Sync.\n  var lastExpiredTime = root.lastExpiredTime;\n  var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync;\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Should not already be working.\" );\n    }\n  }\n\n  flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n  // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n  if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n    prepareFreshStack(root, expirationTime);\n    startWorkOnPendingInteractions(root, expirationTime);\n  } // If we have a work-in-progress fiber, it means there's still work to do\n  // in this root.\n\n\n  if (workInProgress !== null) {\n    var prevExecutionContext = executionContext;\n    executionContext |= RenderContext;\n    var prevDispatcher = pushDispatcher();\n    var prevInteractions = pushInteractions(root);\n    startWorkLoopTimer(workInProgress);\n\n    do {\n      try {\n        workLoopSync();\n        break;\n      } catch (thrownValue) {\n        handleError(root, thrownValue);\n      }\n    } while (true);\n\n    resetContextDependencies();\n    executionContext = prevExecutionContext;\n    popDispatcher(prevDispatcher);\n\n    {\n      popInteractions(prevInteractions);\n    }\n\n    if (workInProgressRootExitStatus === RootFatalErrored) {\n      var fatalError = workInProgressRootFatalError;\n      stopInterruptedWorkLoopTimer();\n      prepareFreshStack(root, expirationTime);\n      markRootSuspendedAtTime(root, expirationTime);\n      ensureRootIsScheduled(root);\n      throw fatalError;\n    }\n\n    if (workInProgress !== null) {\n      // This is a sync render, so we should have finished the whole tree.\n      {\n        {\n          throw Error( \"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n    } else {\n      // We now have a consistent tree. Because this is a sync render, we\n      // will commit it even if something suspended.\n      stopFinishedWorkLoopTimer();\n      root.finishedWork = root.current.alternate;\n      root.finishedExpirationTime = expirationTime;\n      finishSyncRender(root);\n    } // Before exiting, make sure there's a callback scheduled for the next\n    // pending level.\n\n\n    ensureRootIsScheduled(root);\n  }\n\n  return null;\n}\n\nfunction finishSyncRender(root) {\n  // Set this to null to indicate there's no in-progress render.\n  workInProgressRoot = null;\n  commitRoot(root);\n}\nfunction flushDiscreteUpdates() {\n  // TODO: Should be able to flush inside batchedUpdates, but not inside `act`.\n  // However, `act` uses `batchedUpdates`, so there's no way to distinguish\n  // those two cases. Need to fix this before exposing flushDiscreteUpdates\n  // as a public API.\n  if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) {\n    {\n      if ((executionContext & RenderContext) !== NoContext) {\n        error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.');\n      }\n    } // We're already rendering, so we can't synchronously flush pending work.\n    // This is probably a nested event dispatch triggered by a lifecycle/effect,\n    // like `el.focus()`. Exit.\n\n\n    return;\n  }\n\n  flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that\n  // they fire before the next serial event.\n\n  flushPassiveEffects();\n}\nfunction syncUpdates(fn, a, b, c) {\n  return runWithPriority$1(ImmediatePriority, fn.bind(null, a, b, c));\n}\n\nfunction flushPendingDiscreteUpdates() {\n  if (rootsWithPendingDiscreteUpdates !== null) {\n    // For each root with pending discrete updates, schedule a callback to\n    // immediately flush them.\n    var roots = rootsWithPendingDiscreteUpdates;\n    rootsWithPendingDiscreteUpdates = null;\n    roots.forEach(function (expirationTime, root) {\n      markRootExpiredAtTime(root, expirationTime);\n      ensureRootIsScheduled(root);\n    }); // Now flush the immediate queue.\n\n    flushSyncCallbackQueue();\n  }\n}\n\nfunction batchedUpdates$1(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext |= BatchedContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction batchedEventUpdates$1(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext |= EventContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction discreteUpdates$1(fn, a, b, c, d) {\n  var prevExecutionContext = executionContext;\n  executionContext |= DiscreteEventContext;\n\n  try {\n    // Should this\n    return runWithPriority$1(UserBlockingPriority$1, fn.bind(null, a, b, c, d));\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction unbatchedUpdates(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext &= ~BatchedContext;\n  executionContext |= LegacyUnbatchedContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction flushSync(fn, a) {\n  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n    {\n      {\n        throw Error( \"flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.\" );\n      }\n    }\n  }\n\n  var prevExecutionContext = executionContext;\n  executionContext |= BatchedContext;\n\n  try {\n    return runWithPriority$1(ImmediatePriority, fn.bind(null, a));\n  } finally {\n    executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.\n    // Note that this will happen even if batchedUpdates is higher up\n    // the stack.\n\n    flushSyncCallbackQueue();\n  }\n}\n\nfunction prepareFreshStack(root, expirationTime) {\n  root.finishedWork = null;\n  root.finishedExpirationTime = NoWork;\n  var timeoutHandle = root.timeoutHandle;\n\n  if (timeoutHandle !== noTimeout) {\n    // The root previous suspended and scheduled a timeout to commit a fallback\n    // state. Now that we have additional work, cancel the timeout.\n    root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above\n\n    cancelTimeout(timeoutHandle);\n  }\n\n  if (workInProgress !== null) {\n    var interruptedWork = workInProgress.return;\n\n    while (interruptedWork !== null) {\n      unwindInterruptedWork(interruptedWork);\n      interruptedWork = interruptedWork.return;\n    }\n  }\n\n  workInProgressRoot = root;\n  workInProgress = createWorkInProgress(root.current, null);\n  renderExpirationTime$1 = expirationTime;\n  workInProgressRootExitStatus = RootIncomplete;\n  workInProgressRootFatalError = null;\n  workInProgressRootLatestProcessedExpirationTime = Sync;\n  workInProgressRootLatestSuspenseTimeout = Sync;\n  workInProgressRootCanSuspendUsingConfig = null;\n  workInProgressRootNextUnprocessedUpdateTime = NoWork;\n  workInProgressRootHasPendingPing = false;\n\n  {\n    spawnedWorkDuringRender = null;\n  }\n\n  {\n    ReactStrictModeWarnings.discardPendingWarnings();\n  }\n}\n\nfunction handleError(root, thrownValue) {\n  do {\n    try {\n      // Reset module-level state that was set during the render phase.\n      resetContextDependencies();\n      resetHooksAfterThrow();\n      resetCurrentFiber();\n\n      if (workInProgress === null || workInProgress.return === null) {\n        // Expected to be working on a non-root fiber. This is a fatal error\n        // because there's no ancestor that can handle it; the root is\n        // supposed to capture all errors that weren't caught by an error\n        // boundary.\n        workInProgressRootExitStatus = RootFatalErrored;\n        workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next\n        // sibling, or the parent if there are no siblings. But since the root\n        // has no siblings nor a parent, we set it to null. Usually this is\n        // handled by `completeUnitOfWork` or `unwindWork`, but since we're\n        // interntionally not calling those, we need set it here.\n        // TODO: Consider calling `unwindWork` to pop the contexts.\n\n        workInProgress = null;\n        return null;\n      }\n\n      if (enableProfilerTimer && workInProgress.mode & ProfileMode) {\n        // Record the time spent rendering before an error was thrown. This\n        // avoids inaccurate Profiler durations in the case of a\n        // suspended render.\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);\n      }\n\n      throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime$1);\n      workInProgress = completeUnitOfWork(workInProgress);\n    } catch (yetAnotherThrownValue) {\n      // Something in the return path also threw.\n      thrownValue = yetAnotherThrownValue;\n      continue;\n    } // Return to the normal work loop.\n\n\n    return;\n  } while (true);\n}\n\nfunction pushDispatcher(root) {\n  var prevDispatcher = ReactCurrentDispatcher$1.current;\n  ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;\n\n  if (prevDispatcher === null) {\n    // The React isomorphic package does not include a default dispatcher.\n    // Instead the first renderer will lazily attach one, in order to give\n    // nicer error messages.\n    return ContextOnlyDispatcher;\n  } else {\n    return prevDispatcher;\n  }\n}\n\nfunction popDispatcher(prevDispatcher) {\n  ReactCurrentDispatcher$1.current = prevDispatcher;\n}\n\nfunction pushInteractions(root) {\n  {\n    var prevInteractions = tracing.__interactionsRef.current;\n    tracing.__interactionsRef.current = root.memoizedInteractions;\n    return prevInteractions;\n  }\n}\n\nfunction popInteractions(prevInteractions) {\n  {\n    tracing.__interactionsRef.current = prevInteractions;\n  }\n}\n\nfunction markCommitTimeOfFallback() {\n  globalMostRecentFallbackTime = now();\n}\nfunction markRenderEventTimeAndConfig(expirationTime, suspenseConfig) {\n  if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) {\n    workInProgressRootLatestProcessedExpirationTime = expirationTime;\n  }\n\n  if (suspenseConfig !== null) {\n    if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) {\n      workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad.\n\n      workInProgressRootCanSuspendUsingConfig = suspenseConfig;\n    }\n  }\n}\nfunction markUnprocessedUpdateTime(expirationTime) {\n  if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) {\n    workInProgressRootNextUnprocessedUpdateTime = expirationTime;\n  }\n}\nfunction renderDidSuspend() {\n  if (workInProgressRootExitStatus === RootIncomplete) {\n    workInProgressRootExitStatus = RootSuspended;\n  }\n}\nfunction renderDidSuspendDelayIfPossible() {\n  if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) {\n    workInProgressRootExitStatus = RootSuspendedWithDelay;\n  } // Check if there's a lower priority update somewhere else in the tree.\n\n\n  if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) {\n    // Mark the current render as suspended, and then mark that there's a\n    // pending update.\n    // TODO: This should immediately interrupt the current render, instead\n    // of waiting until the next time we yield.\n    markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime$1);\n    markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime);\n  }\n}\nfunction renderDidError() {\n  if (workInProgressRootExitStatus !== RootCompleted) {\n    workInProgressRootExitStatus = RootErrored;\n  }\n} // Called during render to determine if anything has suspended.\n// Returns false if we're not sure.\n\nfunction renderHasNotSuspendedYet() {\n  // If something errored or completed, we can't really be sure,\n  // so those are false.\n  return workInProgressRootExitStatus === RootIncomplete;\n}\n\nfunction inferTimeFromExpirationTime(expirationTime) {\n  // We don't know exactly when the update was scheduled, but we can infer an\n  // approximate start time from the expiration time.\n  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n  return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;\n}\n\nfunction inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) {\n  // We don't know exactly when the update was scheduled, but we can infer an\n  // approximate start time from the expiration time by subtracting the timeout\n  // that was added to the event time.\n  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n  return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n} // The work loop is an extremely hot path. Tell Closure not to inline it.\n\n/** @noinline */\n\n\nfunction workLoopSync() {\n  // Already timed out, so perform work without checking if we need to yield.\n  while (workInProgress !== null) {\n    workInProgress = performUnitOfWork(workInProgress);\n  }\n}\n/** @noinline */\n\n\nfunction workLoopConcurrent() {\n  // Perform work until Scheduler asks us to yield\n  while (workInProgress !== null && !shouldYield()) {\n    workInProgress = performUnitOfWork(workInProgress);\n  }\n}\n\nfunction performUnitOfWork(unitOfWork) {\n  // The current, flushed, state of this fiber is the alternate. Ideally\n  // nothing should rely on this, but relying on it here means that we don't\n  // need an additional field on the work in progress.\n  var current = unitOfWork.alternate;\n  startWorkTimer(unitOfWork);\n  setCurrentFiber(unitOfWork);\n  var next;\n\n  if ( (unitOfWork.mode & ProfileMode) !== NoMode) {\n    startProfilerTimer(unitOfWork);\n    next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n    stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);\n  } else {\n    next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n  }\n\n  resetCurrentFiber();\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n\n  if (next === null) {\n    // If this doesn't spawn new work, complete the current work.\n    next = completeUnitOfWork(unitOfWork);\n  }\n\n  ReactCurrentOwner$2.current = null;\n  return next;\n}\n\nfunction completeUnitOfWork(unitOfWork) {\n  // Attempt to complete the current unit of work, then move to the next\n  // sibling. If there are no more siblings, return to the parent fiber.\n  workInProgress = unitOfWork;\n\n  do {\n    // The current, flushed, state of this fiber is the alternate. Ideally\n    // nothing should rely on this, but relying on it here means that we don't\n    // need an additional field on the work in progress.\n    var current = workInProgress.alternate;\n    var returnFiber = workInProgress.return; // Check if the work completed or if something threw.\n\n    if ((workInProgress.effectTag & Incomplete) === NoEffect) {\n      setCurrentFiber(workInProgress);\n      var next = void 0;\n\n      if ( (workInProgress.mode & ProfileMode) === NoMode) {\n        next = completeWork(current, workInProgress, renderExpirationTime$1);\n      } else {\n        startProfilerTimer(workInProgress);\n        next = completeWork(current, workInProgress, renderExpirationTime$1); // Update render duration assuming we didn't error.\n\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);\n      }\n\n      stopWorkTimer(workInProgress);\n      resetCurrentFiber();\n      resetChildExpirationTime(workInProgress);\n\n      if (next !== null) {\n        // Completing this fiber spawned new work. Work on that next.\n        return next;\n      }\n\n      if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete\n      (returnFiber.effectTag & Incomplete) === NoEffect) {\n        // Append all the effects of the subtree and this fiber onto the effect\n        // list of the parent. The completion order of the children affects the\n        // side-effect order.\n        if (returnFiber.firstEffect === null) {\n          returnFiber.firstEffect = workInProgress.firstEffect;\n        }\n\n        if (workInProgress.lastEffect !== null) {\n          if (returnFiber.lastEffect !== null) {\n            returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;\n          }\n\n          returnFiber.lastEffect = workInProgress.lastEffect;\n        } // If this fiber had side-effects, we append it AFTER the children's\n        // side-effects. We can perform certain side-effects earlier if needed,\n        // by doing multiple passes over the effect list. We don't want to\n        // schedule our own side-effect on our own list because if end up\n        // reusing children we'll schedule this effect onto itself since we're\n        // at the end.\n\n\n        var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect\n        // list. PerformedWork effect is read by React DevTools but shouldn't be\n        // committed.\n\n        if (effectTag > PerformedWork) {\n          if (returnFiber.lastEffect !== null) {\n            returnFiber.lastEffect.nextEffect = workInProgress;\n          } else {\n            returnFiber.firstEffect = workInProgress;\n          }\n\n          returnFiber.lastEffect = workInProgress;\n        }\n      }\n    } else {\n      // This fiber did not complete because something threw. Pop values off\n      // the stack without entering the complete phase. If this is a boundary,\n      // capture values if possible.\n      var _next = unwindWork(workInProgress); // Because this fiber did not complete, don't reset its expiration time.\n\n\n      if ( (workInProgress.mode & ProfileMode) !== NoMode) {\n        // Record the render duration for the fiber that errored.\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing.\n\n        var actualDuration = workInProgress.actualDuration;\n        var child = workInProgress.child;\n\n        while (child !== null) {\n          actualDuration += child.actualDuration;\n          child = child.sibling;\n        }\n\n        workInProgress.actualDuration = actualDuration;\n      }\n\n      if (_next !== null) {\n        // If completing this work spawned new work, do that next. We'll come\n        // back here again.\n        // Since we're restarting, remove anything that is not a host effect\n        // from the effect tag.\n        // TODO: The name stopFailedWorkTimer is misleading because Suspense\n        // also captures and restarts.\n        stopFailedWorkTimer(workInProgress);\n        _next.effectTag &= HostEffectMask;\n        return _next;\n      }\n\n      stopWorkTimer(workInProgress);\n\n      if (returnFiber !== null) {\n        // Mark the parent fiber as incomplete and clear its effect list.\n        returnFiber.firstEffect = returnFiber.lastEffect = null;\n        returnFiber.effectTag |= Incomplete;\n      }\n    }\n\n    var siblingFiber = workInProgress.sibling;\n\n    if (siblingFiber !== null) {\n      // If there is more work to do in this returnFiber, do that next.\n      return siblingFiber;\n    } // Otherwise, return to the parent\n\n\n    workInProgress = returnFiber;\n  } while (workInProgress !== null); // We've reached the root.\n\n\n  if (workInProgressRootExitStatus === RootIncomplete) {\n    workInProgressRootExitStatus = RootCompleted;\n  }\n\n  return null;\n}\n\nfunction getRemainingExpirationTime(fiber) {\n  var updateExpirationTime = fiber.expirationTime;\n  var childExpirationTime = fiber.childExpirationTime;\n  return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime;\n}\n\nfunction resetChildExpirationTime(completedWork) {\n  if (renderExpirationTime$1 !== Never && completedWork.childExpirationTime === Never) {\n    // The children of this component are hidden. Don't bubble their\n    // expiration times.\n    return;\n  }\n\n  var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time.\n\n  if ( (completedWork.mode & ProfileMode) !== NoMode) {\n    // In profiling mode, resetChildExpirationTime is also used to reset\n    // profiler durations.\n    var actualDuration = completedWork.actualDuration;\n    var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will\n    // only be updated if work is done on the fiber (i.e. it doesn't bailout).\n    // When work is done, it should bubble to the parent's actualDuration. If\n    // the fiber has not been cloned though, (meaning no work was done), then\n    // this value will reflect the amount of time spent working on a previous\n    // render. In that case it should not bubble. We determine whether it was\n    // cloned by comparing the child pointer.\n\n    var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child;\n    var child = completedWork.child;\n\n    while (child !== null) {\n      var childUpdateExpirationTime = child.expirationTime;\n      var childChildExpirationTime = child.childExpirationTime;\n\n      if (childUpdateExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = childUpdateExpirationTime;\n      }\n\n      if (childChildExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = childChildExpirationTime;\n      }\n\n      if (shouldBubbleActualDurations) {\n        actualDuration += child.actualDuration;\n      }\n\n      treeBaseDuration += child.treeBaseDuration;\n      child = child.sibling;\n    }\n\n    completedWork.actualDuration = actualDuration;\n    completedWork.treeBaseDuration = treeBaseDuration;\n  } else {\n    var _child = completedWork.child;\n\n    while (_child !== null) {\n      var _childUpdateExpirationTime = _child.expirationTime;\n      var _childChildExpirationTime = _child.childExpirationTime;\n\n      if (_childUpdateExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = _childUpdateExpirationTime;\n      }\n\n      if (_childChildExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = _childChildExpirationTime;\n      }\n\n      _child = _child.sibling;\n    }\n  }\n\n  completedWork.childExpirationTime = newChildExpirationTime;\n}\n\nfunction commitRoot(root) {\n  var renderPriorityLevel = getCurrentPriorityLevel();\n  runWithPriority$1(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel));\n  return null;\n}\n\nfunction commitRootImpl(root, renderPriorityLevel) {\n  do {\n    // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which\n    // means `flushPassiveEffects` will sometimes result in additional\n    // passive effects. So we need to keep flushing in a loop until there are\n    // no more pending effects.\n    // TODO: Might be better if `flushPassiveEffects` did not automatically\n    // flush synchronous work at the end, to avoid factoring hazards like this.\n    flushPassiveEffects();\n  } while (rootWithPendingPassiveEffects !== null);\n\n  flushRenderPhaseStrictModeWarningsInDEV();\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Should not already be working.\" );\n    }\n  }\n\n  var finishedWork = root.finishedWork;\n  var expirationTime = root.finishedExpirationTime;\n\n  if (finishedWork === null) {\n    return null;\n  }\n\n  root.finishedWork = null;\n  root.finishedExpirationTime = NoWork;\n\n  if (!(finishedWork !== root.current)) {\n    {\n      throw Error( \"Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  } // commitRoot never returns a continuation; it always finishes synchronously.\n  // So we can clear these now to allow a new callback to be scheduled.\n\n\n  root.callbackNode = null;\n  root.callbackExpirationTime = NoWork;\n  root.callbackPriority = NoPriority;\n  root.nextKnownPendingLevel = NoWork;\n  startCommitTimer(); // Update the first and last pending times on this root. The new first\n  // pending time is whatever is left on the root fiber.\n\n  var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork);\n  markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit);\n\n  if (root === workInProgressRoot) {\n    // We can reset these now that they are finished.\n    workInProgressRoot = null;\n    workInProgress = null;\n    renderExpirationTime$1 = NoWork;\n  } // This indicates that the last root we worked on is not the same one that\n  // we're committing now. This most commonly happens when a suspended root\n  // times out.\n  // Get the list of effects.\n\n\n  var firstEffect;\n\n  if (finishedWork.effectTag > PerformedWork) {\n    // A fiber's effect list consists only of its children, not itself. So if\n    // the root has an effect, we need to add it to the end of the list. The\n    // resulting list is the set that would belong to the root's parent, if it\n    // had one; that is, all the effects in the tree including the root.\n    if (finishedWork.lastEffect !== null) {\n      finishedWork.lastEffect.nextEffect = finishedWork;\n      firstEffect = finishedWork.firstEffect;\n    } else {\n      firstEffect = finishedWork;\n    }\n  } else {\n    // There is no effect on the root.\n    firstEffect = finishedWork.firstEffect;\n  }\n\n  if (firstEffect !== null) {\n    var prevExecutionContext = executionContext;\n    executionContext |= CommitContext;\n    var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles\n\n    ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass\n    // of the effect list for each phase: all mutation effects come before all\n    // layout effects, and so on.\n    // The first phase a \"before mutation\" phase. We use this phase to read the\n    // state of the host tree right before we mutate it. This is where\n    // getSnapshotBeforeUpdate is called.\n\n    startCommitSnapshotEffectsTimer();\n    prepareForCommit(root.containerInfo);\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitBeforeMutationEffects, null);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var error = clearCaughtError();\n          captureCommitPhaseError(nextEffect, error);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitSnapshotEffectsTimer();\n\n    {\n      // Mark the current commit time to be shared by all Profilers in this\n      // batch. This enables them to be grouped later.\n      recordCommitTime();\n    } // The next phase is the mutation phase, where we mutate the host tree.\n\n\n    startCommitHostEffectsTimer();\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error = clearCaughtError();\n\n          captureCommitPhaseError(nextEffect, _error);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitHostEffectsTimer();\n    resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after\n    // the mutation phase, so that the previous tree is still current during\n    // componentWillUnmount, but before the layout phase, so that the finished\n    // work is current during componentDidMount/Update.\n\n    root.current = finishedWork; // The next phase is the layout phase, where we call effects that read\n    // the host tree after it's been mutated. The idiomatic use case for this is\n    // layout, but class component lifecycles also fire here for legacy reasons.\n\n    startCommitLifeCyclesTimer();\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error2 = clearCaughtError();\n\n          captureCommitPhaseError(nextEffect, _error2);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitLifeCyclesTimer();\n    nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an\n    // opportunity to paint.\n\n    requestPaint();\n\n    {\n      popInteractions(prevInteractions);\n    }\n\n    executionContext = prevExecutionContext;\n  } else {\n    // No effects.\n    root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were\n    // no effects.\n    // TODO: Maybe there's a better way to report this.\n\n    startCommitSnapshotEffectsTimer();\n    stopCommitSnapshotEffectsTimer();\n\n    {\n      recordCommitTime();\n    }\n\n    startCommitHostEffectsTimer();\n    stopCommitHostEffectsTimer();\n    startCommitLifeCyclesTimer();\n    stopCommitLifeCyclesTimer();\n  }\n\n  stopCommitTimer();\n  var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;\n\n  if (rootDoesHavePassiveEffects) {\n    // This commit has passive effects. Stash a reference to them. But don't\n    // schedule a callback until after flushing layout work.\n    rootDoesHavePassiveEffects = false;\n    rootWithPendingPassiveEffects = root;\n    pendingPassiveEffectsExpirationTime = expirationTime;\n    pendingPassiveEffectsRenderPriority = renderPriorityLevel;\n  } else {\n    // We are done with the effect chain at this point so let's clear the\n    // nextEffect pointers to assist with GC. If we have passive effects, we'll\n    // clear this in flushPassiveEffects.\n    nextEffect = firstEffect;\n\n    while (nextEffect !== null) {\n      var nextNextEffect = nextEffect.nextEffect;\n      nextEffect.nextEffect = null;\n      nextEffect = nextNextEffect;\n    }\n  } // Check if there's remaining work on this root\n\n\n  var remainingExpirationTime = root.firstPendingTime;\n\n  if (remainingExpirationTime !== NoWork) {\n    {\n      if (spawnedWorkDuringRender !== null) {\n        var expirationTimes = spawnedWorkDuringRender;\n        spawnedWorkDuringRender = null;\n\n        for (var i = 0; i < expirationTimes.length; i++) {\n          scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions);\n        }\n      }\n\n      schedulePendingInteractions(root, remainingExpirationTime);\n    }\n  } else {\n    // If there's no remaining work, we can clear the set of already failed\n    // error boundaries.\n    legacyErrorBoundariesThatAlreadyFailed = null;\n  }\n\n  {\n    if (!rootDidHavePassiveEffects) {\n      // If there are no passive effects, then we can complete the pending interactions.\n      // Otherwise, we'll wait until after the passive effects are flushed.\n      // Wait to do this until after remaining work has been scheduled,\n      // so that we don't prematurely signal complete for interactions when there's e.g. hidden work.\n      finishPendingInteractions(root, expirationTime);\n    }\n  }\n\n  if (remainingExpirationTime === Sync) {\n    // Count the number of times the root synchronously re-renders without\n    // finishing. If there are too many, it indicates an infinite update loop.\n    if (root === rootWithNestedUpdates) {\n      nestedUpdateCount++;\n    } else {\n      nestedUpdateCount = 0;\n      rootWithNestedUpdates = root;\n    }\n  } else {\n    nestedUpdateCount = 0;\n  }\n\n  onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any\n  // additional work on this root is scheduled.\n\n  ensureRootIsScheduled(root);\n\n  if (hasUncaughtError) {\n    hasUncaughtError = false;\n    var _error3 = firstUncaughtError;\n    firstUncaughtError = null;\n    throw _error3;\n  }\n\n  if ((executionContext & LegacyUnbatchedContext) !== NoContext) {\n    // This is a legacy edge case. We just committed the initial mount of\n    // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired\n    // synchronously, but layout updates should be deferred until the end\n    // of the batch.\n    return null;\n  } // If layout work was scheduled, flush it now.\n\n\n  flushSyncCallbackQueue();\n  return null;\n}\n\nfunction commitBeforeMutationEffects() {\n  while (nextEffect !== null) {\n    var effectTag = nextEffect.effectTag;\n\n    if ((effectTag & Snapshot) !== NoEffect) {\n      setCurrentFiber(nextEffect);\n      recordEffect();\n      var current = nextEffect.alternate;\n      commitBeforeMutationLifeCycles(current, nextEffect);\n      resetCurrentFiber();\n    }\n\n    if ((effectTag & Passive) !== NoEffect) {\n      // If there are passive effects, schedule a callback to flush at\n      // the earliest opportunity.\n      if (!rootDoesHavePassiveEffects) {\n        rootDoesHavePassiveEffects = true;\n        scheduleCallback(NormalPriority, function () {\n          flushPassiveEffects();\n          return null;\n        });\n      }\n    }\n\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction commitMutationEffects(root, renderPriorityLevel) {\n  // TODO: Should probably move the bulk of this function to commitWork.\n  while (nextEffect !== null) {\n    setCurrentFiber(nextEffect);\n    var effectTag = nextEffect.effectTag;\n\n    if (effectTag & ContentReset) {\n      commitResetTextContent(nextEffect);\n    }\n\n    if (effectTag & Ref) {\n      var current = nextEffect.alternate;\n\n      if (current !== null) {\n        commitDetachRef(current);\n      }\n    } // The following switch statement is only concerned about placement,\n    // updates, and deletions. To avoid needing to add a case for every possible\n    // bitmap value, we remove the secondary effects from the effect tag and\n    // switch on that value.\n\n\n    var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating);\n\n    switch (primaryEffectTag) {\n      case Placement:\n        {\n          commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n          // inserted, before any life-cycles like componentDidMount gets called.\n          // TODO: findDOMNode doesn't rely on this any more but isMounted does\n          // and isMounted is deprecated anyway so we should be able to kill this.\n\n          nextEffect.effectTag &= ~Placement;\n          break;\n        }\n\n      case PlacementAndUpdate:\n        {\n          // Placement\n          commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n          // inserted, before any life-cycles like componentDidMount gets called.\n\n          nextEffect.effectTag &= ~Placement; // Update\n\n          var _current = nextEffect.alternate;\n          commitWork(_current, nextEffect);\n          break;\n        }\n\n      case Hydrating:\n        {\n          nextEffect.effectTag &= ~Hydrating;\n          break;\n        }\n\n      case HydratingAndUpdate:\n        {\n          nextEffect.effectTag &= ~Hydrating; // Update\n\n          var _current2 = nextEffect.alternate;\n          commitWork(_current2, nextEffect);\n          break;\n        }\n\n      case Update:\n        {\n          var _current3 = nextEffect.alternate;\n          commitWork(_current3, nextEffect);\n          break;\n        }\n\n      case Deletion:\n        {\n          commitDeletion(root, nextEffect, renderPriorityLevel);\n          break;\n        }\n    } // TODO: Only record a mutation effect if primaryEffectTag is non-zero.\n\n\n    recordEffect();\n    resetCurrentFiber();\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction commitLayoutEffects(root, committedExpirationTime) {\n  // TODO: Should probably move the bulk of this function to commitWork.\n  while (nextEffect !== null) {\n    setCurrentFiber(nextEffect);\n    var effectTag = nextEffect.effectTag;\n\n    if (effectTag & (Update | Callback)) {\n      recordEffect();\n      var current = nextEffect.alternate;\n      commitLifeCycles(root, current, nextEffect);\n    }\n\n    if (effectTag & Ref) {\n      recordEffect();\n      commitAttachRef(nextEffect);\n    }\n\n    resetCurrentFiber();\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction flushPassiveEffects() {\n  if (pendingPassiveEffectsRenderPriority !== NoPriority) {\n    var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority;\n    pendingPassiveEffectsRenderPriority = NoPriority;\n    return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl);\n  }\n}\n\nfunction flushPassiveEffectsImpl() {\n  if (rootWithPendingPassiveEffects === null) {\n    return false;\n  }\n\n  var root = rootWithPendingPassiveEffects;\n  var expirationTime = pendingPassiveEffectsExpirationTime;\n  rootWithPendingPassiveEffects = null;\n  pendingPassiveEffectsExpirationTime = NoWork;\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Cannot flush passive effects while already rendering.\" );\n    }\n  }\n\n  var prevExecutionContext = executionContext;\n  executionContext |= CommitContext;\n  var prevInteractions = pushInteractions(root);\n\n  {\n    // Note: This currently assumes there are no passive effects on the root fiber\n    // because the root is not part of its own effect list.\n    // This could change in the future.\n    var _effect2 = root.current.firstEffect;\n\n    while (_effect2 !== null) {\n      {\n        setCurrentFiber(_effect2);\n        invokeGuardedCallback(null, commitPassiveHookEffects, null, _effect2);\n\n        if (hasCaughtError()) {\n          if (!(_effect2 !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error5 = clearCaughtError();\n\n          captureCommitPhaseError(_effect2, _error5);\n        }\n\n        resetCurrentFiber();\n      }\n\n      var nextNextEffect = _effect2.nextEffect; // Remove nextEffect pointer to assist GC\n\n      _effect2.nextEffect = null;\n      _effect2 = nextNextEffect;\n    }\n  }\n\n  {\n    popInteractions(prevInteractions);\n    finishPendingInteractions(root, expirationTime);\n  }\n\n  executionContext = prevExecutionContext;\n  flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this\n  // exceeds the limit, we'll fire a warning.\n\n  nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1;\n  return true;\n}\n\nfunction isAlreadyFailedLegacyErrorBoundary(instance) {\n  return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);\n}\nfunction markLegacyErrorBoundaryAsFailed(instance) {\n  if (legacyErrorBoundariesThatAlreadyFailed === null) {\n    legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);\n  } else {\n    legacyErrorBoundariesThatAlreadyFailed.add(instance);\n  }\n}\n\nfunction prepareToThrowUncaughtError(error) {\n  if (!hasUncaughtError) {\n    hasUncaughtError = true;\n    firstUncaughtError = error;\n  }\n}\n\nvar onUncaughtError = prepareToThrowUncaughtError;\n\nfunction captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n  var errorInfo = createCapturedValue(error, sourceFiber);\n  var update = createRootErrorUpdate(rootFiber, errorInfo, Sync);\n  enqueueUpdate(rootFiber, update);\n  var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync);\n\n  if (root !== null) {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, Sync);\n  }\n}\n\nfunction captureCommitPhaseError(sourceFiber, error) {\n  if (sourceFiber.tag === HostRoot) {\n    // Error was thrown at the root. There is no parent, so the root\n    // itself should capture it.\n    captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n    return;\n  }\n\n  var fiber = sourceFiber.return;\n\n  while (fiber !== null) {\n    if (fiber.tag === HostRoot) {\n      captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);\n      return;\n    } else if (fiber.tag === ClassComponent) {\n      var ctor = fiber.type;\n      var instance = fiber.stateNode;\n\n      if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {\n        var errorInfo = createCapturedValue(error, sourceFiber);\n        var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync\n        Sync);\n        enqueueUpdate(fiber, update);\n        var root = markUpdateTimeFromFiberToRoot(fiber, Sync);\n\n        if (root !== null) {\n          ensureRootIsScheduled(root);\n          schedulePendingInteractions(root, Sync);\n        }\n\n        return;\n      }\n    }\n\n    fiber = fiber.return;\n  }\n}\nfunction pingSuspendedRoot(root, thenable, suspendedTime) {\n  var pingCache = root.pingCache;\n\n  if (pingCache !== null) {\n    // The thenable resolved, so we no longer need to memoize, because it will\n    // never be thrown again.\n    pingCache.delete(thenable);\n  }\n\n  if (workInProgressRoot === root && renderExpirationTime$1 === suspendedTime) {\n    // Received a ping at the same priority level at which we're currently\n    // rendering. We might want to restart this render. This should mirror\n    // the logic of whether or not a root suspends once it completes.\n    // TODO: If we're rendering sync either due to Sync, Batched or expired,\n    // we should probably never restart.\n    // If we're suspended with delay, we'll always suspend so we can always\n    // restart. If we're suspended without any updates, it might be a retry.\n    // If it's early in the retry we can restart. We can't know for sure\n    // whether we'll eventually process an update during this render pass,\n    // but it's somewhat unlikely that we get to a ping before that, since\n    // getting to the root most update is usually very fast.\n    if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {\n      // Restart from the root. Don't need to schedule a ping because\n      // we're already working on this tree.\n      prepareFreshStack(root, renderExpirationTime$1);\n    } else {\n      // Even though we can't restart right now, we might get an\n      // opportunity later. So we mark this render as having a ping.\n      workInProgressRootHasPendingPing = true;\n    }\n\n    return;\n  }\n\n  if (!isRootSuspendedAtTime(root, suspendedTime)) {\n    // The root is no longer suspended at this time.\n    return;\n  }\n\n  var lastPingedTime = root.lastPingedTime;\n\n  if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) {\n    // There's already a lower priority ping scheduled.\n    return;\n  } // Mark the time at which this ping was scheduled.\n\n\n  root.lastPingedTime = suspendedTime;\n\n  ensureRootIsScheduled(root);\n  schedulePendingInteractions(root, suspendedTime);\n}\n\nfunction retryTimedOutBoundary(boundaryFiber, retryTime) {\n  // The boundary fiber (a Suspense component or SuspenseList component)\n  // previously was rendered in its fallback state. One of the promises that\n  // suspended it has resolved, which means at least part of the tree was\n  // likely unblocked. Try rendering again, at a new expiration time.\n  if (retryTime === NoWork) {\n    var suspenseConfig = null; // Retries don't carry over the already committed update.\n\n    var currentTime = requestCurrentTimeForUpdate();\n    retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig);\n  } // TODO: Special case idle priority?\n\n\n  var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime);\n\n  if (root !== null) {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, retryTime);\n  }\n}\nfunction resolveRetryThenable(boundaryFiber, thenable) {\n  var retryTime = NoWork; // Default\n\n  var retryCache;\n\n  {\n    retryCache = boundaryFiber.stateNode;\n  }\n\n  if (retryCache !== null) {\n    // The thenable resolved, so we no longer need to memoize, because it will\n    // never be thrown again.\n    retryCache.delete(thenable);\n  }\n\n  retryTimedOutBoundary(boundaryFiber, retryTime);\n} // Computes the next Just Noticeable Difference (JND) boundary.\n// The theory is that a person can't tell the difference between small differences in time.\n// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable\n// difference in the experience. However, waiting for longer might mean that we can avoid\n// showing an intermediate loading state. The longer we have already waited, the harder it\n// is to tell small differences in time. Therefore, the longer we've already waited,\n// the longer we can wait additionally. At some point we have to give up though.\n// We pick a train model where the next boundary commits at a consistent schedule.\n// These particular numbers are vague estimates. We expect to adjust them based on research.\n\nfunction jnd(timeElapsed) {\n  return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;\n}\n\nfunction computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) {\n  var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0;\n\n  if (busyMinDurationMs <= 0) {\n    return 0;\n  }\n\n  var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire.\n\n  var currentTimeMs = now();\n  var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig);\n  var timeElapsed = currentTimeMs - eventTimeMs;\n\n  if (timeElapsed <= busyDelayMs) {\n    // If we haven't yet waited longer than the initial delay, we don't\n    // have to wait any additional time.\n    return 0;\n  }\n\n  var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`.\n\n  return msUntilTimeout;\n}\n\nfunction checkForNestedUpdates() {\n  if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {\n    nestedUpdateCount = 0;\n    rootWithNestedUpdates = null;\n\n    {\n      {\n        throw Error( \"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.\" );\n      }\n    }\n  }\n\n  {\n    if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {\n      nestedPassiveUpdateCount = 0;\n\n      error('Maximum update depth exceeded. This can happen when a component ' + \"calls setState inside useEffect, but useEffect either doesn't \" + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');\n    }\n  }\n}\n\nfunction flushRenderPhaseStrictModeWarningsInDEV() {\n  {\n    ReactStrictModeWarnings.flushLegacyContextWarning();\n\n    {\n      ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();\n    }\n  }\n}\n\nfunction stopFinishedWorkLoopTimer() {\n  var didCompleteRoot = true;\n  stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n  interruptedBy = null;\n}\n\nfunction stopInterruptedWorkLoopTimer() {\n  // TODO: Track which fiber caused the interruption.\n  var didCompleteRoot = false;\n  stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n  interruptedBy = null;\n}\n\nfunction checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) {\n  if ( workInProgressRoot !== null && updateExpirationTime > renderExpirationTime$1) {\n    interruptedBy = fiberThatReceivedUpdate;\n  }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = null;\n\nfunction warnAboutUpdateOnUnmountedFiberInDEV(fiber) {\n  {\n    var tag = fiber.tag;\n\n    if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) {\n      // Only warn for user-defined components, not internal ones like Suspense.\n      return;\n    }\n    // the problematic code almost always lies inside that component.\n\n\n    var componentName = getComponentName(fiber.type) || 'ReactComponent';\n\n    if (didWarnStateUpdateForUnmountedComponent !== null) {\n      if (didWarnStateUpdateForUnmountedComponent.has(componentName)) {\n        return;\n      }\n\n      didWarnStateUpdateForUnmountedComponent.add(componentName);\n    } else {\n      didWarnStateUpdateForUnmountedComponent = new Set([componentName]);\n    }\n\n    error(\"Can't perform a React state update on an unmounted component. This \" + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));\n  }\n}\n\nvar beginWork$1;\n\n{\n  var dummyFiber = null;\n\n  beginWork$1 = function (current, unitOfWork, expirationTime) {\n    // If a component throws an error, we replay it again in a synchronously\n    // dispatched event, so that the debugger will treat it as an uncaught\n    // error See ReactErrorUtils for more information.\n    // Before entering the begin phase, copy the work-in-progress onto a dummy\n    // fiber. If beginWork throws, we'll use this to reset the state.\n    var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);\n\n    try {\n      return beginWork(current, unitOfWork, expirationTime);\n    } catch (originalError) {\n      if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {\n        // Don't replay promises. Treat everything else like an error.\n        throw originalError;\n      } // Keep this code in sync with handleError; any changes here must have\n      // corresponding changes there.\n\n\n      resetContextDependencies();\n      resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the\n      // same fiber again.\n      // Unwind the failed stack frame\n\n      unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber.\n\n      assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);\n\n      if ( unitOfWork.mode & ProfileMode) {\n        // Reset the profiler timer.\n        startProfilerTimer(unitOfWork);\n      } // Run beginWork again.\n\n\n      invokeGuardedCallback(null, beginWork, null, current, unitOfWork, expirationTime);\n\n      if (hasCaughtError()) {\n        var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.\n        // Rethrow this error instead of the original one.\n\n        throw replayError;\n      } else {\n        // This branch is reachable if the render phase is impure.\n        throw originalError;\n      }\n    }\n  };\n}\n\nvar didWarnAboutUpdateInRender = false;\nvar didWarnAboutUpdateInRenderForAnotherComponent;\n\n{\n  didWarnAboutUpdateInRenderForAnotherComponent = new Set();\n}\n\nfunction warnAboutRenderPhaseUpdatesInDEV(fiber) {\n  {\n    if (isRendering && (executionContext & RenderContext) !== NoContext) {\n      switch (fiber.tag) {\n        case FunctionComponent:\n        case ForwardRef:\n        case SimpleMemoComponent:\n          {\n            var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.\n\n            var dedupeKey = renderingComponentName;\n\n            if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {\n              didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);\n              var setStateComponentName = getComponentName(fiber.type) || 'Unknown';\n\n              error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://fb.me/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);\n            }\n\n            break;\n          }\n\n        case ClassComponent:\n          {\n            if (!didWarnAboutUpdateInRender) {\n              error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');\n\n              didWarnAboutUpdateInRender = true;\n            }\n\n            break;\n          }\n      }\n    }\n  }\n} // a 'shared' variable that changes when act() opens/closes in tests.\n\n\nvar IsThisRendererActing = {\n  current: false\n};\nfunction warnIfNotScopedWithMatchingAct(fiber) {\n  {\n    if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) {\n      error(\"It looks like you're using the wrong act() around your test interactions.\\n\" + 'Be sure to use the matching version of act() corresponding to your renderer:\\n\\n' + '// for react-dom:\\n' + \"import {act} from 'react-dom/test-utils';\\n\" + '// ...\\n' + 'act(() => ...);\\n\\n' + '// for react-test-renderer:\\n' + \"import TestRenderer from 'react-test-renderer';\\n\" + 'const {act} = TestRenderer;\\n' + '// ...\\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\nfunction warnIfNotCurrentlyActingEffectsInDEV(fiber) {\n  {\n    if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n      error('An update to %s ran an effect, but was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\n\nfunction warnIfNotCurrentlyActingUpdatesInDEV(fiber) {\n  {\n    if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n      error('An update to %s inside a test was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\n\nvar warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler.\n\nvar didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked\n// scheduler is the actual recommendation. The alternative could be a testing build,\n// a new lib, or whatever; we dunno just yet. This message is for early adopters\n// to get their tests right.\n\nfunction warnIfUnmockedScheduler(fiber) {\n  {\n    if (didWarnAboutUnmockedScheduler === false && Scheduler.unstable_flushAllWithoutAsserting === undefined) {\n      if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) {\n        didWarnAboutUnmockedScheduler = true;\n\n        error('In Concurrent or Sync modes, the \"scheduler\" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \\n' + \"jest.mock('scheduler', () => require('scheduler/unstable_mock'));\\n\\n\" + 'For more info, visit https://fb.me/react-mock-scheduler');\n      }\n    }\n  }\n}\n\nfunction computeThreadID(root, expirationTime) {\n  // Interaction threads are unique per root and expiration time.\n  return expirationTime * 1000 + root.interactionThreadID;\n}\n\nfunction markSpawnedWork(expirationTime) {\n\n  if (spawnedWorkDuringRender === null) {\n    spawnedWorkDuringRender = [expirationTime];\n  } else {\n    spawnedWorkDuringRender.push(expirationTime);\n  }\n}\n\nfunction scheduleInteractions(root, expirationTime, interactions) {\n\n  if (interactions.size > 0) {\n    var pendingInteractionMap = root.pendingInteractionMap;\n    var pendingInteractions = pendingInteractionMap.get(expirationTime);\n\n    if (pendingInteractions != null) {\n      interactions.forEach(function (interaction) {\n        if (!pendingInteractions.has(interaction)) {\n          // Update the pending async work count for previously unscheduled interaction.\n          interaction.__count++;\n        }\n\n        pendingInteractions.add(interaction);\n      });\n    } else {\n      pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions.\n\n      interactions.forEach(function (interaction) {\n        interaction.__count++;\n      });\n    }\n\n    var subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null) {\n      var threadID = computeThreadID(root, expirationTime);\n      subscriber.onWorkScheduled(interactions, threadID);\n    }\n  }\n}\n\nfunction schedulePendingInteractions(root, expirationTime) {\n\n  scheduleInteractions(root, expirationTime, tracing.__interactionsRef.current);\n}\n\nfunction startWorkOnPendingInteractions(root, expirationTime) {\n  // we can accurately attribute time spent working on it, And so that cascading\n  // work triggered during the render phase will be associated with it.\n\n\n  var interactions = new Set();\n  root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n    if (scheduledExpirationTime >= expirationTime) {\n      scheduledInteractions.forEach(function (interaction) {\n        return interactions.add(interaction);\n      });\n    }\n  }); // Store the current set of interactions on the FiberRoot for a few reasons:\n  // We can re-use it in hot functions like performConcurrentWorkOnRoot()\n  // without having to recalculate it. We will also use it in commitWork() to\n  // pass to any Profiler onRender() hooks. This also provides DevTools with a\n  // way to access it when the onCommitRoot() hook is called.\n\n  root.memoizedInteractions = interactions;\n\n  if (interactions.size > 0) {\n    var subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null) {\n      var threadID = computeThreadID(root, expirationTime);\n\n      try {\n        subscriber.onWorkStarted(interactions, threadID);\n      } catch (error) {\n        // If the subscriber throws, rethrow it in a separate task\n        scheduleCallback(ImmediatePriority, function () {\n          throw error;\n        });\n      }\n    }\n  }\n}\n\nfunction finishPendingInteractions(root, committedExpirationTime) {\n\n  var earliestRemainingTimeAfterCommit = root.firstPendingTime;\n  var subscriber;\n\n  try {\n    subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null && root.memoizedInteractions.size > 0) {\n      var threadID = computeThreadID(root, committedExpirationTime);\n      subscriber.onWorkStopped(root.memoizedInteractions, threadID);\n    }\n  } catch (error) {\n    // If the subscriber throws, rethrow it in a separate task\n    scheduleCallback(ImmediatePriority, function () {\n      throw error;\n    });\n  } finally {\n    // Clear completed interactions from the pending Map.\n    // Unless the render was suspended or cascading work was scheduled,\n    // In which case– leave pending interactions until the subsequent render.\n    var pendingInteractionMap = root.pendingInteractionMap;\n    pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n      // Only decrement the pending interaction count if we're done.\n      // If there's still work at the current priority,\n      // That indicates that we are waiting for suspense data.\n      if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {\n        pendingInteractionMap.delete(scheduledExpirationTime);\n        scheduledInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber !== null && interaction.__count === 0) {\n            try {\n              subscriber.onInteractionScheduledWorkCompleted(interaction);\n            } catch (error) {\n              // If the subscriber throws, rethrow it in a separate task\n              scheduleCallback(ImmediatePriority, function () {\n                throw error;\n              });\n            }\n          }\n        });\n      }\n    });\n  }\n}\n\nvar onScheduleFiberRoot = null;\nvar onCommitFiberRoot = null;\nvar onCommitFiberUnmount = null;\nvar hasLoggedError = false;\nvar isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';\nfunction injectInternals(internals) {\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n    // No DevTools\n    return false;\n  }\n\n  var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n  if (hook.isDisabled) {\n    // This isn't a real property on the hook, but it can be set to opt out\n    // of DevTools integration and associated warnings and logs.\n    // https://github.com/facebook/react/issues/3877\n    return true;\n  }\n\n  if (!hook.supportsFiber) {\n    {\n      error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');\n    } // DevTools exists, even though it doesn't support Fiber.\n\n\n    return true;\n  }\n\n  try {\n    var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.\n\n    if (true) {\n      // Only used by Fast Refresh\n      if (typeof hook.onScheduleFiberRoot === 'function') {\n        onScheduleFiberRoot = function (root, children) {\n          try {\n            hook.onScheduleFiberRoot(rendererID, root, children);\n          } catch (err) {\n            if ( true && !hasLoggedError) {\n              hasLoggedError = true;\n\n              error('React instrumentation encountered an error: %s', err);\n            }\n          }\n        };\n      }\n    }\n\n    onCommitFiberRoot = function (root, expirationTime) {\n      try {\n        var didError = (root.current.effectTag & DidCapture) === DidCapture;\n\n        if (enableProfilerTimer) {\n          var currentTime = getCurrentTime();\n          var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);\n          hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError);\n        } else {\n          hook.onCommitFiberRoot(rendererID, root, undefined, didError);\n        }\n      } catch (err) {\n        if (true) {\n          if (!hasLoggedError) {\n            hasLoggedError = true;\n\n            error('React instrumentation encountered an error: %s', err);\n          }\n        }\n      }\n    };\n\n    onCommitFiberUnmount = function (fiber) {\n      try {\n        hook.onCommitFiberUnmount(rendererID, fiber);\n      } catch (err) {\n        if (true) {\n          if (!hasLoggedError) {\n            hasLoggedError = true;\n\n            error('React instrumentation encountered an error: %s', err);\n          }\n        }\n      }\n    };\n  } catch (err) {\n    // Catch all errors because it is unsafe to throw during initialization.\n    {\n      error('React instrumentation encountered an error: %s.', err);\n    }\n  } // DevTools exists\n\n\n  return true;\n}\nfunction onScheduleRoot(root, children) {\n  if (typeof onScheduleFiberRoot === 'function') {\n    onScheduleFiberRoot(root, children);\n  }\n}\nfunction onCommitRoot(root, expirationTime) {\n  if (typeof onCommitFiberRoot === 'function') {\n    onCommitFiberRoot(root, expirationTime);\n  }\n}\nfunction onCommitUnmount(fiber) {\n  if (typeof onCommitFiberUnmount === 'function') {\n    onCommitFiberUnmount(fiber);\n  }\n}\n\nvar hasBadMapPolyfill;\n\n{\n  hasBadMapPolyfill = false;\n\n  try {\n    var nonExtensibleObject = Object.preventExtensions({});\n    var testMap = new Map([[nonExtensibleObject, null]]);\n    var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused.\n    // https://github.com/rollup/rollup/issues/1771\n    // TODO: we can remove these if Rollup fixes the bug.\n\n    testMap.set(0, 0);\n    testSet.add(0);\n  } catch (e) {\n    // TODO: Consider warning about bad polyfills\n    hasBadMapPolyfill = true;\n  }\n}\n\nvar debugCounter = 1;\n\nfunction FiberNode(tag, pendingProps, key, mode) {\n  // Instance\n  this.tag = tag;\n  this.key = key;\n  this.elementType = null;\n  this.type = null;\n  this.stateNode = null; // Fiber\n\n  this.return = null;\n  this.child = null;\n  this.sibling = null;\n  this.index = 0;\n  this.ref = null;\n  this.pendingProps = pendingProps;\n  this.memoizedProps = null;\n  this.updateQueue = null;\n  this.memoizedState = null;\n  this.dependencies = null;\n  this.mode = mode; // Effects\n\n  this.effectTag = NoEffect;\n  this.nextEffect = null;\n  this.firstEffect = null;\n  this.lastEffect = null;\n  this.expirationTime = NoWork;\n  this.childExpirationTime = NoWork;\n  this.alternate = null;\n\n  {\n    // Note: The following is done to avoid a v8 performance cliff.\n    //\n    // Initializing the fields below to smis and later updating them with\n    // double values will cause Fibers to end up having separate shapes.\n    // This behavior/bug has something to do with Object.preventExtension().\n    // Fortunately this only impacts DEV builds.\n    // Unfortunately it makes React unusably slow for some applications.\n    // To work around this, initialize the fields below with doubles.\n    //\n    // Learn more about this here:\n    // https://github.com/facebook/react/issues/14365\n    // https://bugs.chromium.org/p/v8/issues/detail?id=8538\n    this.actualDuration = Number.NaN;\n    this.actualStartTime = Number.NaN;\n    this.selfBaseDuration = Number.NaN;\n    this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.\n    // This won't trigger the performance cliff mentioned above,\n    // and it simplifies other profiler code (including DevTools).\n\n    this.actualDuration = 0;\n    this.actualStartTime = -1;\n    this.selfBaseDuration = 0;\n    this.treeBaseDuration = 0;\n  } // This is normally DEV-only except www when it adds listeners.\n  // TODO: remove the User Timing integration in favor of Root Events.\n\n\n  {\n    this._debugID = debugCounter++;\n    this._debugIsCurrentlyTiming = false;\n  }\n\n  {\n    this._debugSource = null;\n    this._debugOwner = null;\n    this._debugNeedsRemount = false;\n    this._debugHookTypes = null;\n\n    if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {\n      Object.preventExtensions(this);\n    }\n  }\n} // This is a constructor function, rather than a POJO constructor, still\n// please ensure we do the following:\n// 1) Nobody should add any instance methods on this. Instance methods can be\n//    more difficult to predict when they get optimized and they are almost\n//    never inlined properly in static compilers.\n// 2) Nobody should rely on `instanceof Fiber` for type testing. We should\n//    always know when it is a fiber.\n// 3) We might want to experiment with using numeric keys since they are easier\n//    to optimize in a non-JIT environment.\n// 4) We can easily go from a constructor to a createFiber object literal if that\n//    is faster.\n// 5) It should be easy to port this to a C struct and keep a C implementation\n//    compatible.\n\n\nvar createFiber = function (tag, pendingProps, key, mode) {\n  // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors\n  return new FiberNode(tag, pendingProps, key, mode);\n};\n\nfunction shouldConstruct(Component) {\n  var prototype = Component.prototype;\n  return !!(prototype && prototype.isReactComponent);\n}\n\nfunction isSimpleFunctionComponent(type) {\n  return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;\n}\nfunction resolveLazyComponentTag(Component) {\n  if (typeof Component === 'function') {\n    return shouldConstruct(Component) ? ClassComponent : FunctionComponent;\n  } else if (Component !== undefined && Component !== null) {\n    var $$typeof = Component.$$typeof;\n\n    if ($$typeof === REACT_FORWARD_REF_TYPE) {\n      return ForwardRef;\n    }\n\n    if ($$typeof === REACT_MEMO_TYPE) {\n      return MemoComponent;\n    }\n  }\n\n  return IndeterminateComponent;\n} // This is used to create an alternate fiber to do work on.\n\nfunction createWorkInProgress(current, pendingProps) {\n  var workInProgress = current.alternate;\n\n  if (workInProgress === null) {\n    // We use a double buffering pooling technique because we know that we'll\n    // only ever need at most two versions of a tree. We pool the \"other\" unused\n    // node that we're free to reuse. This is lazily created to avoid allocating\n    // extra objects for things that are never updated. It also allow us to\n    // reclaim the extra memory if needed.\n    workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);\n    workInProgress.elementType = current.elementType;\n    workInProgress.type = current.type;\n    workInProgress.stateNode = current.stateNode;\n\n    {\n      // DEV-only fields\n      {\n        workInProgress._debugID = current._debugID;\n      }\n\n      workInProgress._debugSource = current._debugSource;\n      workInProgress._debugOwner = current._debugOwner;\n      workInProgress._debugHookTypes = current._debugHookTypes;\n    }\n\n    workInProgress.alternate = current;\n    current.alternate = workInProgress;\n  } else {\n    workInProgress.pendingProps = pendingProps; // We already have an alternate.\n    // Reset the effect tag.\n\n    workInProgress.effectTag = NoEffect; // The effect list is no longer valid.\n\n    workInProgress.nextEffect = null;\n    workInProgress.firstEffect = null;\n    workInProgress.lastEffect = null;\n\n    {\n      // We intentionally reset, rather than copy, actualDuration & actualStartTime.\n      // This prevents time from endlessly accumulating in new commits.\n      // This has the downside of resetting values for different priority renders,\n      // But works for yielding (the common case) and should support resuming.\n      workInProgress.actualDuration = 0;\n      workInProgress.actualStartTime = -1;\n    }\n  }\n\n  workInProgress.childExpirationTime = current.childExpirationTime;\n  workInProgress.expirationTime = current.expirationTime;\n  workInProgress.child = current.child;\n  workInProgress.memoizedProps = current.memoizedProps;\n  workInProgress.memoizedState = current.memoizedState;\n  workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n  // it cannot be shared with the current fiber.\n\n  var currentDependencies = current.dependencies;\n  workInProgress.dependencies = currentDependencies === null ? null : {\n    expirationTime: currentDependencies.expirationTime,\n    firstContext: currentDependencies.firstContext,\n    responders: currentDependencies.responders\n  }; // These will be overridden during the parent's reconciliation\n\n  workInProgress.sibling = current.sibling;\n  workInProgress.index = current.index;\n  workInProgress.ref = current.ref;\n\n  {\n    workInProgress.selfBaseDuration = current.selfBaseDuration;\n    workInProgress.treeBaseDuration = current.treeBaseDuration;\n  }\n\n  {\n    workInProgress._debugNeedsRemount = current._debugNeedsRemount;\n\n    switch (workInProgress.tag) {\n      case IndeterminateComponent:\n      case FunctionComponent:\n      case SimpleMemoComponent:\n        workInProgress.type = resolveFunctionForHotReloading(current.type);\n        break;\n\n      case ClassComponent:\n        workInProgress.type = resolveClassForHotReloading(current.type);\n        break;\n\n      case ForwardRef:\n        workInProgress.type = resolveForwardRefForHotReloading(current.type);\n        break;\n    }\n  }\n\n  return workInProgress;\n} // Used to reuse a Fiber for a second pass.\n\nfunction resetWorkInProgress(workInProgress, renderExpirationTime) {\n  // This resets the Fiber to what createFiber or createWorkInProgress would\n  // have set the values to before during the first pass. Ideally this wouldn't\n  // be necessary but unfortunately many code paths reads from the workInProgress\n  // when they should be reading from current and writing to workInProgress.\n  // We assume pendingProps, index, key, ref, return are still untouched to\n  // avoid doing another reconciliation.\n  // Reset the effect tag but keep any Placement tags, since that's something\n  // that child fiber is setting, not the reconciliation.\n  workInProgress.effectTag &= Placement; // The effect list is no longer valid.\n\n  workInProgress.nextEffect = null;\n  workInProgress.firstEffect = null;\n  workInProgress.lastEffect = null;\n  var current = workInProgress.alternate;\n\n  if (current === null) {\n    // Reset to createFiber's initial values.\n    workInProgress.childExpirationTime = NoWork;\n    workInProgress.expirationTime = renderExpirationTime;\n    workInProgress.child = null;\n    workInProgress.memoizedProps = null;\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null;\n    workInProgress.dependencies = null;\n\n    {\n      // Note: We don't reset the actualTime counts. It's useful to accumulate\n      // actual time across multiple render passes.\n      workInProgress.selfBaseDuration = 0;\n      workInProgress.treeBaseDuration = 0;\n    }\n  } else {\n    // Reset to the cloned values that createWorkInProgress would've.\n    workInProgress.childExpirationTime = current.childExpirationTime;\n    workInProgress.expirationTime = current.expirationTime;\n    workInProgress.child = current.child;\n    workInProgress.memoizedProps = current.memoizedProps;\n    workInProgress.memoizedState = current.memoizedState;\n    workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n    // it cannot be shared with the current fiber.\n\n    var currentDependencies = current.dependencies;\n    workInProgress.dependencies = currentDependencies === null ? null : {\n      expirationTime: currentDependencies.expirationTime,\n      firstContext: currentDependencies.firstContext,\n      responders: currentDependencies.responders\n    };\n\n    {\n      // Note: We don't reset the actualTime counts. It's useful to accumulate\n      // actual time across multiple render passes.\n      workInProgress.selfBaseDuration = current.selfBaseDuration;\n      workInProgress.treeBaseDuration = current.treeBaseDuration;\n    }\n  }\n\n  return workInProgress;\n}\nfunction createHostRootFiber(tag) {\n  var mode;\n\n  if (tag === ConcurrentRoot) {\n    mode = ConcurrentMode | BlockingMode | StrictMode;\n  } else if (tag === BlockingRoot) {\n    mode = BlockingMode | StrictMode;\n  } else {\n    mode = NoMode;\n  }\n\n  if ( isDevToolsPresent) {\n    // Always collect profile timings when DevTools are present.\n    // This enables DevTools to start capturing timing at any point–\n    // Without some nodes in the tree having empty base times.\n    mode |= ProfileMode;\n  }\n\n  return createFiber(HostRoot, null, null, mode);\n}\nfunction createFiberFromTypeAndProps(type, // React$ElementType\nkey, pendingProps, owner, mode, expirationTime) {\n  var fiber;\n  var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.\n\n  var resolvedType = type;\n\n  if (typeof type === 'function') {\n    if (shouldConstruct(type)) {\n      fiberTag = ClassComponent;\n\n      {\n        resolvedType = resolveClassForHotReloading(resolvedType);\n      }\n    } else {\n      {\n        resolvedType = resolveFunctionForHotReloading(resolvedType);\n      }\n    }\n  } else if (typeof type === 'string') {\n    fiberTag = HostComponent;\n  } else {\n    getTag: switch (type) {\n      case REACT_FRAGMENT_TYPE:\n        return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);\n\n      case REACT_CONCURRENT_MODE_TYPE:\n        fiberTag = Mode;\n        mode |= ConcurrentMode | BlockingMode | StrictMode;\n        break;\n\n      case REACT_STRICT_MODE_TYPE:\n        fiberTag = Mode;\n        mode |= StrictMode;\n        break;\n\n      case REACT_PROFILER_TYPE:\n        return createFiberFromProfiler(pendingProps, mode, expirationTime, key);\n\n      case REACT_SUSPENSE_TYPE:\n        return createFiberFromSuspense(pendingProps, mode, expirationTime, key);\n\n      case REACT_SUSPENSE_LIST_TYPE:\n        return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key);\n\n      default:\n        {\n          if (typeof type === 'object' && type !== null) {\n            switch (type.$$typeof) {\n              case REACT_PROVIDER_TYPE:\n                fiberTag = ContextProvider;\n                break getTag;\n\n              case REACT_CONTEXT_TYPE:\n                // This is a consumer\n                fiberTag = ContextConsumer;\n                break getTag;\n\n              case REACT_FORWARD_REF_TYPE:\n                fiberTag = ForwardRef;\n\n                {\n                  resolvedType = resolveForwardRefForHotReloading(resolvedType);\n                }\n\n                break getTag;\n\n              case REACT_MEMO_TYPE:\n                fiberTag = MemoComponent;\n                break getTag;\n\n              case REACT_LAZY_TYPE:\n                fiberTag = LazyComponent;\n                resolvedType = null;\n                break getTag;\n\n              case REACT_BLOCK_TYPE:\n                fiberTag = Block;\n                break getTag;\n\n            }\n          }\n\n          var info = '';\n\n          {\n            if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n              info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and \" + 'named imports.';\n            }\n\n            var ownerName = owner ? getComponentName(owner.type) : null;\n\n            if (ownerName) {\n              info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n            }\n          }\n\n          {\n            {\n              throw Error( \"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: \" + (type == null ? type : typeof type) + \".\" + info );\n            }\n          }\n        }\n    }\n  }\n\n  fiber = createFiber(fiberTag, pendingProps, key, mode);\n  fiber.elementType = type;\n  fiber.type = resolvedType;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromElement(element, mode, expirationTime) {\n  var owner = null;\n\n  {\n    owner = element._owner;\n  }\n\n  var type = element.type;\n  var key = element.key;\n  var pendingProps = element.props;\n  var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);\n\n  {\n    fiber._debugSource = element._source;\n    fiber._debugOwner = element._owner;\n  }\n\n  return fiber;\n}\nfunction createFiberFromFragment(elements, mode, expirationTime, key) {\n  var fiber = createFiber(Fragment, elements, key, mode);\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\n\nfunction createFiberFromProfiler(pendingProps, mode, expirationTime, key) {\n  {\n    if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {\n      error('Profiler must specify an \"id\" string and \"onRender\" function as props');\n    }\n  }\n\n  var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag.\n\n  fiber.elementType = REACT_PROFILER_TYPE;\n  fiber.type = REACT_PROFILER_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\n\nfunction createFiberFromSuspense(pendingProps, mode, expirationTime, key) {\n  var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.\n  // This needs to be fixed in getComponentName so that it relies on the tag\n  // instead.\n\n  fiber.type = REACT_SUSPENSE_TYPE;\n  fiber.elementType = REACT_SUSPENSE_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) {\n  var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);\n\n  {\n    // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag.\n    // This needs to be fixed in getComponentName so that it relies on the tag\n    // instead.\n    fiber.type = REACT_SUSPENSE_LIST_TYPE;\n  }\n\n  fiber.elementType = REACT_SUSPENSE_LIST_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromText(content, mode, expirationTime) {\n  var fiber = createFiber(HostText, content, null, mode);\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromHostInstanceForDeletion() {\n  var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type.\n\n  fiber.elementType = 'DELETED';\n  fiber.type = 'DELETED';\n  return fiber;\n}\nfunction createFiberFromPortal(portal, mode, expirationTime) {\n  var pendingProps = portal.children !== null ? portal.children : [];\n  var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);\n  fiber.expirationTime = expirationTime;\n  fiber.stateNode = {\n    containerInfo: portal.containerInfo,\n    pendingChildren: null,\n    // Used by persistent updates\n    implementation: portal.implementation\n  };\n  return fiber;\n} // Used for stashing WIP properties to replay failed work in DEV.\n\nfunction assignFiberPropertiesInDEV(target, source) {\n  if (target === null) {\n    // This Fiber's initial properties will always be overwritten.\n    // We only use a Fiber to ensure the same hidden class so DEV isn't slow.\n    target = createFiber(IndeterminateComponent, null, null, NoMode);\n  } // This is intentionally written as a list of all properties.\n  // We tried to use Object.assign() instead but this is called in\n  // the hottest path, and Object.assign() was too slow:\n  // https://github.com/facebook/react/issues/12502\n  // This code is DEV-only so size is not a concern.\n\n\n  target.tag = source.tag;\n  target.key = source.key;\n  target.elementType = source.elementType;\n  target.type = source.type;\n  target.stateNode = source.stateNode;\n  target.return = source.return;\n  target.child = source.child;\n  target.sibling = source.sibling;\n  target.index = source.index;\n  target.ref = source.ref;\n  target.pendingProps = source.pendingProps;\n  target.memoizedProps = source.memoizedProps;\n  target.updateQueue = source.updateQueue;\n  target.memoizedState = source.memoizedState;\n  target.dependencies = source.dependencies;\n  target.mode = source.mode;\n  target.effectTag = source.effectTag;\n  target.nextEffect = source.nextEffect;\n  target.firstEffect = source.firstEffect;\n  target.lastEffect = source.lastEffect;\n  target.expirationTime = source.expirationTime;\n  target.childExpirationTime = source.childExpirationTime;\n  target.alternate = source.alternate;\n\n  {\n    target.actualDuration = source.actualDuration;\n    target.actualStartTime = source.actualStartTime;\n    target.selfBaseDuration = source.selfBaseDuration;\n    target.treeBaseDuration = source.treeBaseDuration;\n  }\n\n  {\n    target._debugID = source._debugID;\n  }\n\n  target._debugSource = source._debugSource;\n  target._debugOwner = source._debugOwner;\n  target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;\n  target._debugNeedsRemount = source._debugNeedsRemount;\n  target._debugHookTypes = source._debugHookTypes;\n  return target;\n}\n\nfunction FiberRootNode(containerInfo, tag, hydrate) {\n  this.tag = tag;\n  this.current = null;\n  this.containerInfo = containerInfo;\n  this.pendingChildren = null;\n  this.pingCache = null;\n  this.finishedExpirationTime = NoWork;\n  this.finishedWork = null;\n  this.timeoutHandle = noTimeout;\n  this.context = null;\n  this.pendingContext = null;\n  this.hydrate = hydrate;\n  this.callbackNode = null;\n  this.callbackPriority = NoPriority;\n  this.firstPendingTime = NoWork;\n  this.firstSuspendedTime = NoWork;\n  this.lastSuspendedTime = NoWork;\n  this.nextKnownPendingLevel = NoWork;\n  this.lastPingedTime = NoWork;\n  this.lastExpiredTime = NoWork;\n\n  {\n    this.interactionThreadID = tracing.unstable_getThreadID();\n    this.memoizedInteractions = new Set();\n    this.pendingInteractionMap = new Map();\n  }\n}\n\nfunction createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {\n  var root = new FiberRootNode(containerInfo, tag, hydrate);\n  // stateNode is any.\n\n\n  var uninitializedFiber = createHostRootFiber(tag);\n  root.current = uninitializedFiber;\n  uninitializedFiber.stateNode = root;\n  initializeUpdateQueue(uninitializedFiber);\n  return root;\n}\nfunction isRootSuspendedAtTime(root, expirationTime) {\n  var firstSuspendedTime = root.firstSuspendedTime;\n  var lastSuspendedTime = root.lastSuspendedTime;\n  return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime;\n}\nfunction markRootSuspendedAtTime(root, expirationTime) {\n  var firstSuspendedTime = root.firstSuspendedTime;\n  var lastSuspendedTime = root.lastSuspendedTime;\n\n  if (firstSuspendedTime < expirationTime) {\n    root.firstSuspendedTime = expirationTime;\n  }\n\n  if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) {\n    root.lastSuspendedTime = expirationTime;\n  }\n\n  if (expirationTime <= root.lastPingedTime) {\n    root.lastPingedTime = NoWork;\n  }\n\n  if (expirationTime <= root.lastExpiredTime) {\n    root.lastExpiredTime = NoWork;\n  }\n}\nfunction markRootUpdatedAtTime(root, expirationTime) {\n  // Update the range of pending times\n  var firstPendingTime = root.firstPendingTime;\n\n  if (expirationTime > firstPendingTime) {\n    root.firstPendingTime = expirationTime;\n  } // Update the range of suspended times. Treat everything lower priority or\n  // equal to this update as unsuspended.\n\n\n  var firstSuspendedTime = root.firstSuspendedTime;\n\n  if (firstSuspendedTime !== NoWork) {\n    if (expirationTime >= firstSuspendedTime) {\n      // The entire suspended range is now unsuspended.\n      root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n    } else if (expirationTime >= root.lastSuspendedTime) {\n      root.lastSuspendedTime = expirationTime + 1;\n    } // This is a pending level. Check if it's higher priority than the next\n    // known pending level.\n\n\n    if (expirationTime > root.nextKnownPendingLevel) {\n      root.nextKnownPendingLevel = expirationTime;\n    }\n  }\n}\nfunction markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) {\n  // Update the range of pending times\n  root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or\n  // equal to this update as unsuspended.\n\n  if (finishedExpirationTime <= root.lastSuspendedTime) {\n    // The entire suspended range is now unsuspended.\n    root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n  } else if (finishedExpirationTime <= root.firstSuspendedTime) {\n    // Part of the suspended range is now unsuspended. Narrow the range to\n    // include everything between the unsuspended time (non-inclusive) and the\n    // last suspended time.\n    root.firstSuspendedTime = finishedExpirationTime - 1;\n  }\n\n  if (finishedExpirationTime <= root.lastPingedTime) {\n    // Clear the pinged time\n    root.lastPingedTime = NoWork;\n  }\n\n  if (finishedExpirationTime <= root.lastExpiredTime) {\n    // Clear the expired time\n    root.lastExpiredTime = NoWork;\n  }\n}\nfunction markRootExpiredAtTime(root, expirationTime) {\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) {\n    root.lastExpiredTime = expirationTime;\n  }\n}\n\nvar didWarnAboutNestedUpdates;\nvar didWarnAboutFindNodeInStrictMode;\n\n{\n  didWarnAboutNestedUpdates = false;\n  didWarnAboutFindNodeInStrictMode = {};\n}\n\nfunction getContextForSubtree(parentComponent) {\n  if (!parentComponent) {\n    return emptyContextObject;\n  }\n\n  var fiber = get(parentComponent);\n  var parentContext = findCurrentUnmaskedContext(fiber);\n\n  if (fiber.tag === ClassComponent) {\n    var Component = fiber.type;\n\n    if (isContextProvider(Component)) {\n      return processChildContext(fiber, Component, parentContext);\n    }\n  }\n\n  return parentContext;\n}\n\nfunction findHostInstanceWithWarning(component, methodName) {\n  {\n    var fiber = get(component);\n\n    if (fiber === undefined) {\n      if (typeof component.render === 'function') {\n        {\n          {\n            throw Error( \"Unable to find node on an unmounted component.\" );\n          }\n        }\n      } else {\n        {\n          {\n            throw Error( \"Argument appears to not be a ReactComponent. Keys: \" + Object.keys(component) );\n          }\n        }\n      }\n    }\n\n    var hostFiber = findCurrentHostFiber(fiber);\n\n    if (hostFiber === null) {\n      return null;\n    }\n\n    if (hostFiber.mode & StrictMode) {\n      var componentName = getComponentName(fiber.type) || 'Component';\n\n      if (!didWarnAboutFindNodeInStrictMode[componentName]) {\n        didWarnAboutFindNodeInStrictMode[componentName] = true;\n\n        if (fiber.mode & StrictMode) {\n          error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n        } else {\n          error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n        }\n      }\n    }\n\n    return hostFiber.stateNode;\n  }\n}\n\nfunction createContainer(containerInfo, tag, hydrate, hydrationCallbacks) {\n  return createFiberRoot(containerInfo, tag, hydrate);\n}\nfunction updateContainer(element, container, parentComponent, callback) {\n  {\n    onScheduleRoot(container, element);\n  }\n\n  var current$1 = container.current;\n  var currentTime = requestCurrentTimeForUpdate();\n\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfUnmockedScheduler(current$1);\n      warnIfNotScopedWithMatchingAct(current$1);\n    }\n  }\n\n  var suspenseConfig = requestCurrentSuspenseConfig();\n  var expirationTime = computeExpirationForFiber(currentTime, current$1, suspenseConfig);\n  var context = getContextForSubtree(parentComponent);\n\n  if (container.context === null) {\n    container.context = context;\n  } else {\n    container.pendingContext = context;\n  }\n\n  {\n    if (isRendering && current !== null && !didWarnAboutNestedUpdates) {\n      didWarnAboutNestedUpdates = true;\n\n      error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\\n\\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');\n    }\n  }\n\n  var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  update.payload = {\n    element: element\n  };\n  callback = callback === undefined ? null : callback;\n\n  if (callback !== null) {\n    {\n      if (typeof callback !== 'function') {\n        error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);\n      }\n    }\n\n    update.callback = callback;\n  }\n\n  enqueueUpdate(current$1, update);\n  scheduleWork(current$1, expirationTime);\n  return expirationTime;\n}\nfunction getPublicRootInstance(container) {\n  var containerFiber = container.current;\n\n  if (!containerFiber.child) {\n    return null;\n  }\n\n  switch (containerFiber.child.tag) {\n    case HostComponent:\n      return getPublicInstance(containerFiber.child.stateNode);\n\n    default:\n      return containerFiber.child.stateNode;\n  }\n}\n\nfunction markRetryTimeImpl(fiber, retryTime) {\n  var suspenseState = fiber.memoizedState;\n\n  if (suspenseState !== null && suspenseState.dehydrated !== null) {\n    if (suspenseState.retryTime < retryTime) {\n      suspenseState.retryTime = retryTime;\n    }\n  }\n} // Increases the priority of thennables when they resolve within this boundary.\n\n\nfunction markRetryTimeIfNotHydrated(fiber, retryTime) {\n  markRetryTimeImpl(fiber, retryTime);\n  var alternate = fiber.alternate;\n\n  if (alternate) {\n    markRetryTimeImpl(alternate, retryTime);\n  }\n}\n\nfunction attemptUserBlockingHydration$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority and they should not suspend on I/O,\n    // since you have to wrap anything that might suspend in\n    // Suspense.\n    return;\n  }\n\n  var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());\n  scheduleWork(fiber, expTime);\n  markRetryTimeIfNotHydrated(fiber, expTime);\n}\nfunction attemptContinuousHydration$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority and they should not suspend on I/O,\n    // since you have to wrap anything that might suspend in\n    // Suspense.\n    return;\n  }\n\n  scheduleWork(fiber, ContinuousHydration);\n  markRetryTimeIfNotHydrated(fiber, ContinuousHydration);\n}\nfunction attemptHydrationAtCurrentPriority$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority other than synchronously flush it.\n    return;\n  }\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var expTime = computeExpirationForFiber(currentTime, fiber, null);\n  scheduleWork(fiber, expTime);\n  markRetryTimeIfNotHydrated(fiber, expTime);\n}\nfunction findHostInstanceWithNoPortals(fiber) {\n  var hostFiber = findCurrentHostFiberWithNoPortals(fiber);\n\n  if (hostFiber === null) {\n    return null;\n  }\n\n  if (hostFiber.tag === FundamentalComponent) {\n    return hostFiber.stateNode.instance;\n  }\n\n  return hostFiber.stateNode;\n}\n\nvar shouldSuspendImpl = function (fiber) {\n  return false;\n};\n\nfunction shouldSuspend(fiber) {\n  return shouldSuspendImpl(fiber);\n}\nvar overrideHookState = null;\nvar overrideProps = null;\nvar scheduleUpdate = null;\nvar setSuspenseHandler = null;\n\n{\n  var copyWithSetImpl = function (obj, path, idx, value) {\n    if (idx >= path.length) {\n      return value;\n    }\n\n    var key = path[idx];\n    var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here\n\n    updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);\n    return updated;\n  };\n\n  var copyWithSet = function (obj, path, value) {\n    return copyWithSetImpl(obj, path, 0, value);\n  }; // Support DevTools editable values for useState and useReducer.\n\n\n  overrideHookState = function (fiber, id, path, value) {\n    // For now, the \"id\" of stateful hooks is just the stateful hook index.\n    // This may change in the future with e.g. nested hooks.\n    var currentHook = fiber.memoizedState;\n\n    while (currentHook !== null && id > 0) {\n      currentHook = currentHook.next;\n      id--;\n    }\n\n    if (currentHook !== null) {\n      var newState = copyWithSet(currentHook.memoizedState, path, value);\n      currentHook.memoizedState = newState;\n      currentHook.baseState = newState; // We aren't actually adding an update to the queue,\n      // because there is no update we can add for useReducer hooks that won't trigger an error.\n      // (There's no appropriate action type for DevTools overrides.)\n      // As a result though, React will see the scheduled update as a noop and bailout.\n      // Shallow cloning props works as a workaround for now to bypass the bailout check.\n\n      fiber.memoizedProps = _assign({}, fiber.memoizedProps);\n      scheduleWork(fiber, Sync);\n    }\n  }; // Support DevTools props for function components, forwardRef, memo, host components, etc.\n\n\n  overrideProps = function (fiber, path, value) {\n    fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);\n\n    if (fiber.alternate) {\n      fiber.alternate.pendingProps = fiber.pendingProps;\n    }\n\n    scheduleWork(fiber, Sync);\n  };\n\n  scheduleUpdate = function (fiber) {\n    scheduleWork(fiber, Sync);\n  };\n\n  setSuspenseHandler = function (newShouldSuspendImpl) {\n    shouldSuspendImpl = newShouldSuspendImpl;\n  };\n}\n\nfunction injectIntoDevTools(devToolsConfig) {\n  var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;\n  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\n  return injectInternals(_assign({}, devToolsConfig, {\n    overrideHookState: overrideHookState,\n    overrideProps: overrideProps,\n    setSuspenseHandler: setSuspenseHandler,\n    scheduleUpdate: scheduleUpdate,\n    currentDispatcherRef: ReactCurrentDispatcher,\n    findHostInstanceByFiber: function (fiber) {\n      var hostFiber = findCurrentHostFiber(fiber);\n\n      if (hostFiber === null) {\n        return null;\n      }\n\n      return hostFiber.stateNode;\n    },\n    findFiberByHostInstance: function (instance) {\n      if (!findFiberByHostInstance) {\n        // Might not be implemented by the renderer.\n        return null;\n      }\n\n      return findFiberByHostInstance(instance);\n    },\n    // React Refresh\n    findHostInstancesForRefresh:  findHostInstancesForRefresh ,\n    scheduleRefresh:  scheduleRefresh ,\n    scheduleRoot:  scheduleRoot ,\n    setRefreshHandler:  setRefreshHandler ,\n    // Enables DevTools to append owner stacks to error messages in DEV mode.\n    getCurrentFiber:  function () {\n      return current;\n    } \n  }));\n}\nvar IsSomeRendererActing$1 = ReactSharedInternals.IsSomeRendererActing;\n\nfunction ReactDOMRoot(container, options) {\n  this._internalRoot = createRootImpl(container, ConcurrentRoot, options);\n}\n\nfunction ReactDOMBlockingRoot(container, tag, options) {\n  this._internalRoot = createRootImpl(container, tag, options);\n}\n\nReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) {\n  var root = this._internalRoot;\n\n  {\n    if (typeof arguments[1] === 'function') {\n      error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n    }\n\n    var container = root.containerInfo;\n\n    if (container.nodeType !== COMMENT_NODE) {\n      var hostInstance = findHostInstanceWithNoPortals(root.current);\n\n      if (hostInstance) {\n        if (hostInstance.parentNode !== container) {\n          error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + \"root.unmount() to empty a root's container.\");\n        }\n      }\n    }\n  }\n\n  updateContainer(children, root, null, null);\n};\n\nReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () {\n  {\n    if (typeof arguments[0] === 'function') {\n      error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n    }\n  }\n\n  var root = this._internalRoot;\n  var container = root.containerInfo;\n  updateContainer(null, root, null, function () {\n    unmarkContainerAsRoot(container);\n  });\n};\n\nfunction createRootImpl(container, tag, options) {\n  // Tag is either LegacyRoot or Concurrent Root\n  var hydrate = options != null && options.hydrate === true;\n  var hydrationCallbacks = options != null && options.hydrationOptions || null;\n  var root = createContainer(container, tag, hydrate);\n  markContainerAsRoot(root.current, container);\n\n  if (hydrate && tag !== LegacyRoot) {\n    var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument;\n    eagerlyTrapReplayableEvents(container, doc);\n  }\n\n  return root;\n}\nfunction createLegacyRoot(container, options) {\n  return new ReactDOMBlockingRoot(container, LegacyRoot, options);\n}\nfunction isValidContainer(node) {\n  return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));\n}\n\nvar ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;\nvar topLevelUpdateWarnings;\nvar warnedAboutHydrateAPI = false;\n\n{\n  topLevelUpdateWarnings = function (container) {\n    if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {\n      var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);\n\n      if (hostInstance) {\n        if (hostInstance.parentNode !== container) {\n          error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');\n        }\n      }\n    }\n\n    var isRootRenderedBySomeReact = !!container._reactRootContainer;\n    var rootEl = getReactRootElementInContainer(container);\n    var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));\n\n    if (hasNonRootReactChild && !isRootRenderedBySomeReact) {\n      error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');\n    }\n\n    if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {\n      error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');\n    }\n  };\n}\n\nfunction getReactRootElementInContainer(container) {\n  if (!container) {\n    return null;\n  }\n\n  if (container.nodeType === DOCUMENT_NODE) {\n    return container.documentElement;\n  } else {\n    return container.firstChild;\n  }\n}\n\nfunction shouldHydrateDueToLegacyHeuristic(container) {\n  var rootElement = getReactRootElementInContainer(container);\n  return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));\n}\n\nfunction legacyCreateRootFromDOMContainer(container, forceHydrate) {\n  var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content.\n\n  if (!shouldHydrate) {\n    var warned = false;\n    var rootSibling;\n\n    while (rootSibling = container.lastChild) {\n      {\n        if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {\n          warned = true;\n\n          error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');\n        }\n      }\n\n      container.removeChild(rootSibling);\n    }\n  }\n\n  {\n    if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {\n      warnedAboutHydrateAPI = true;\n\n      warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');\n    }\n  }\n\n  return createLegacyRoot(container, shouldHydrate ? {\n    hydrate: true\n  } : undefined);\n}\n\nfunction warnOnInvalidCallback$1(callback, callerName) {\n  {\n    if (callback !== null && typeof callback !== 'function') {\n      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n    }\n  }\n}\n\nfunction legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {\n  {\n    topLevelUpdateWarnings(container);\n    warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');\n  } // TODO: Without `any` type, Flow says \"Property cannot be accessed on any\n  // member of intersection type.\" Whyyyyyy.\n\n\n  var root = container._reactRootContainer;\n  var fiberRoot;\n\n  if (!root) {\n    // Initial mount\n    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);\n    fiberRoot = root._internalRoot;\n\n    if (typeof callback === 'function') {\n      var originalCallback = callback;\n\n      callback = function () {\n        var instance = getPublicRootInstance(fiberRoot);\n        originalCallback.call(instance);\n      };\n    } // Initial mount should not be batched.\n\n\n    unbatchedUpdates(function () {\n      updateContainer(children, fiberRoot, parentComponent, callback);\n    });\n  } else {\n    fiberRoot = root._internalRoot;\n\n    if (typeof callback === 'function') {\n      var _originalCallback = callback;\n\n      callback = function () {\n        var instance = getPublicRootInstance(fiberRoot);\n\n        _originalCallback.call(instance);\n      };\n    } // Update\n\n\n    updateContainer(children, fiberRoot, parentComponent, callback);\n  }\n\n  return getPublicRootInstance(fiberRoot);\n}\n\nfunction findDOMNode(componentOrElement) {\n  {\n    var owner = ReactCurrentOwner$3.current;\n\n    if (owner !== null && owner.stateNode !== null) {\n      var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;\n\n      if (!warnedAboutRefsInRender) {\n        error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component');\n      }\n\n      owner.stateNode._warnedAboutRefsInRender = true;\n    }\n  }\n\n  if (componentOrElement == null) {\n    return null;\n  }\n\n  if (componentOrElement.nodeType === ELEMENT_NODE) {\n    return componentOrElement;\n  }\n\n  {\n    return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');\n  }\n}\nfunction hydrate(element, container, callback) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?');\n    }\n  } // TODO: throw or warn if we couldn't hydrate?\n\n\n  return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);\n}\nfunction render(element, container, callback) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');\n    }\n  }\n\n  return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);\n}\nfunction unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n  if (!isValidContainer(containerNode)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  if (!(parentComponent != null && has(parentComponent))) {\n    {\n      throw Error( \"parentComponent must be a valid React Component\" );\n    }\n  }\n\n  return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);\n}\nfunction unmountComponentAtNode(container) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"unmountComponentAtNode(...): Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?');\n    }\n  }\n\n  if (container._reactRootContainer) {\n    {\n      var rootEl = getReactRootElementInContainer(container);\n      var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);\n\n      if (renderedByDifferentReact) {\n        error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by another copy of React.');\n      }\n    } // Unmount should not be batched.\n\n\n    unbatchedUpdates(function () {\n      legacyRenderSubtreeIntoContainer(null, null, container, false, function () {\n        // $FlowFixMe This should probably use `delete container._reactRootContainer`\n        container._reactRootContainer = null;\n        unmarkContainerAsRoot(container);\n      });\n    }); // If you call unmountComponentAtNode twice in quick succession, you'll\n    // get `true` twice. That's probably fine?\n\n    return true;\n  } else {\n    {\n      var _rootEl = getReactRootElementInContainer(container);\n\n      var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node.\n\n      var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;\n\n      if (hasNonRootReactChild) {\n        error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');\n      }\n    }\n\n    return false;\n  }\n}\n\nfunction createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.\nimplementation) {\n  var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n  return {\n    // This tag allow us to uniquely identify this as a React Portal\n    $$typeof: REACT_PORTAL_TYPE,\n    key: key == null ? null : '' + key,\n    children: children,\n    containerInfo: containerInfo,\n    implementation: implementation\n  };\n}\n\nvar ReactVersion = '16.13.1';\n\nsetAttemptUserBlockingHydration(attemptUserBlockingHydration$1);\nsetAttemptContinuousHydration(attemptContinuousHydration$1);\nsetAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);\nvar didWarnAboutUnstableCreatePortal = false;\n\n{\n  if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype\n  Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype\n  Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {\n    error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n  }\n}\n\nsetRestoreImplementation(restoreControlledState$3);\nsetBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1);\n\nfunction createPortal$1(children, container) {\n  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  } // TODO: pass ReactDOM portal implementation as third argument\n  // $FlowFixMe The Flow type is opaque but there's no way to actually create it.\n\n\n  return createPortal(children, container, null, key);\n}\n\nfunction renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n\n  return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);\n}\n\nfunction unstable_createPortal(children, container) {\n  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  {\n    if (!didWarnAboutUnstableCreatePortal) {\n      didWarnAboutUnstableCreatePortal = true;\n\n      warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the \"unstable_\" prefix.');\n    }\n  }\n\n  return createPortal$1(children, container, key);\n}\n\nvar Internals = {\n  // Keep in sync with ReactDOMUnstableNativeDependencies.js\n  // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification.\n  Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing]\n};\nvar foundDevTools = injectIntoDevTools({\n  findFiberByHostInstance: getClosestInstanceFromNode,\n  bundleType:  1 ,\n  version: ReactVersion,\n  rendererPackageName: 'react-dom'\n});\n\n{\n  if (!foundDevTools && canUseDOM && window.top === window.self) {\n    // If we're in Chrome or Firefox, provide a download link if not installed.\n    if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n      var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.\n\n      if (/^(https?|file):$/.test(protocol)) {\n        // eslint-disable-next-line react-internal/no-production-logging\n        console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');\n      }\n    }\n  }\n}\n\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;\nexports.createPortal = createPortal$1;\nexports.findDOMNode = findDOMNode;\nexports.flushSync = flushSync;\nexports.hydrate = hydrate;\nexports.render = render;\nexports.unmountComponentAtNode = unmountComponentAtNode;\nexports.unstable_batchedUpdates = batchedUpdates$1;\nexports.unstable_createPortal = unstable_createPortal;\nexports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;\nexports.version = ReactVersion;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-dom/cjs/react-dom.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-dom/index.js":
-/*!*****************************************************!*\
-  !*** ./jaas-client/node_modules/react-dom/index.js ***!
-  \*****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (true) {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-dom.development.js */ \"./jaas-client/node_modules/react-dom/cjs/react-dom.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-dom/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-input-emoji/dist/index.es.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-input-emoji/dist/index.es.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nfunction styleInject(css, ref) {\n  if ( ref === void 0 ) ref = {};\n  var insertAt = ref.insertAt;\n\n  if (!css || typeof document === 'undefined') { return; }\n\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild);\n    } else {\n      head.appendChild(style);\n    }\n  } else {\n    head.appendChild(style);\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar css = \".emoji-mart,\\n.emoji-mart * {\\n  box-sizing: border-box;\\n  line-height: 1.15;\\n}\\n\\n.emoji-mart {\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Helvetica Neue\\\", sans-serif;\\n  font-size: 16px;\\n  display: inline-block;\\n  color: #222427;\\n  border: 1px solid #d9d9d9;\\n  border-radius: 5px;\\n  background: #fff;\\n}\\n\\n.emoji-mart .emoji-mart-emoji {\\n  padding: 6px;\\n}\\n\\n.emoji-mart-bar {\\n  border: 0 solid #d9d9d9;\\n}\\n.emoji-mart-bar:first-child {\\n  border-bottom-width: 1px;\\n  border-top-left-radius: 5px;\\n  border-top-right-radius: 5px;\\n}\\n.emoji-mart-bar:last-child {\\n  border-top-width: 1px;\\n  border-bottom-left-radius: 5px;\\n  border-bottom-right-radius: 5px;\\n}\\n\\n.emoji-mart-anchors {\\n  display: flex;\\n  flex-direction: row;\\n  justify-content: space-between;\\n  padding: 0 6px;\\n  color: #858585;\\n  line-height: 0;\\n}\\n\\n.emoji-mart-anchor {\\n  position: relative;\\n  display: block;\\n  flex: 1 1 auto;\\n  text-align: center;\\n  padding: 12px 4px;\\n  overflow: hidden;\\n  transition: color .1s ease-out;\\n  margin: 0;\\n  box-shadow: none;\\n  background: none;\\n  border: none;\\n}\\n.emoji-mart-anchor:hover,\\n.emoji-mart-anchor-selected {\\n  color: #464646;\\n}\\n\\n.emoji-mart-anchor-selected .emoji-mart-anchor-bar {\\n  bottom: 0;\\n}\\n\\n.emoji-mart-anchor-bar {\\n  position: absolute;\\n  bottom: -3px; left: 0;\\n  width: 100%; height: 3px;\\n  background-color: #464646;\\n}\\n\\n.emoji-mart-anchors i {\\n  display: inline-block;\\n  width: 100%;\\n  max-width: 22px;\\n}\\n\\n.emoji-mart-anchors svg,\\n.emoji-mart-anchors img {\\n  fill: #858585;\\n  height: 18px;\\n  width: 18px;\\n}\\n\\n.emoji-mart-scroll {\\n  overflow-y: scroll;\\n  height: 270px;\\n  padding: 0 6px 6px 6px;\\n  will-change: transform; /* avoids \\\"repaints on scroll\\\" in mobile Chrome */\\n}\\n\\n.emoji-mart-search {\\n  margin-top: 6px;\\n  padding: 0 6px;\\n  position: relative;\\n}\\n\\n.emoji-mart-search input {\\n  font-size: 16px;\\n  display: block;\\n  width: 100%;\\n  padding: 5px 25px 6px 10px;\\n  border-radius: 5px;\\n  border: 1px solid #d9d9d9;\\n  outline: 0;\\n}\\n\\n.emoji-mart-search input,\\n.emoji-mart-search input::-webkit-search-decoration,\\n.emoji-mart-search input::-webkit-search-cancel-button,\\n.emoji-mart-search input::-webkit-search-results-button,\\n.emoji-mart-search input::-webkit-search-results-decoration {\\n  /* remove webkit/blink styles for <input type=\\\"search\\\">\\n   * via https://stackoverflow.com/a/9422689 */\\n  -webkit-appearance: none;\\n}\\n\\n.emoji-mart-search-icon {\\n  position: absolute;\\n  top: 7px;\\n  right: 11px;\\n  z-index: 2;\\n  padding: 2px 5px 1px;\\n  border: none;\\n  background: none;\\n}\\n\\n.emoji-mart-category .emoji-mart-emoji span {\\n  z-index: 1;\\n  position: relative;\\n  text-align: center;\\n  cursor: default;\\n}\\n\\n.emoji-mart-category .emoji-mart-emoji:hover:before {\\n  z-index: 0;\\n  content: \\\"\\\";\\n  position: absolute;\\n  top: 0; left: 0;\\n  width: 100%; height: 100%;\\n  background-color: #f4f4f4;\\n  border-radius: 100%;\\n}\\n\\n.emoji-mart-category-label {\\n  z-index: 2;\\n  position: relative;\\n  position: -webkit-sticky;\\n  position: sticky;\\n  top: 0;\\n}\\n\\n.emoji-mart-category-label span {\\n  display: block;\\n  width: 100%;\\n  font-weight: 500;\\n  padding: 5px 6px;\\n  background-color: #fff;\\n  background-color: rgba(255, 255, 255, .95);\\n}\\n\\n.emoji-mart-category-list {\\n  margin: 0;\\n  padding: 0;\\n}\\n\\n.emoji-mart-category-list li {\\n  list-style: none;\\n  margin: 0;\\n  padding: 0;\\n  display: inline-block;\\n}\\n\\n.emoji-mart-emoji {\\n  position: relative;\\n  display: inline-block;\\n  font-size: 0;\\n  margin: 0;\\n  padding: 0;\\n  border: none;\\n  background: none;\\n  box-shadow: none;\\n}\\n\\n.emoji-mart-emoji-native {\\n  font-family: \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Segoe UI\\\", \\\"Apple Color Emoji\\\", \\\"Twemoji Mozilla\\\", \\\"Noto Color Emoji\\\", \\\"EmojiOne Color\\\", \\\"Android Emoji\\\";\\n}\\n\\n.emoji-mart-no-results {\\n  font-size: 14px;\\n  text-align: center;\\n  padding-top: 70px;\\n  color: #858585;\\n}\\n.emoji-mart-no-results-img {\\n  display: block;\\n  margin-left: auto;\\n  margin-right: auto;\\n  width: 50%;\\n}\\n.emoji-mart-no-results .emoji-mart-category-label {\\n  display: none;\\n}\\n.emoji-mart-no-results .emoji-mart-no-results-label {\\n  margin-top: .2em;\\n}\\n.emoji-mart-no-results .emoji-mart-emoji:hover:before {\\n  content: none;\\n}\\n\\n.emoji-mart-preview {\\n  position: relative;\\n  height: 70px;\\n}\\n\\n.emoji-mart-preview-emoji,\\n.emoji-mart-preview-data,\\n.emoji-mart-preview-skins {\\n  position: absolute;\\n  top: 50%;\\n  transform: translateY(-50%);\\n}\\n\\n.emoji-mart-preview-emoji {\\n  left: 12px;\\n}\\n\\n.emoji-mart-preview-data {\\n  left: 68px; right: 12px;\\n  word-break: break-all;\\n}\\n\\n.emoji-mart-preview-skins {\\n  right: 30px;\\n  text-align: right;\\n}\\n\\n.emoji-mart-preview-skins.custom {\\n  right: 10px;\\n  text-align: right;\\n}\\n\\n.emoji-mart-preview-name {\\n  font-size: 14px;\\n}\\n\\n.emoji-mart-preview-shortname {\\n  font-size: 12px;\\n  color: #888;\\n}\\n.emoji-mart-preview-shortname + .emoji-mart-preview-shortname,\\n.emoji-mart-preview-shortname + .emoji-mart-preview-emoticon,\\n.emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon {\\n  margin-left: .5em;\\n}\\n\\n.emoji-mart-preview-emoticon {\\n  font-size: 11px;\\n  color: #bbb;\\n}\\n\\n.emoji-mart-title span {\\n  display: inline-block;\\n  vertical-align: middle;\\n}\\n\\n.emoji-mart-title .emoji-mart-emoji {\\n  padding: 0;\\n}\\n\\n.emoji-mart-title-label {\\n  color: #999A9C;\\n  font-size: 26px;\\n  font-weight: 300;\\n}\\n\\n.emoji-mart-skin-swatches {\\n  font-size: 0;\\n  padding: 2px 0;\\n  border: 1px solid #d9d9d9;\\n  border-radius: 12px;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin-swatches.custom {\\n  font-size: 0;\\n  border: none;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch {\\n  width: 16px;\\n  padding: 0 2px;\\n}\\n\\n.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected:after {\\n  opacity: .75;\\n}\\n\\n.emoji-mart-skin-swatch {\\n  display: inline-block;\\n  width: 0;\\n  vertical-align: middle;\\n  transition-property: width, padding;\\n  transition-duration: .125s;\\n  transition-timing-function: ease-out;\\n}\\n\\n.emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s }\\n.emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s }\\n.emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s }\\n.emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s }\\n.emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s }\\n.emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s }\\n\\n.emoji-mart-skin-swatch.selected {\\n  position: relative;\\n  width: 16px;\\n  padding: 0 2px;\\n}\\n\\n.emoji-mart-skin-swatch.selected:after {\\n  content: \\\"\\\";\\n  position: absolute;\\n  top: 50%; left: 50%;\\n  width: 4px; height: 4px;\\n  margin: -2px 0 0 -2px;\\n  background-color: #fff;\\n  border-radius: 100%;\\n  pointer-events: none;\\n  opacity: 0;\\n  transition: opacity .2s ease-out;\\n}\\n\\n.emoji-mart-skin-swatch.custom {\\n  display: inline-block;\\n  width: 0;\\n  height: 38px;\\n  overflow: hidden;\\n  vertical-align: middle;\\n  transition-property: width, height;\\n  transition-duration: .125s;\\n  transition-timing-function: ease-out;\\n  cursor: default;\\n}\\n\\n.emoji-mart-skin-swatch.custom.selected {\\n  position: relative;\\n  width: 36px;\\n  height: 38px;\\n  padding: 0 2px 0 0;\\n}\\n\\n.emoji-mart-skin-swatch.custom.selected:after {\\n  content: \\\"\\\";\\n  width: 0;\\n  height: 0;\\n}\\n\\n.emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover {\\n  background-color: #f4f4f4;\\n  border-radius: 10%;\\n}\\n\\n.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom {\\n  width: 36px;\\n  height: 38px;\\n  padding: 0 2px 0 0;\\n}\\n\\n.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected:after {\\n  opacity: .75;\\n}\\n\\n.emoji-mart-skin-text.opened {\\n  display: inline-block;\\n  vertical-align: middle;\\n  text-align: left;\\n  color: #888;\\n  font-size: 11px;\\n  padding: 5px 2px;\\n  width: 95px;\\n  height: 40px;\\n  border-radius: 10%;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin {\\n  display: inline-block;\\n  width: 100%;\\n  padding-top: 100%;\\n  max-width: 12px;\\n  border-radius: 100%;\\n}\\n\\n.emoji-mart-skin-tone-1 { background-color: #ffc93a }\\n.emoji-mart-skin-tone-2 { background-color: #fadcbc }\\n.emoji-mart-skin-tone-3 { background-color: #e0bb95 }\\n.emoji-mart-skin-tone-4 { background-color: #bf8f68 }\\n.emoji-mart-skin-tone-5 { background-color: #9b643d }\\n.emoji-mart-skin-tone-6 { background-color: #594539 }\\n\\n/* For screenreaders only, via https://stackoverflow.com/a/19758620 */\\n.emoji-mart-sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  border: 0;\\n}\\n\\n\\n\";\nstyleInject(css);\n\nvar compressed = true;\nvar categories = [\n\t{\n\t\tid: \"people\",\n\t\tname: \"Smileys & People\",\n\t\temojis: [\n\t\t\t\"grinning\",\n\t\t\t\"grin\",\n\t\t\t\"joy\",\n\t\t\t\"rolling_on_the_floor_laughing\",\n\t\t\t\"smiley\",\n\t\t\t\"smile\",\n\t\t\t\"sweat_smile\",\n\t\t\t\"laughing\",\n\t\t\t\"wink\",\n\t\t\t\"blush\",\n\t\t\t\"yum\",\n\t\t\t\"sunglasses\",\n\t\t\t\"heart_eyes\",\n\t\t\t\"kissing_heart\",\n\t\t\t\"kissing\",\n\t\t\t\"kissing_smiling_eyes\",\n\t\t\t\"kissing_closed_eyes\",\n\t\t\t\"relaxed\",\n\t\t\t\"slightly_smiling_face\",\n\t\t\t\"hugging_face\",\n\t\t\t\"star-struck\",\n\t\t\t\"thinking_face\",\n\t\t\t\"face_with_raised_eyebrow\",\n\t\t\t\"neutral_face\",\n\t\t\t\"expressionless\",\n\t\t\t\"no_mouth\",\n\t\t\t\"face_with_rolling_eyes\",\n\t\t\t\"smirk\",\n\t\t\t\"persevere\",\n\t\t\t\"disappointed_relieved\",\n\t\t\t\"open_mouth\",\n\t\t\t\"zipper_mouth_face\",\n\t\t\t\"hushed\",\n\t\t\t\"sleepy\",\n\t\t\t\"tired_face\",\n\t\t\t\"sleeping\",\n\t\t\t\"relieved\",\n\t\t\t\"stuck_out_tongue\",\n\t\t\t\"stuck_out_tongue_winking_eye\",\n\t\t\t\"stuck_out_tongue_closed_eyes\",\n\t\t\t\"drooling_face\",\n\t\t\t\"unamused\",\n\t\t\t\"sweat\",\n\t\t\t\"pensive\",\n\t\t\t\"confused\",\n\t\t\t\"upside_down_face\",\n\t\t\t\"money_mouth_face\",\n\t\t\t\"astonished\",\n\t\t\t\"white_frowning_face\",\n\t\t\t\"slightly_frowning_face\",\n\t\t\t\"confounded\",\n\t\t\t\"disappointed\",\n\t\t\t\"worried\",\n\t\t\t\"triumph\",\n\t\t\t\"cry\",\n\t\t\t\"sob\",\n\t\t\t\"frowning\",\n\t\t\t\"anguished\",\n\t\t\t\"fearful\",\n\t\t\t\"weary\",\n\t\t\t\"exploding_head\",\n\t\t\t\"grimacing\",\n\t\t\t\"cold_sweat\",\n\t\t\t\"scream\",\n\t\t\t\"flushed\",\n\t\t\t\"zany_face\",\n\t\t\t\"dizzy_face\",\n\t\t\t\"rage\",\n\t\t\t\"angry\",\n\t\t\t\"face_with_symbols_on_mouth\",\n\t\t\t\"mask\",\n\t\t\t\"face_with_thermometer\",\n\t\t\t\"face_with_head_bandage\",\n\t\t\t\"nauseated_face\",\n\t\t\t\"face_vomiting\",\n\t\t\t\"sneezing_face\",\n\t\t\t\"innocent\",\n\t\t\t\"face_with_cowboy_hat\",\n\t\t\t\"clown_face\",\n\t\t\t\"lying_face\",\n\t\t\t\"shushing_face\",\n\t\t\t\"face_with_hand_over_mouth\",\n\t\t\t\"face_with_monocle\",\n\t\t\t\"nerd_face\",\n\t\t\t\"smiling_imp\",\n\t\t\t\"imp\",\n\t\t\t\"japanese_ogre\",\n\t\t\t\"japanese_goblin\",\n\t\t\t\"skull\",\n\t\t\t\"skull_and_crossbones\",\n\t\t\t\"ghost\",\n\t\t\t\"alien\",\n\t\t\t\"space_invader\",\n\t\t\t\"robot_face\",\n\t\t\t\"hankey\",\n\t\t\t\"smiley_cat\",\n\t\t\t\"smile_cat\",\n\t\t\t\"joy_cat\",\n\t\t\t\"heart_eyes_cat\",\n\t\t\t\"smirk_cat\",\n\t\t\t\"kissing_cat\",\n\t\t\t\"scream_cat\",\n\t\t\t\"crying_cat_face\",\n\t\t\t\"pouting_cat\",\n\t\t\t\"see_no_evil\",\n\t\t\t\"hear_no_evil\",\n\t\t\t\"speak_no_evil\",\n\t\t\t\"baby\",\n\t\t\t\"child\",\n\t\t\t\"boy\",\n\t\t\t\"girl\",\n\t\t\t\"adult\",\n\t\t\t\"man\",\n\t\t\t\"woman\",\n\t\t\t\"older_adult\",\n\t\t\t\"older_man\",\n\t\t\t\"older_woman\",\n\t\t\t\"male-doctor\",\n\t\t\t\"female-doctor\",\n\t\t\t\"male-student\",\n\t\t\t\"female-student\",\n\t\t\t\"male-teacher\",\n\t\t\t\"female-teacher\",\n\t\t\t\"male-judge\",\n\t\t\t\"female-judge\",\n\t\t\t\"male-farmer\",\n\t\t\t\"female-farmer\",\n\t\t\t\"male-cook\",\n\t\t\t\"female-cook\",\n\t\t\t\"male-mechanic\",\n\t\t\t\"female-mechanic\",\n\t\t\t\"male-factory-worker\",\n\t\t\t\"female-factory-worker\",\n\t\t\t\"male-office-worker\",\n\t\t\t\"female-office-worker\",\n\t\t\t\"male-scientist\",\n\t\t\t\"female-scientist\",\n\t\t\t\"male-technologist\",\n\t\t\t\"female-technologist\",\n\t\t\t\"male-singer\",\n\t\t\t\"female-singer\",\n\t\t\t\"male-artist\",\n\t\t\t\"female-artist\",\n\t\t\t\"male-pilot\",\n\t\t\t\"female-pilot\",\n\t\t\t\"male-astronaut\",\n\t\t\t\"female-astronaut\",\n\t\t\t\"male-firefighter\",\n\t\t\t\"female-firefighter\",\n\t\t\t\"cop\",\n\t\t\t\"male-police-officer\",\n\t\t\t\"female-police-officer\",\n\t\t\t\"sleuth_or_spy\",\n\t\t\t\"male-detective\",\n\t\t\t\"female-detective\",\n\t\t\t\"guardsman\",\n\t\t\t\"male-guard\",\n\t\t\t\"female-guard\",\n\t\t\t\"construction_worker\",\n\t\t\t\"male-construction-worker\",\n\t\t\t\"female-construction-worker\",\n\t\t\t\"prince\",\n\t\t\t\"princess\",\n\t\t\t\"man_with_turban\",\n\t\t\t\"man-wearing-turban\",\n\t\t\t\"woman-wearing-turban\",\n\t\t\t\"man_with_gua_pi_mao\",\n\t\t\t\"person_with_headscarf\",\n\t\t\t\"bearded_person\",\n\t\t\t\"person_with_blond_hair\",\n\t\t\t\"blond-haired-man\",\n\t\t\t\"blond-haired-woman\",\n\t\t\t\"man_in_tuxedo\",\n\t\t\t\"bride_with_veil\",\n\t\t\t\"pregnant_woman\",\n\t\t\t\"breast-feeding\",\n\t\t\t\"angel\",\n\t\t\t\"santa\",\n\t\t\t\"mrs_claus\",\n\t\t\t\"mage\",\n\t\t\t\"female_mage\",\n\t\t\t\"male_mage\",\n\t\t\t\"fairy\",\n\t\t\t\"female_fairy\",\n\t\t\t\"male_fairy\",\n\t\t\t\"vampire\",\n\t\t\t\"female_vampire\",\n\t\t\t\"male_vampire\",\n\t\t\t\"merperson\",\n\t\t\t\"mermaid\",\n\t\t\t\"merman\",\n\t\t\t\"elf\",\n\t\t\t\"female_elf\",\n\t\t\t\"male_elf\",\n\t\t\t\"genie\",\n\t\t\t\"female_genie\",\n\t\t\t\"male_genie\",\n\t\t\t\"zombie\",\n\t\t\t\"female_zombie\",\n\t\t\t\"male_zombie\",\n\t\t\t\"person_frowning\",\n\t\t\t\"man-frowning\",\n\t\t\t\"woman-frowning\",\n\t\t\t\"person_with_pouting_face\",\n\t\t\t\"man-pouting\",\n\t\t\t\"woman-pouting\",\n\t\t\t\"no_good\",\n\t\t\t\"man-gesturing-no\",\n\t\t\t\"woman-gesturing-no\",\n\t\t\t\"ok_woman\",\n\t\t\t\"man-gesturing-ok\",\n\t\t\t\"woman-gesturing-ok\",\n\t\t\t\"information_desk_person\",\n\t\t\t\"man-tipping-hand\",\n\t\t\t\"woman-tipping-hand\",\n\t\t\t\"raising_hand\",\n\t\t\t\"man-raising-hand\",\n\t\t\t\"woman-raising-hand\",\n\t\t\t\"bow\",\n\t\t\t\"man-bowing\",\n\t\t\t\"woman-bowing\",\n\t\t\t\"face_palm\",\n\t\t\t\"man-facepalming\",\n\t\t\t\"woman-facepalming\",\n\t\t\t\"shrug\",\n\t\t\t\"man-shrugging\",\n\t\t\t\"woman-shrugging\",\n\t\t\t\"massage\",\n\t\t\t\"man-getting-massage\",\n\t\t\t\"woman-getting-massage\",\n\t\t\t\"haircut\",\n\t\t\t\"man-getting-haircut\",\n\t\t\t\"woman-getting-haircut\",\n\t\t\t\"walking\",\n\t\t\t\"man-walking\",\n\t\t\t\"woman-walking\",\n\t\t\t\"runner\",\n\t\t\t\"man-running\",\n\t\t\t\"woman-running\",\n\t\t\t\"dancer\",\n\t\t\t\"man_dancing\",\n\t\t\t\"dancers\",\n\t\t\t\"man-with-bunny-ears-partying\",\n\t\t\t\"woman-with-bunny-ears-partying\",\n\t\t\t\"person_in_steamy_room\",\n\t\t\t\"woman_in_steamy_room\",\n\t\t\t\"man_in_steamy_room\",\n\t\t\t\"person_climbing\",\n\t\t\t\"woman_climbing\",\n\t\t\t\"man_climbing\",\n\t\t\t\"person_in_lotus_position\",\n\t\t\t\"woman_in_lotus_position\",\n\t\t\t\"man_in_lotus_position\",\n\t\t\t\"bath\",\n\t\t\t\"sleeping_accommodation\",\n\t\t\t\"man_in_business_suit_levitating\",\n\t\t\t\"speaking_head_in_silhouette\",\n\t\t\t\"bust_in_silhouette\",\n\t\t\t\"busts_in_silhouette\",\n\t\t\t\"fencer\",\n\t\t\t\"horse_racing\",\n\t\t\t\"skier\",\n\t\t\t\"snowboarder\",\n\t\t\t\"golfer\",\n\t\t\t\"man-golfing\",\n\t\t\t\"woman-golfing\",\n\t\t\t\"surfer\",\n\t\t\t\"man-surfing\",\n\t\t\t\"woman-surfing\",\n\t\t\t\"rowboat\",\n\t\t\t\"man-rowing-boat\",\n\t\t\t\"woman-rowing-boat\",\n\t\t\t\"swimmer\",\n\t\t\t\"man-swimming\",\n\t\t\t\"woman-swimming\",\n\t\t\t\"person_with_ball\",\n\t\t\t\"man-bouncing-ball\",\n\t\t\t\"woman-bouncing-ball\",\n\t\t\t\"weight_lifter\",\n\t\t\t\"man-lifting-weights\",\n\t\t\t\"woman-lifting-weights\",\n\t\t\t\"bicyclist\",\n\t\t\t\"man-biking\",\n\t\t\t\"woman-biking\",\n\t\t\t\"mountain_bicyclist\",\n\t\t\t\"man-mountain-biking\",\n\t\t\t\"woman-mountain-biking\",\n\t\t\t\"racing_car\",\n\t\t\t\"racing_motorcycle\",\n\t\t\t\"person_doing_cartwheel\",\n\t\t\t\"man-cartwheeling\",\n\t\t\t\"woman-cartwheeling\",\n\t\t\t\"wrestlers\",\n\t\t\t\"man-wrestling\",\n\t\t\t\"woman-wrestling\",\n\t\t\t\"water_polo\",\n\t\t\t\"man-playing-water-polo\",\n\t\t\t\"woman-playing-water-polo\",\n\t\t\t\"handball\",\n\t\t\t\"man-playing-handball\",\n\t\t\t\"woman-playing-handball\",\n\t\t\t\"juggling\",\n\t\t\t\"man-juggling\",\n\t\t\t\"woman-juggling\",\n\t\t\t\"couple\",\n\t\t\t\"two_men_holding_hands\",\n\t\t\t\"two_women_holding_hands\",\n\t\t\t\"couplekiss\",\n\t\t\t\"woman-kiss-man\",\n\t\t\t\"man-kiss-man\",\n\t\t\t\"woman-kiss-woman\",\n\t\t\t\"couple_with_heart\",\n\t\t\t\"woman-heart-man\",\n\t\t\t\"man-heart-man\",\n\t\t\t\"woman-heart-woman\",\n\t\t\t\"family\",\n\t\t\t\"man-woman-boy\",\n\t\t\t\"man-woman-girl\",\n\t\t\t\"man-woman-girl-boy\",\n\t\t\t\"man-woman-boy-boy\",\n\t\t\t\"man-woman-girl-girl\",\n\t\t\t\"man-man-boy\",\n\t\t\t\"man-man-girl\",\n\t\t\t\"man-man-girl-boy\",\n\t\t\t\"man-man-boy-boy\",\n\t\t\t\"man-man-girl-girl\",\n\t\t\t\"woman-woman-boy\",\n\t\t\t\"woman-woman-girl\",\n\t\t\t\"woman-woman-girl-boy\",\n\t\t\t\"woman-woman-boy-boy\",\n\t\t\t\"woman-woman-girl-girl\",\n\t\t\t\"man-boy\",\n\t\t\t\"man-boy-boy\",\n\t\t\t\"man-girl\",\n\t\t\t\"man-girl-boy\",\n\t\t\t\"man-girl-girl\",\n\t\t\t\"woman-boy\",\n\t\t\t\"woman-boy-boy\",\n\t\t\t\"woman-girl\",\n\t\t\t\"woman-girl-boy\",\n\t\t\t\"woman-girl-girl\",\n\t\t\t\"selfie\",\n\t\t\t\"muscle\",\n\t\t\t\"point_left\",\n\t\t\t\"point_right\",\n\t\t\t\"point_up\",\n\t\t\t\"point_up_2\",\n\t\t\t\"middle_finger\",\n\t\t\t\"point_down\",\n\t\t\t\"v\",\n\t\t\t\"crossed_fingers\",\n\t\t\t\"spock-hand\",\n\t\t\t\"the_horns\",\n\t\t\t\"call_me_hand\",\n\t\t\t\"raised_hand_with_fingers_splayed\",\n\t\t\t\"hand\",\n\t\t\t\"ok_hand\",\n\t\t\t\"+1\",\n\t\t\t\"-1\",\n\t\t\t\"fist\",\n\t\t\t\"facepunch\",\n\t\t\t\"left-facing_fist\",\n\t\t\t\"right-facing_fist\",\n\t\t\t\"raised_back_of_hand\",\n\t\t\t\"wave\",\n\t\t\t\"i_love_you_hand_sign\",\n\t\t\t\"writing_hand\",\n\t\t\t\"clap\",\n\t\t\t\"open_hands\",\n\t\t\t\"raised_hands\",\n\t\t\t\"palms_up_together\",\n\t\t\t\"pray\",\n\t\t\t\"handshake\",\n\t\t\t\"nail_care\",\n\t\t\t\"ear\",\n\t\t\t\"nose\",\n\t\t\t\"footprints\",\n\t\t\t\"eyes\",\n\t\t\t\"eye\",\n\t\t\t\"eye-in-speech-bubble\",\n\t\t\t\"brain\",\n\t\t\t\"tongue\",\n\t\t\t\"lips\",\n\t\t\t\"kiss\",\n\t\t\t\"cupid\",\n\t\t\t\"heart\",\n\t\t\t\"heartbeat\",\n\t\t\t\"broken_heart\",\n\t\t\t\"two_hearts\",\n\t\t\t\"sparkling_heart\",\n\t\t\t\"heartpulse\",\n\t\t\t\"blue_heart\",\n\t\t\t\"green_heart\",\n\t\t\t\"yellow_heart\",\n\t\t\t\"orange_heart\",\n\t\t\t\"purple_heart\",\n\t\t\t\"black_heart\",\n\t\t\t\"gift_heart\",\n\t\t\t\"revolving_hearts\",\n\t\t\t\"heart_decoration\",\n\t\t\t\"heavy_heart_exclamation_mark_ornament\",\n\t\t\t\"love_letter\",\n\t\t\t\"zzz\",\n\t\t\t\"anger\",\n\t\t\t\"bomb\",\n\t\t\t\"boom\",\n\t\t\t\"sweat_drops\",\n\t\t\t\"dash\",\n\t\t\t\"dizzy\",\n\t\t\t\"speech_balloon\",\n\t\t\t\"left_speech_bubble\",\n\t\t\t\"right_anger_bubble\",\n\t\t\t\"thought_balloon\",\n\t\t\t\"hole\",\n\t\t\t\"eyeglasses\",\n\t\t\t\"dark_sunglasses\",\n\t\t\t\"necktie\",\n\t\t\t\"shirt\",\n\t\t\t\"jeans\",\n\t\t\t\"scarf\",\n\t\t\t\"gloves\",\n\t\t\t\"coat\",\n\t\t\t\"socks\",\n\t\t\t\"dress\",\n\t\t\t\"kimono\",\n\t\t\t\"bikini\",\n\t\t\t\"womans_clothes\",\n\t\t\t\"purse\",\n\t\t\t\"handbag\",\n\t\t\t\"pouch\",\n\t\t\t\"shopping_bags\",\n\t\t\t\"school_satchel\",\n\t\t\t\"mans_shoe\",\n\t\t\t\"athletic_shoe\",\n\t\t\t\"high_heel\",\n\t\t\t\"sandal\",\n\t\t\t\"boot\",\n\t\t\t\"crown\",\n\t\t\t\"womans_hat\",\n\t\t\t\"tophat\",\n\t\t\t\"mortar_board\",\n\t\t\t\"billed_cap\",\n\t\t\t\"helmet_with_white_cross\",\n\t\t\t\"prayer_beads\",\n\t\t\t\"lipstick\",\n\t\t\t\"ring\",\n\t\t\t\"gem\"\n\t\t]\n\t},\n\t{\n\t\tid: \"nature\",\n\t\tname: \"Animals & Nature\",\n\t\temojis: [\n\t\t\t\"monkey_face\",\n\t\t\t\"monkey\",\n\t\t\t\"gorilla\",\n\t\t\t\"dog\",\n\t\t\t\"dog2\",\n\t\t\t\"poodle\",\n\t\t\t\"wolf\",\n\t\t\t\"fox_face\",\n\t\t\t\"cat\",\n\t\t\t\"cat2\",\n\t\t\t\"lion_face\",\n\t\t\t\"tiger\",\n\t\t\t\"tiger2\",\n\t\t\t\"leopard\",\n\t\t\t\"horse\",\n\t\t\t\"racehorse\",\n\t\t\t\"unicorn_face\",\n\t\t\t\"zebra_face\",\n\t\t\t\"deer\",\n\t\t\t\"cow\",\n\t\t\t\"ox\",\n\t\t\t\"water_buffalo\",\n\t\t\t\"cow2\",\n\t\t\t\"pig\",\n\t\t\t\"pig2\",\n\t\t\t\"boar\",\n\t\t\t\"pig_nose\",\n\t\t\t\"ram\",\n\t\t\t\"sheep\",\n\t\t\t\"goat\",\n\t\t\t\"dromedary_camel\",\n\t\t\t\"camel\",\n\t\t\t\"giraffe_face\",\n\t\t\t\"elephant\",\n\t\t\t\"rhinoceros\",\n\t\t\t\"mouse\",\n\t\t\t\"mouse2\",\n\t\t\t\"rat\",\n\t\t\t\"hamster\",\n\t\t\t\"rabbit\",\n\t\t\t\"rabbit2\",\n\t\t\t\"chipmunk\",\n\t\t\t\"hedgehog\",\n\t\t\t\"bat\",\n\t\t\t\"bear\",\n\t\t\t\"koala\",\n\t\t\t\"panda_face\",\n\t\t\t\"feet\",\n\t\t\t\"turkey\",\n\t\t\t\"chicken\",\n\t\t\t\"rooster\",\n\t\t\t\"hatching_chick\",\n\t\t\t\"baby_chick\",\n\t\t\t\"hatched_chick\",\n\t\t\t\"bird\",\n\t\t\t\"penguin\",\n\t\t\t\"dove_of_peace\",\n\t\t\t\"eagle\",\n\t\t\t\"duck\",\n\t\t\t\"owl\",\n\t\t\t\"frog\",\n\t\t\t\"crocodile\",\n\t\t\t\"turtle\",\n\t\t\t\"lizard\",\n\t\t\t\"snake\",\n\t\t\t\"dragon_face\",\n\t\t\t\"dragon\",\n\t\t\t\"sauropod\",\n\t\t\t\"t-rex\",\n\t\t\t\"whale\",\n\t\t\t\"whale2\",\n\t\t\t\"dolphin\",\n\t\t\t\"fish\",\n\t\t\t\"tropical_fish\",\n\t\t\t\"blowfish\",\n\t\t\t\"shark\",\n\t\t\t\"octopus\",\n\t\t\t\"shell\",\n\t\t\t\"crab\",\n\t\t\t\"shrimp\",\n\t\t\t\"squid\",\n\t\t\t\"snail\",\n\t\t\t\"butterfly\",\n\t\t\t\"bug\",\n\t\t\t\"ant\",\n\t\t\t\"bee\",\n\t\t\t\"beetle\",\n\t\t\t\"cricket\",\n\t\t\t\"spider\",\n\t\t\t\"spider_web\",\n\t\t\t\"scorpion\",\n\t\t\t\"bouquet\",\n\t\t\t\"cherry_blossom\",\n\t\t\t\"white_flower\",\n\t\t\t\"rosette\",\n\t\t\t\"rose\",\n\t\t\t\"wilted_flower\",\n\t\t\t\"hibiscus\",\n\t\t\t\"sunflower\",\n\t\t\t\"blossom\",\n\t\t\t\"tulip\",\n\t\t\t\"seedling\",\n\t\t\t\"evergreen_tree\",\n\t\t\t\"deciduous_tree\",\n\t\t\t\"palm_tree\",\n\t\t\t\"cactus\",\n\t\t\t\"ear_of_rice\",\n\t\t\t\"herb\",\n\t\t\t\"shamrock\",\n\t\t\t\"four_leaf_clover\",\n\t\t\t\"maple_leaf\",\n\t\t\t\"fallen_leaf\",\n\t\t\t\"leaves\"\n\t\t]\n\t},\n\t{\n\t\tid: \"foods\",\n\t\tname: \"Food & Drink\",\n\t\temojis: [\n\t\t\t\"grapes\",\n\t\t\t\"melon\",\n\t\t\t\"watermelon\",\n\t\t\t\"tangerine\",\n\t\t\t\"lemon\",\n\t\t\t\"banana\",\n\t\t\t\"pineapple\",\n\t\t\t\"apple\",\n\t\t\t\"green_apple\",\n\t\t\t\"pear\",\n\t\t\t\"peach\",\n\t\t\t\"cherries\",\n\t\t\t\"strawberry\",\n\t\t\t\"kiwifruit\",\n\t\t\t\"tomato\",\n\t\t\t\"coconut\",\n\t\t\t\"avocado\",\n\t\t\t\"eggplant\",\n\t\t\t\"potato\",\n\t\t\t\"carrot\",\n\t\t\t\"corn\",\n\t\t\t\"hot_pepper\",\n\t\t\t\"cucumber\",\n\t\t\t\"broccoli\",\n\t\t\t\"mushroom\",\n\t\t\t\"peanuts\",\n\t\t\t\"chestnut\",\n\t\t\t\"bread\",\n\t\t\t\"croissant\",\n\t\t\t\"baguette_bread\",\n\t\t\t\"pretzel\",\n\t\t\t\"pancakes\",\n\t\t\t\"cheese_wedge\",\n\t\t\t\"meat_on_bone\",\n\t\t\t\"poultry_leg\",\n\t\t\t\"cut_of_meat\",\n\t\t\t\"bacon\",\n\t\t\t\"hamburger\",\n\t\t\t\"fries\",\n\t\t\t\"pizza\",\n\t\t\t\"hotdog\",\n\t\t\t\"sandwich\",\n\t\t\t\"taco\",\n\t\t\t\"burrito\",\n\t\t\t\"stuffed_flatbread\",\n\t\t\t\"egg\",\n\t\t\t\"fried_egg\",\n\t\t\t\"shallow_pan_of_food\",\n\t\t\t\"stew\",\n\t\t\t\"bowl_with_spoon\",\n\t\t\t\"green_salad\",\n\t\t\t\"popcorn\",\n\t\t\t\"canned_food\",\n\t\t\t\"bento\",\n\t\t\t\"rice_cracker\",\n\t\t\t\"rice_ball\",\n\t\t\t\"rice\",\n\t\t\t\"curry\",\n\t\t\t\"ramen\",\n\t\t\t\"spaghetti\",\n\t\t\t\"sweet_potato\",\n\t\t\t\"oden\",\n\t\t\t\"sushi\",\n\t\t\t\"fried_shrimp\",\n\t\t\t\"fish_cake\",\n\t\t\t\"dango\",\n\t\t\t\"dumpling\",\n\t\t\t\"fortune_cookie\",\n\t\t\t\"takeout_box\",\n\t\t\t\"icecream\",\n\t\t\t\"shaved_ice\",\n\t\t\t\"ice_cream\",\n\t\t\t\"doughnut\",\n\t\t\t\"cookie\",\n\t\t\t\"birthday\",\n\t\t\t\"cake\",\n\t\t\t\"pie\",\n\t\t\t\"chocolate_bar\",\n\t\t\t\"candy\",\n\t\t\t\"lollipop\",\n\t\t\t\"custard\",\n\t\t\t\"honey_pot\",\n\t\t\t\"baby_bottle\",\n\t\t\t\"glass_of_milk\",\n\t\t\t\"coffee\",\n\t\t\t\"tea\",\n\t\t\t\"sake\",\n\t\t\t\"champagne\",\n\t\t\t\"wine_glass\",\n\t\t\t\"cocktail\",\n\t\t\t\"tropical_drink\",\n\t\t\t\"beer\",\n\t\t\t\"beers\",\n\t\t\t\"clinking_glasses\",\n\t\t\t\"tumbler_glass\",\n\t\t\t\"cup_with_straw\",\n\t\t\t\"chopsticks\",\n\t\t\t\"knife_fork_plate\",\n\t\t\t\"fork_and_knife\",\n\t\t\t\"spoon\",\n\t\t\t\"hocho\",\n\t\t\t\"amphora\"\n\t\t]\n\t},\n\t{\n\t\tid: \"activity\",\n\t\tname: \"Activities\",\n\t\temojis: [\n\t\t\t\"jack_o_lantern\",\n\t\t\t\"christmas_tree\",\n\t\t\t\"fireworks\",\n\t\t\t\"sparkler\",\n\t\t\t\"sparkles\",\n\t\t\t\"balloon\",\n\t\t\t\"tada\",\n\t\t\t\"confetti_ball\",\n\t\t\t\"tanabata_tree\",\n\t\t\t\"bamboo\",\n\t\t\t\"dolls\",\n\t\t\t\"flags\",\n\t\t\t\"wind_chime\",\n\t\t\t\"rice_scene\",\n\t\t\t\"ribbon\",\n\t\t\t\"gift\",\n\t\t\t\"reminder_ribbon\",\n\t\t\t\"admission_tickets\",\n\t\t\t\"ticket\",\n\t\t\t\"medal\",\n\t\t\t\"trophy\",\n\t\t\t\"sports_medal\",\n\t\t\t\"first_place_medal\",\n\t\t\t\"second_place_medal\",\n\t\t\t\"third_place_medal\",\n\t\t\t\"soccer\",\n\t\t\t\"baseball\",\n\t\t\t\"basketball\",\n\t\t\t\"volleyball\",\n\t\t\t\"football\",\n\t\t\t\"rugby_football\",\n\t\t\t\"tennis\",\n\t\t\t\"8ball\",\n\t\t\t\"bowling\",\n\t\t\t\"cricket_bat_and_ball\",\n\t\t\t\"field_hockey_stick_and_ball\",\n\t\t\t\"ice_hockey_stick_and_puck\",\n\t\t\t\"table_tennis_paddle_and_ball\",\n\t\t\t\"badminton_racquet_and_shuttlecock\",\n\t\t\t\"boxing_glove\",\n\t\t\t\"martial_arts_uniform\",\n\t\t\t\"goal_net\",\n\t\t\t\"dart\",\n\t\t\t\"golf\",\n\t\t\t\"ice_skate\",\n\t\t\t\"fishing_pole_and_fish\",\n\t\t\t\"running_shirt_with_sash\",\n\t\t\t\"ski\",\n\t\t\t\"sled\",\n\t\t\t\"curling_stone\",\n\t\t\t\"video_game\",\n\t\t\t\"joystick\",\n\t\t\t\"game_die\",\n\t\t\t\"spades\",\n\t\t\t\"hearts\",\n\t\t\t\"diamonds\",\n\t\t\t\"clubs\",\n\t\t\t\"black_joker\",\n\t\t\t\"mahjong\",\n\t\t\t\"flower_playing_cards\"\n\t\t]\n\t},\n\t{\n\t\tid: \"places\",\n\t\tname: \"Travel & Places\",\n\t\temojis: [\n\t\t\t\"earth_africa\",\n\t\t\t\"earth_americas\",\n\t\t\t\"earth_asia\",\n\t\t\t\"globe_with_meridians\",\n\t\t\t\"world_map\",\n\t\t\t\"japan\",\n\t\t\t\"snow_capped_mountain\",\n\t\t\t\"mountain\",\n\t\t\t\"volcano\",\n\t\t\t\"mount_fuji\",\n\t\t\t\"camping\",\n\t\t\t\"beach_with_umbrella\",\n\t\t\t\"desert\",\n\t\t\t\"desert_island\",\n\t\t\t\"national_park\",\n\t\t\t\"stadium\",\n\t\t\t\"classical_building\",\n\t\t\t\"building_construction\",\n\t\t\t\"house_buildings\",\n\t\t\t\"cityscape\",\n\t\t\t\"derelict_house_building\",\n\t\t\t\"house\",\n\t\t\t\"house_with_garden\",\n\t\t\t\"office\",\n\t\t\t\"post_office\",\n\t\t\t\"european_post_office\",\n\t\t\t\"hospital\",\n\t\t\t\"bank\",\n\t\t\t\"hotel\",\n\t\t\t\"love_hotel\",\n\t\t\t\"convenience_store\",\n\t\t\t\"school\",\n\t\t\t\"department_store\",\n\t\t\t\"factory\",\n\t\t\t\"japanese_castle\",\n\t\t\t\"european_castle\",\n\t\t\t\"wedding\",\n\t\t\t\"tokyo_tower\",\n\t\t\t\"statue_of_liberty\",\n\t\t\t\"church\",\n\t\t\t\"mosque\",\n\t\t\t\"synagogue\",\n\t\t\t\"shinto_shrine\",\n\t\t\t\"kaaba\",\n\t\t\t\"fountain\",\n\t\t\t\"tent\",\n\t\t\t\"foggy\",\n\t\t\t\"night_with_stars\",\n\t\t\t\"sunrise_over_mountains\",\n\t\t\t\"sunrise\",\n\t\t\t\"city_sunset\",\n\t\t\t\"city_sunrise\",\n\t\t\t\"bridge_at_night\",\n\t\t\t\"hotsprings\",\n\t\t\t\"milky_way\",\n\t\t\t\"carousel_horse\",\n\t\t\t\"ferris_wheel\",\n\t\t\t\"roller_coaster\",\n\t\t\t\"barber\",\n\t\t\t\"circus_tent\",\n\t\t\t\"performing_arts\",\n\t\t\t\"frame_with_picture\",\n\t\t\t\"art\",\n\t\t\t\"slot_machine\",\n\t\t\t\"steam_locomotive\",\n\t\t\t\"railway_car\",\n\t\t\t\"bullettrain_side\",\n\t\t\t\"bullettrain_front\",\n\t\t\t\"train2\",\n\t\t\t\"metro\",\n\t\t\t\"light_rail\",\n\t\t\t\"station\",\n\t\t\t\"tram\",\n\t\t\t\"monorail\",\n\t\t\t\"mountain_railway\",\n\t\t\t\"train\",\n\t\t\t\"bus\",\n\t\t\t\"oncoming_bus\",\n\t\t\t\"trolleybus\",\n\t\t\t\"minibus\",\n\t\t\t\"ambulance\",\n\t\t\t\"fire_engine\",\n\t\t\t\"police_car\",\n\t\t\t\"oncoming_police_car\",\n\t\t\t\"taxi\",\n\t\t\t\"oncoming_taxi\",\n\t\t\t\"car\",\n\t\t\t\"oncoming_automobile\",\n\t\t\t\"blue_car\",\n\t\t\t\"truck\",\n\t\t\t\"articulated_lorry\",\n\t\t\t\"tractor\",\n\t\t\t\"bike\",\n\t\t\t\"scooter\",\n\t\t\t\"motor_scooter\",\n\t\t\t\"busstop\",\n\t\t\t\"motorway\",\n\t\t\t\"railway_track\",\n\t\t\t\"fuelpump\",\n\t\t\t\"rotating_light\",\n\t\t\t\"traffic_light\",\n\t\t\t\"vertical_traffic_light\",\n\t\t\t\"construction\",\n\t\t\t\"octagonal_sign\",\n\t\t\t\"anchor\",\n\t\t\t\"boat\",\n\t\t\t\"canoe\",\n\t\t\t\"speedboat\",\n\t\t\t\"passenger_ship\",\n\t\t\t\"ferry\",\n\t\t\t\"motor_boat\",\n\t\t\t\"ship\",\n\t\t\t\"airplane\",\n\t\t\t\"small_airplane\",\n\t\t\t\"airplane_departure\",\n\t\t\t\"airplane_arriving\",\n\t\t\t\"seat\",\n\t\t\t\"helicopter\",\n\t\t\t\"suspension_railway\",\n\t\t\t\"mountain_cableway\",\n\t\t\t\"aerial_tramway\",\n\t\t\t\"satellite\",\n\t\t\t\"rocket\",\n\t\t\t\"flying_saucer\",\n\t\t\t\"bellhop_bell\",\n\t\t\t\"door\",\n\t\t\t\"bed\",\n\t\t\t\"couch_and_lamp\",\n\t\t\t\"toilet\",\n\t\t\t\"shower\",\n\t\t\t\"bathtub\",\n\t\t\t\"hourglass\",\n\t\t\t\"hourglass_flowing_sand\",\n\t\t\t\"watch\",\n\t\t\t\"alarm_clock\",\n\t\t\t\"stopwatch\",\n\t\t\t\"timer_clock\",\n\t\t\t\"mantelpiece_clock\",\n\t\t\t\"clock12\",\n\t\t\t\"clock1230\",\n\t\t\t\"clock1\",\n\t\t\t\"clock130\",\n\t\t\t\"clock2\",\n\t\t\t\"clock230\",\n\t\t\t\"clock3\",\n\t\t\t\"clock330\",\n\t\t\t\"clock4\",\n\t\t\t\"clock430\",\n\t\t\t\"clock5\",\n\t\t\t\"clock530\",\n\t\t\t\"clock6\",\n\t\t\t\"clock630\",\n\t\t\t\"clock7\",\n\t\t\t\"clock730\",\n\t\t\t\"clock8\",\n\t\t\t\"clock830\",\n\t\t\t\"clock9\",\n\t\t\t\"clock930\",\n\t\t\t\"clock10\",\n\t\t\t\"clock1030\",\n\t\t\t\"clock11\",\n\t\t\t\"clock1130\",\n\t\t\t\"new_moon\",\n\t\t\t\"waxing_crescent_moon\",\n\t\t\t\"first_quarter_moon\",\n\t\t\t\"moon\",\n\t\t\t\"full_moon\",\n\t\t\t\"waning_gibbous_moon\",\n\t\t\t\"last_quarter_moon\",\n\t\t\t\"waning_crescent_moon\",\n\t\t\t\"crescent_moon\",\n\t\t\t\"new_moon_with_face\",\n\t\t\t\"first_quarter_moon_with_face\",\n\t\t\t\"last_quarter_moon_with_face\",\n\t\t\t\"thermometer\",\n\t\t\t\"sunny\",\n\t\t\t\"full_moon_with_face\",\n\t\t\t\"sun_with_face\",\n\t\t\t\"star\",\n\t\t\t\"star2\",\n\t\t\t\"stars\",\n\t\t\t\"cloud\",\n\t\t\t\"partly_sunny\",\n\t\t\t\"thunder_cloud_and_rain\",\n\t\t\t\"mostly_sunny\",\n\t\t\t\"barely_sunny\",\n\t\t\t\"partly_sunny_rain\",\n\t\t\t\"rain_cloud\",\n\t\t\t\"snow_cloud\",\n\t\t\t\"lightning\",\n\t\t\t\"tornado\",\n\t\t\t\"fog\",\n\t\t\t\"wind_blowing_face\",\n\t\t\t\"cyclone\",\n\t\t\t\"rainbow\",\n\t\t\t\"closed_umbrella\",\n\t\t\t\"umbrella\",\n\t\t\t\"umbrella_with_rain_drops\",\n\t\t\t\"umbrella_on_ground\",\n\t\t\t\"zap\",\n\t\t\t\"snowflake\",\n\t\t\t\"snowman\",\n\t\t\t\"snowman_without_snow\",\n\t\t\t\"comet\",\n\t\t\t\"fire\",\n\t\t\t\"droplet\",\n\t\t\t\"ocean\"\n\t\t]\n\t},\n\t{\n\t\tid: \"objects\",\n\t\tname: \"Objects\",\n\t\temojis: [\n\t\t\t\"mute\",\n\t\t\t\"speaker\",\n\t\t\t\"sound\",\n\t\t\t\"loud_sound\",\n\t\t\t\"loudspeaker\",\n\t\t\t\"mega\",\n\t\t\t\"postal_horn\",\n\t\t\t\"bell\",\n\t\t\t\"no_bell\",\n\t\t\t\"musical_score\",\n\t\t\t\"musical_note\",\n\t\t\t\"notes\",\n\t\t\t\"studio_microphone\",\n\t\t\t\"level_slider\",\n\t\t\t\"control_knobs\",\n\t\t\t\"microphone\",\n\t\t\t\"headphones\",\n\t\t\t\"radio\",\n\t\t\t\"saxophone\",\n\t\t\t\"guitar\",\n\t\t\t\"musical_keyboard\",\n\t\t\t\"trumpet\",\n\t\t\t\"violin\",\n\t\t\t\"drum_with_drumsticks\",\n\t\t\t\"iphone\",\n\t\t\t\"calling\",\n\t\t\t\"phone\",\n\t\t\t\"telephone_receiver\",\n\t\t\t\"pager\",\n\t\t\t\"fax\",\n\t\t\t\"battery\",\n\t\t\t\"electric_plug\",\n\t\t\t\"computer\",\n\t\t\t\"desktop_computer\",\n\t\t\t\"printer\",\n\t\t\t\"keyboard\",\n\t\t\t\"three_button_mouse\",\n\t\t\t\"trackball\",\n\t\t\t\"minidisc\",\n\t\t\t\"floppy_disk\",\n\t\t\t\"cd\",\n\t\t\t\"dvd\",\n\t\t\t\"movie_camera\",\n\t\t\t\"film_frames\",\n\t\t\t\"film_projector\",\n\t\t\t\"clapper\",\n\t\t\t\"tv\",\n\t\t\t\"camera\",\n\t\t\t\"camera_with_flash\",\n\t\t\t\"video_camera\",\n\t\t\t\"vhs\",\n\t\t\t\"mag\",\n\t\t\t\"mag_right\",\n\t\t\t\"microscope\",\n\t\t\t\"telescope\",\n\t\t\t\"satellite_antenna\",\n\t\t\t\"candle\",\n\t\t\t\"bulb\",\n\t\t\t\"flashlight\",\n\t\t\t\"izakaya_lantern\",\n\t\t\t\"notebook_with_decorative_cover\",\n\t\t\t\"closed_book\",\n\t\t\t\"book\",\n\t\t\t\"green_book\",\n\t\t\t\"blue_book\",\n\t\t\t\"orange_book\",\n\t\t\t\"books\",\n\t\t\t\"notebook\",\n\t\t\t\"ledger\",\n\t\t\t\"page_with_curl\",\n\t\t\t\"scroll\",\n\t\t\t\"page_facing_up\",\n\t\t\t\"newspaper\",\n\t\t\t\"rolled_up_newspaper\",\n\t\t\t\"bookmark_tabs\",\n\t\t\t\"bookmark\",\n\t\t\t\"label\",\n\t\t\t\"moneybag\",\n\t\t\t\"yen\",\n\t\t\t\"dollar\",\n\t\t\t\"euro\",\n\t\t\t\"pound\",\n\t\t\t\"money_with_wings\",\n\t\t\t\"credit_card\",\n\t\t\t\"chart\",\n\t\t\t\"currency_exchange\",\n\t\t\t\"heavy_dollar_sign\",\n\t\t\t\"email\",\n\t\t\t\"e-mail\",\n\t\t\t\"incoming_envelope\",\n\t\t\t\"envelope_with_arrow\",\n\t\t\t\"outbox_tray\",\n\t\t\t\"inbox_tray\",\n\t\t\t\"package\",\n\t\t\t\"mailbox\",\n\t\t\t\"mailbox_closed\",\n\t\t\t\"mailbox_with_mail\",\n\t\t\t\"mailbox_with_no_mail\",\n\t\t\t\"postbox\",\n\t\t\t\"ballot_box_with_ballot\",\n\t\t\t\"pencil2\",\n\t\t\t\"black_nib\",\n\t\t\t\"lower_left_fountain_pen\",\n\t\t\t\"lower_left_ballpoint_pen\",\n\t\t\t\"lower_left_paintbrush\",\n\t\t\t\"lower_left_crayon\",\n\t\t\t\"memo\",\n\t\t\t\"briefcase\",\n\t\t\t\"file_folder\",\n\t\t\t\"open_file_folder\",\n\t\t\t\"card_index_dividers\",\n\t\t\t\"date\",\n\t\t\t\"calendar\",\n\t\t\t\"spiral_note_pad\",\n\t\t\t\"spiral_calendar_pad\",\n\t\t\t\"card_index\",\n\t\t\t\"chart_with_upwards_trend\",\n\t\t\t\"chart_with_downwards_trend\",\n\t\t\t\"bar_chart\",\n\t\t\t\"clipboard\",\n\t\t\t\"pushpin\",\n\t\t\t\"round_pushpin\",\n\t\t\t\"paperclip\",\n\t\t\t\"linked_paperclips\",\n\t\t\t\"straight_ruler\",\n\t\t\t\"triangular_ruler\",\n\t\t\t\"scissors\",\n\t\t\t\"card_file_box\",\n\t\t\t\"file_cabinet\",\n\t\t\t\"wastebasket\",\n\t\t\t\"lock\",\n\t\t\t\"unlock\",\n\t\t\t\"lock_with_ink_pen\",\n\t\t\t\"closed_lock_with_key\",\n\t\t\t\"key\",\n\t\t\t\"old_key\",\n\t\t\t\"hammer\",\n\t\t\t\"pick\",\n\t\t\t\"hammer_and_pick\",\n\t\t\t\"hammer_and_wrench\",\n\t\t\t\"dagger_knife\",\n\t\t\t\"crossed_swords\",\n\t\t\t\"gun\",\n\t\t\t\"bow_and_arrow\",\n\t\t\t\"shield\",\n\t\t\t\"wrench\",\n\t\t\t\"nut_and_bolt\",\n\t\t\t\"gear\",\n\t\t\t\"compression\",\n\t\t\t\"alembic\",\n\t\t\t\"scales\",\n\t\t\t\"link\",\n\t\t\t\"chains\",\n\t\t\t\"syringe\",\n\t\t\t\"pill\",\n\t\t\t\"smoking\",\n\t\t\t\"coffin\",\n\t\t\t\"funeral_urn\",\n\t\t\t\"moyai\",\n\t\t\t\"oil_drum\",\n\t\t\t\"crystal_ball\",\n\t\t\t\"shopping_trolley\"\n\t\t]\n\t},\n\t{\n\t\tid: \"symbols\",\n\t\tname: \"Symbols\",\n\t\temojis: [\n\t\t\t\"atm\",\n\t\t\t\"put_litter_in_its_place\",\n\t\t\t\"potable_water\",\n\t\t\t\"wheelchair\",\n\t\t\t\"mens\",\n\t\t\t\"womens\",\n\t\t\t\"restroom\",\n\t\t\t\"baby_symbol\",\n\t\t\t\"wc\",\n\t\t\t\"passport_control\",\n\t\t\t\"customs\",\n\t\t\t\"baggage_claim\",\n\t\t\t\"left_luggage\",\n\t\t\t\"warning\",\n\t\t\t\"children_crossing\",\n\t\t\t\"no_entry\",\n\t\t\t\"no_entry_sign\",\n\t\t\t\"no_bicycles\",\n\t\t\t\"no_smoking\",\n\t\t\t\"do_not_litter\",\n\t\t\t\"non-potable_water\",\n\t\t\t\"no_pedestrians\",\n\t\t\t\"no_mobile_phones\",\n\t\t\t\"underage\",\n\t\t\t\"radioactive_sign\",\n\t\t\t\"biohazard_sign\",\n\t\t\t\"arrow_up\",\n\t\t\t\"arrow_upper_right\",\n\t\t\t\"arrow_right\",\n\t\t\t\"arrow_lower_right\",\n\t\t\t\"arrow_down\",\n\t\t\t\"arrow_lower_left\",\n\t\t\t\"arrow_left\",\n\t\t\t\"arrow_upper_left\",\n\t\t\t\"arrow_up_down\",\n\t\t\t\"left_right_arrow\",\n\t\t\t\"leftwards_arrow_with_hook\",\n\t\t\t\"arrow_right_hook\",\n\t\t\t\"arrow_heading_up\",\n\t\t\t\"arrow_heading_down\",\n\t\t\t\"arrows_clockwise\",\n\t\t\t\"arrows_counterclockwise\",\n\t\t\t\"back\",\n\t\t\t\"end\",\n\t\t\t\"on\",\n\t\t\t\"soon\",\n\t\t\t\"top\",\n\t\t\t\"place_of_worship\",\n\t\t\t\"atom_symbol\",\n\t\t\t\"om_symbol\",\n\t\t\t\"star_of_david\",\n\t\t\t\"wheel_of_dharma\",\n\t\t\t\"yin_yang\",\n\t\t\t\"latin_cross\",\n\t\t\t\"orthodox_cross\",\n\t\t\t\"star_and_crescent\",\n\t\t\t\"peace_symbol\",\n\t\t\t\"menorah_with_nine_branches\",\n\t\t\t\"six_pointed_star\",\n\t\t\t\"aries\",\n\t\t\t\"taurus\",\n\t\t\t\"gemini\",\n\t\t\t\"cancer\",\n\t\t\t\"leo\",\n\t\t\t\"virgo\",\n\t\t\t\"libra\",\n\t\t\t\"scorpius\",\n\t\t\t\"sagittarius\",\n\t\t\t\"capricorn\",\n\t\t\t\"aquarius\",\n\t\t\t\"pisces\",\n\t\t\t\"ophiuchus\",\n\t\t\t\"twisted_rightwards_arrows\",\n\t\t\t\"repeat\",\n\t\t\t\"repeat_one\",\n\t\t\t\"arrow_forward\",\n\t\t\t\"fast_forward\",\n\t\t\t\"black_right_pointing_double_triangle_with_vertical_bar\",\n\t\t\t\"black_right_pointing_triangle_with_double_vertical_bar\",\n\t\t\t\"arrow_backward\",\n\t\t\t\"rewind\",\n\t\t\t\"black_left_pointing_double_triangle_with_vertical_bar\",\n\t\t\t\"arrow_up_small\",\n\t\t\t\"arrow_double_up\",\n\t\t\t\"arrow_down_small\",\n\t\t\t\"arrow_double_down\",\n\t\t\t\"double_vertical_bar\",\n\t\t\t\"black_square_for_stop\",\n\t\t\t\"black_circle_for_record\",\n\t\t\t\"eject\",\n\t\t\t\"cinema\",\n\t\t\t\"low_brightness\",\n\t\t\t\"high_brightness\",\n\t\t\t\"signal_strength\",\n\t\t\t\"vibration_mode\",\n\t\t\t\"mobile_phone_off\",\n\t\t\t\"female_sign\",\n\t\t\t\"male_sign\",\n\t\t\t\"medical_symbol\",\n\t\t\t\"recycle\",\n\t\t\t\"fleur_de_lis\",\n\t\t\t\"trident\",\n\t\t\t\"name_badge\",\n\t\t\t\"beginner\",\n\t\t\t\"o\",\n\t\t\t\"white_check_mark\",\n\t\t\t\"ballot_box_with_check\",\n\t\t\t\"heavy_check_mark\",\n\t\t\t\"heavy_multiplication_x\",\n\t\t\t\"x\",\n\t\t\t\"negative_squared_cross_mark\",\n\t\t\t\"heavy_plus_sign\",\n\t\t\t\"heavy_minus_sign\",\n\t\t\t\"heavy_division_sign\",\n\t\t\t\"curly_loop\",\n\t\t\t\"loop\",\n\t\t\t\"part_alternation_mark\",\n\t\t\t\"eight_spoked_asterisk\",\n\t\t\t\"eight_pointed_black_star\",\n\t\t\t\"sparkle\",\n\t\t\t\"bangbang\",\n\t\t\t\"interrobang\",\n\t\t\t\"question\",\n\t\t\t\"grey_question\",\n\t\t\t\"grey_exclamation\",\n\t\t\t\"exclamation\",\n\t\t\t\"wavy_dash\",\n\t\t\t\"copyright\",\n\t\t\t\"registered\",\n\t\t\t\"tm\",\n\t\t\t\"hash\",\n\t\t\t\"keycap_star\",\n\t\t\t\"zero\",\n\t\t\t\"one\",\n\t\t\t\"two\",\n\t\t\t\"three\",\n\t\t\t\"four\",\n\t\t\t\"five\",\n\t\t\t\"six\",\n\t\t\t\"seven\",\n\t\t\t\"eight\",\n\t\t\t\"nine\",\n\t\t\t\"keycap_ten\",\n\t\t\t\"100\",\n\t\t\t\"capital_abcd\",\n\t\t\t\"abcd\",\n\t\t\t\"1234\",\n\t\t\t\"symbols\",\n\t\t\t\"abc\",\n\t\t\t\"a\",\n\t\t\t\"ab\",\n\t\t\t\"b\",\n\t\t\t\"cl\",\n\t\t\t\"cool\",\n\t\t\t\"free\",\n\t\t\t\"information_source\",\n\t\t\t\"id\",\n\t\t\t\"m\",\n\t\t\t\"new\",\n\t\t\t\"ng\",\n\t\t\t\"o2\",\n\t\t\t\"ok\",\n\t\t\t\"parking\",\n\t\t\t\"sos\",\n\t\t\t\"up\",\n\t\t\t\"vs\",\n\t\t\t\"koko\",\n\t\t\t\"sa\",\n\t\t\t\"u6708\",\n\t\t\t\"u6709\",\n\t\t\t\"u6307\",\n\t\t\t\"ideograph_advantage\",\n\t\t\t\"u5272\",\n\t\t\t\"u7121\",\n\t\t\t\"u7981\",\n\t\t\t\"accept\",\n\t\t\t\"u7533\",\n\t\t\t\"u5408\",\n\t\t\t\"u7a7a\",\n\t\t\t\"congratulations\",\n\t\t\t\"secret\",\n\t\t\t\"u55b6\",\n\t\t\t\"u6e80\",\n\t\t\t\"black_small_square\",\n\t\t\t\"white_small_square\",\n\t\t\t\"white_medium_square\",\n\t\t\t\"black_medium_square\",\n\t\t\t\"white_medium_small_square\",\n\t\t\t\"black_medium_small_square\",\n\t\t\t\"black_large_square\",\n\t\t\t\"white_large_square\",\n\t\t\t\"large_orange_diamond\",\n\t\t\t\"large_blue_diamond\",\n\t\t\t\"small_orange_diamond\",\n\t\t\t\"small_blue_diamond\",\n\t\t\t\"small_red_triangle\",\n\t\t\t\"small_red_triangle_down\",\n\t\t\t\"diamond_shape_with_a_dot_inside\",\n\t\t\t\"radio_button\",\n\t\t\t\"black_square_button\",\n\t\t\t\"white_square_button\",\n\t\t\t\"white_circle\",\n\t\t\t\"black_circle\",\n\t\t\t\"red_circle\",\n\t\t\t\"large_blue_circle\"\n\t\t]\n\t},\n\t{\n\t\tid: \"flags\",\n\t\tname: \"Flags\",\n\t\temojis: [\n\t\t\t\"checkered_flag\",\n\t\t\t\"cn\",\n\t\t\t\"crossed_flags\",\n\t\t\t\"de\",\n\t\t\t\"es\",\n\t\t\t\"flag-ac\",\n\t\t\t\"flag-ad\",\n\t\t\t\"flag-ae\",\n\t\t\t\"flag-af\",\n\t\t\t\"flag-ag\",\n\t\t\t\"flag-ai\",\n\t\t\t\"flag-al\",\n\t\t\t\"flag-am\",\n\t\t\t\"flag-ao\",\n\t\t\t\"flag-aq\",\n\t\t\t\"flag-ar\",\n\t\t\t\"flag-as\",\n\t\t\t\"flag-at\",\n\t\t\t\"flag-au\",\n\t\t\t\"flag-aw\",\n\t\t\t\"flag-ax\",\n\t\t\t\"flag-az\",\n\t\t\t\"flag-ba\",\n\t\t\t\"flag-bb\",\n\t\t\t\"flag-bd\",\n\t\t\t\"flag-be\",\n\t\t\t\"flag-bf\",\n\t\t\t\"flag-bg\",\n\t\t\t\"flag-bh\",\n\t\t\t\"flag-bi\",\n\t\t\t\"flag-bj\",\n\t\t\t\"flag-bl\",\n\t\t\t\"flag-bm\",\n\t\t\t\"flag-bn\",\n\t\t\t\"flag-bo\",\n\t\t\t\"flag-bq\",\n\t\t\t\"flag-br\",\n\t\t\t\"flag-bs\",\n\t\t\t\"flag-bt\",\n\t\t\t\"flag-bv\",\n\t\t\t\"flag-bw\",\n\t\t\t\"flag-by\",\n\t\t\t\"flag-bz\",\n\t\t\t\"flag-ca\",\n\t\t\t\"flag-cc\",\n\t\t\t\"flag-cd\",\n\t\t\t\"flag-cf\",\n\t\t\t\"flag-cg\",\n\t\t\t\"flag-ch\",\n\t\t\t\"flag-ci\",\n\t\t\t\"flag-ck\",\n\t\t\t\"flag-cl\",\n\t\t\t\"flag-cm\",\n\t\t\t\"flag-co\",\n\t\t\t\"flag-cp\",\n\t\t\t\"flag-cr\",\n\t\t\t\"flag-cu\",\n\t\t\t\"flag-cv\",\n\t\t\t\"flag-cw\",\n\t\t\t\"flag-cx\",\n\t\t\t\"flag-cy\",\n\t\t\t\"flag-cz\",\n\t\t\t\"flag-dg\",\n\t\t\t\"flag-dj\",\n\t\t\t\"flag-dk\",\n\t\t\t\"flag-dm\",\n\t\t\t\"flag-do\",\n\t\t\t\"flag-dz\",\n\t\t\t\"flag-ea\",\n\t\t\t\"flag-ec\",\n\t\t\t\"flag-ee\",\n\t\t\t\"flag-eg\",\n\t\t\t\"flag-eh\",\n\t\t\t\"flag-england\",\n\t\t\t\"flag-er\",\n\t\t\t\"flag-et\",\n\t\t\t\"flag-eu\",\n\t\t\t\"flag-fi\",\n\t\t\t\"flag-fj\",\n\t\t\t\"flag-fk\",\n\t\t\t\"flag-fm\",\n\t\t\t\"flag-fo\",\n\t\t\t\"flag-ga\",\n\t\t\t\"flag-gd\",\n\t\t\t\"flag-ge\",\n\t\t\t\"flag-gf\",\n\t\t\t\"flag-gg\",\n\t\t\t\"flag-gh\",\n\t\t\t\"flag-gi\",\n\t\t\t\"flag-gl\",\n\t\t\t\"flag-gm\",\n\t\t\t\"flag-gn\",\n\t\t\t\"flag-gp\",\n\t\t\t\"flag-gq\",\n\t\t\t\"flag-gr\",\n\t\t\t\"flag-gs\",\n\t\t\t\"flag-gt\",\n\t\t\t\"flag-gu\",\n\t\t\t\"flag-gw\",\n\t\t\t\"flag-gy\",\n\t\t\t\"flag-hk\",\n\t\t\t\"flag-hm\",\n\t\t\t\"flag-hn\",\n\t\t\t\"flag-hr\",\n\t\t\t\"flag-ht\",\n\t\t\t\"flag-hu\",\n\t\t\t\"flag-ic\",\n\t\t\t\"flag-id\",\n\t\t\t\"flag-ie\",\n\t\t\t\"flag-il\",\n\t\t\t\"flag-im\",\n\t\t\t\"flag-in\",\n\t\t\t\"flag-io\",\n\t\t\t\"flag-iq\",\n\t\t\t\"flag-ir\",\n\t\t\t\"flag-is\",\n\t\t\t\"flag-je\",\n\t\t\t\"flag-jm\",\n\t\t\t\"flag-jo\",\n\t\t\t\"flag-ke\",\n\t\t\t\"flag-kg\",\n\t\t\t\"flag-kh\",\n\t\t\t\"flag-ki\",\n\t\t\t\"flag-km\",\n\t\t\t\"flag-kn\",\n\t\t\t\"flag-kp\",\n\t\t\t\"flag-kw\",\n\t\t\t\"flag-ky\",\n\t\t\t\"flag-kz\",\n\t\t\t\"flag-la\",\n\t\t\t\"flag-lb\",\n\t\t\t\"flag-lc\",\n\t\t\t\"flag-li\",\n\t\t\t\"flag-lk\",\n\t\t\t\"flag-lr\",\n\t\t\t\"flag-ls\",\n\t\t\t\"flag-lt\",\n\t\t\t\"flag-lu\",\n\t\t\t\"flag-lv\",\n\t\t\t\"flag-ly\",\n\t\t\t\"flag-ma\",\n\t\t\t\"flag-mc\",\n\t\t\t\"flag-md\",\n\t\t\t\"flag-me\",\n\t\t\t\"flag-mf\",\n\t\t\t\"flag-mg\",\n\t\t\t\"flag-mh\",\n\t\t\t\"flag-mk\",\n\t\t\t\"flag-ml\",\n\t\t\t\"flag-mm\",\n\t\t\t\"flag-mn\",\n\t\t\t\"flag-mo\",\n\t\t\t\"flag-mp\",\n\t\t\t\"flag-mq\",\n\t\t\t\"flag-mr\",\n\t\t\t\"flag-ms\",\n\t\t\t\"flag-mt\",\n\t\t\t\"flag-mu\",\n\t\t\t\"flag-mv\",\n\t\t\t\"flag-mw\",\n\t\t\t\"flag-mx\",\n\t\t\t\"flag-my\",\n\t\t\t\"flag-mz\",\n\t\t\t\"flag-na\",\n\t\t\t\"flag-nc\",\n\t\t\t\"flag-ne\",\n\t\t\t\"flag-nf\",\n\t\t\t\"flag-ng\",\n\t\t\t\"flag-ni\",\n\t\t\t\"flag-nl\",\n\t\t\t\"flag-no\",\n\t\t\t\"flag-np\",\n\t\t\t\"flag-nr\",\n\t\t\t\"flag-nu\",\n\t\t\t\"flag-nz\",\n\t\t\t\"flag-om\",\n\t\t\t\"flag-pa\",\n\t\t\t\"flag-pe\",\n\t\t\t\"flag-pf\",\n\t\t\t\"flag-pg\",\n\t\t\t\"flag-ph\",\n\t\t\t\"flag-pk\",\n\t\t\t\"flag-pl\",\n\t\t\t\"flag-pm\",\n\t\t\t\"flag-pn\",\n\t\t\t\"flag-pr\",\n\t\t\t\"flag-ps\",\n\t\t\t\"flag-pt\",\n\t\t\t\"flag-pw\",\n\t\t\t\"flag-py\",\n\t\t\t\"flag-qa\",\n\t\t\t\"flag-re\",\n\t\t\t\"flag-ro\",\n\t\t\t\"flag-rs\",\n\t\t\t\"flag-rw\",\n\t\t\t\"flag-sa\",\n\t\t\t\"flag-sb\",\n\t\t\t\"flag-sc\",\n\t\t\t\"flag-scotland\",\n\t\t\t\"flag-sd\",\n\t\t\t\"flag-se\",\n\t\t\t\"flag-sg\",\n\t\t\t\"flag-sh\",\n\t\t\t\"flag-si\",\n\t\t\t\"flag-sj\",\n\t\t\t\"flag-sk\",\n\t\t\t\"flag-sl\",\n\t\t\t\"flag-sm\",\n\t\t\t\"flag-sn\",\n\t\t\t\"flag-so\",\n\t\t\t\"flag-sr\",\n\t\t\t\"flag-ss\",\n\t\t\t\"flag-st\",\n\t\t\t\"flag-sv\",\n\t\t\t\"flag-sx\",\n\t\t\t\"flag-sy\",\n\t\t\t\"flag-sz\",\n\t\t\t\"flag-ta\",\n\t\t\t\"flag-tc\",\n\t\t\t\"flag-td\",\n\t\t\t\"flag-tf\",\n\t\t\t\"flag-tg\",\n\t\t\t\"flag-th\",\n\t\t\t\"flag-tj\",\n\t\t\t\"flag-tk\",\n\t\t\t\"flag-tl\",\n\t\t\t\"flag-tm\",\n\t\t\t\"flag-tn\",\n\t\t\t\"flag-to\",\n\t\t\t\"flag-tr\",\n\t\t\t\"flag-tt\",\n\t\t\t\"flag-tv\",\n\t\t\t\"flag-tw\",\n\t\t\t\"flag-tz\",\n\t\t\t\"flag-ua\",\n\t\t\t\"flag-ug\",\n\t\t\t\"flag-um\",\n\t\t\t\"flag-uy\",\n\t\t\t\"flag-uz\",\n\t\t\t\"flag-va\",\n\t\t\t\"flag-vc\",\n\t\t\t\"flag-ve\",\n\t\t\t\"flag-vg\",\n\t\t\t\"flag-vi\",\n\t\t\t\"flag-vn\",\n\t\t\t\"flag-vu\",\n\t\t\t\"flag-wales\",\n\t\t\t\"flag-wf\",\n\t\t\t\"flag-ws\",\n\t\t\t\"flag-xk\",\n\t\t\t\"flag-ye\",\n\t\t\t\"flag-yt\",\n\t\t\t\"flag-za\",\n\t\t\t\"flag-zm\",\n\t\t\t\"flag-zw\",\n\t\t\t\"fr\",\n\t\t\t\"gb\",\n\t\t\t\"it\",\n\t\t\t\"jp\",\n\t\t\t\"kr\",\n\t\t\t\"rainbow-flag\",\n\t\t\t\"ru\",\n\t\t\t\"triangular_flag_on_post\",\n\t\t\t\"us\",\n\t\t\t\"waving_black_flag\",\n\t\t\t\"waving_white_flag\"\n\t\t]\n\t}\n];\nvar emojis = {\n\t\"100\": {\n\t\ta: \"Hundred Points Symbol\",\n\t\tb: \"1F4AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"score\",\n\t\t\t\"perfect\",\n\t\t\t\"numbers\",\n\t\t\t\"century\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\",\n\t\t\t\"pass\",\n\t\t\t\"hundred\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t26\n\t\t]\n\t},\n\t\"1234\": {\n\t\ta: \"Input Symbol for Numbers\",\n\t\tb: \"1F522\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t36\n\t\t]\n\t},\n\tmonkey_face: {\n\t\ta: \"Monkey Face\",\n\t\tb: \"1F435\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t31\n\t\t],\n\t\tl: [\n\t\t\t\":o)\"\n\t\t]\n\t},\n\tgrinning: {\n\t\ta: \"Grinning Face\",\n\t\tb: \"1F600\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\":D\",\n\t\t\t\"grin\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t24\n\t\t],\n\t\tm: \":D\"\n\t},\n\tearth_africa: {\n\t\ta: \"Earth Globe Europe-Africa\",\n\t\tb: \"1F30D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t5\n\t\t]\n\t},\n\tcheckered_flag: {\n\t\ta: \"Chequered Flag\",\n\t\tb: \"1F3C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"contest\",\n\t\t\t\"finishline\",\n\t\t\t\"race\",\n\t\t\t\"gokart\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t27\n\t\t]\n\t},\n\tmute: {\n\t\ta: \"Speaker with Cancellation Stroke\",\n\t\tb: \"1F507\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"silence\",\n\t\t\t\"quiet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t9\n\t\t]\n\t},\n\tjack_o_lantern: {\n\t\ta: \"Jack-O-Lantern\",\n\t\tb: \"1F383\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"halloween\",\n\t\t\t\"light\",\n\t\t\t\"pumpkin\",\n\t\t\t\"creepy\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t17\n\t\t]\n\t},\n\tatm: {\n\t\ta: \"Automated Teller Machine\",\n\t\tb: \"1F3E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"cash\",\n\t\t\t\"blue-square\",\n\t\t\t\"payment\",\n\t\t\t\"bank\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t4\n\t\t]\n\t},\n\tgrapes: {\n\t\ta: \"Grapes\",\n\t\tb: \"1F347\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"wine\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t9\n\t\t]\n\t},\n\tearth_americas: {\n\t\ta: \"Earth Globe Americas\",\n\t\tb: \"1F30E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"USA\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t6\n\t\t]\n\t},\n\tgrin: {\n\t\ta: \"Grinning Face with Smiling Eyes\",\n\t\tb: \"1F601\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"smile\",\n\t\t\t\"joy\",\n\t\t\t\"kawaii\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t25\n\t\t]\n\t},\n\tmelon: {\n\t\ta: \"Melon\",\n\t\tb: \"1F348\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t10\n\t\t]\n\t},\n\ttriangular_flag_on_post: {\n\t\ta: \"Triangular Flag on Post\",\n\t\tb: \"1F6A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mark\",\n\t\t\t\"milestone\",\n\t\t\t\"place\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t14\n\t\t]\n\t},\n\tmonkey: {\n\t\ta: \"Monkey\",\n\t\tb: \"1F412\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"banana\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t48\n\t\t]\n\t},\n\tchristmas_tree: {\n\t\ta: \"Christmas Tree\",\n\t\tb: \"1F384\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"vacation\",\n\t\t\t\"december\",\n\t\t\t\"xmas\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t18\n\t\t]\n\t},\n\tput_litter_in_its_place: {\n\t\ta: \"Put Litter in Its Place Symbol\",\n\t\tb: \"1F6AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"sign\",\n\t\t\t\"human\",\n\t\t\t\"info\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t19\n\t\t]\n\t},\n\tspeaker: {\n\t\ta: \"Speaker\",\n\t\tb: \"1F508\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"silence\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t10\n\t\t]\n\t},\n\tearth_asia: {\n\t\ta: \"Earth Globe Asia-Australia\",\n\t\tb: \"1F30F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"east\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t7\n\t\t]\n\t},\n\tcrossed_flags: {\n\t\ta: \"Crossed Flags\",\n\t\tb: \"1F38C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"border\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t31\n\t\t]\n\t},\n\tjoy: {\n\t\ta: \"Face with Tears of Joy\",\n\t\tb: \"1F602\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cry\",\n\t\t\t\"tears\",\n\t\t\t\"weep\",\n\t\t\t\"happy\",\n\t\t\t\"happytears\",\n\t\t\t\"haha\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t26\n\t\t]\n\t},\n\tsound: {\n\t\ta: \"Speaker with One Sound Wave\",\n\t\tb: \"1F509\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"speaker\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t11\n\t\t]\n\t},\n\twatermelon: {\n\t\ta: \"Watermelon\",\n\t\tb: \"1F349\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"picnic\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t11\n\t\t]\n\t},\n\tgorilla: {\n\t\ta: \"Gorilla\",\n\t\tb: \"1F98D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t37\n\t\t],\n\t\to: 9\n\t},\n\tfireworks: {\n\t\ta: \"Fireworks\",\n\t\tb: \"1F386\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"festival\",\n\t\t\t\"carnival\",\n\t\t\t\"congratulations\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t25\n\t\t]\n\t},\n\tpotable_water: {\n\t\ta: \"Potable Water Symbol\",\n\t\tb: \"1F6B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"liquid\",\n\t\t\t\"restroom\",\n\t\t\t\"cleaning\",\n\t\t\t\"faucet\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t21\n\t\t]\n\t},\n\twheelchair: {\n\t\ta: \"Wheelchair Symbol\",\n\t\tb: \"267F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"disabled\",\n\t\t\t\"a11y\",\n\t\t\t\"accessibility\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t10\n\t\t],\n\t\to: 4\n\t},\n\trolling_on_the_floor_laughing: {\n\t\ta: \"Rolling on the Floor Laughing\",\n\t\tb: \"1F923\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t26\n\t\t],\n\t\to: 9\n\t},\n\tloud_sound: {\n\t\ta: \"Speaker with Three Sound Waves\",\n\t\tb: \"1F50A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"noise\",\n\t\t\t\"noisy\",\n\t\t\t\"speaker\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t12\n\t\t]\n\t},\n\twaving_black_flag: {\n\t\ta: \"Waving Black Flag\",\n\t\tb: \"1F3F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t19\n\t\t],\n\t\to: 7\n\t},\n\ttangerine: {\n\t\ta: \"Tangerine\",\n\t\tb: \"1F34A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"orange\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t12\n\t\t]\n\t},\n\tdog: {\n\t\ta: \"Dog Face\",\n\t\tb: \"1F436\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"friend\",\n\t\t\t\"nature\",\n\t\t\t\"woof\",\n\t\t\t\"puppy\",\n\t\t\t\"pet\",\n\t\t\t\"faithful\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t32\n\t\t]\n\t},\n\tsparkler: {\n\t\ta: \"Firework Sparkler\",\n\t\tb: \"1F387\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"night\",\n\t\t\t\"shine\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t26\n\t\t]\n\t},\n\tglobe_with_meridians: {\n\t\ta: \"Globe with Meridians\",\n\t\tb: \"1F310\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"earth\",\n\t\t\t\"international\",\n\t\t\t\"world\",\n\t\t\t\"internet\",\n\t\t\t\"interweb\",\n\t\t\t\"i18n\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t8\n\t\t]\n\t},\n\tsmiley: {\n\t\ta: \"Smiling Face with Open Mouth\",\n\t\tb: \"1F603\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"haha\",\n\t\t\t\":D\",\n\t\t\t\":)\",\n\t\t\t\"smile\",\n\t\t\t\"funny\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t27\n\t\t],\n\t\tl: [\n\t\t\t\"=)\",\n\t\t\t\"=-)\"\n\t\t],\n\t\tm: \":)\"\n\t},\n\tloudspeaker: {\n\t\ta: \"Public Address Loudspeaker\",\n\t\tb: \"1F4E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"sound\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t25\n\t\t]\n\t},\n\tsparkles: {\n\t\ta: \"Sparkles\",\n\t\tb: \"2728\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"shine\",\n\t\t\t\"shiny\",\n\t\t\t\"cool\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t48\n\t\t]\n\t},\n\tdog2: {\n\t\ta: \"Dog\",\n\t\tb: \"1F415\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"friend\",\n\t\t\t\"doge\",\n\t\t\t\"pet\",\n\t\t\t\"faithful\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t51\n\t\t]\n\t},\n\twaving_white_flag: {\n\t\ta: \"Waving White Flag\",\n\t\tb: \"1F3F3-FE0F\",\n\t\tc: \"1F3F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tworld_map: {\n\t\ta: \"World Map\",\n\t\tb: \"1F5FA-FE0F\",\n\t\tc: \"1F5FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"location\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tlemon: {\n\t\ta: \"Lemon\",\n\t\tb: \"1F34B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t13\n\t\t]\n\t},\n\tmens: {\n\t\ta: \"Mens Symbol\",\n\t\tb: \"1F6B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"toilet\",\n\t\t\t\"restroom\",\n\t\t\t\"wc\",\n\t\t\t\"blue-square\",\n\t\t\t\"gender\",\n\t\t\t\"male\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t29\n\t\t]\n\t},\n\twomens: {\n\t\ta: \"Womens Symbol\",\n\t\tb: \"1F6BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"toilet\",\n\t\t\t\"loo\",\n\t\t\t\"restroom\",\n\t\t\t\"gender\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t30\n\t\t]\n\t},\n\t\"rainbow-flag\": {\n\t\ta: \"Rainbow Flag\",\n\t\tb: \"1F3F3-FE0F-200D-1F308\",\n\t\tc: \"1F3F3-200D-1F308\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t12,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\tsmile: {\n\t\ta: \"Smiling Face with Open Mouth and Smiling Eyes\",\n\t\tb: \"1F604\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"funny\",\n\t\t\t\"haha\",\n\t\t\t\"laugh\",\n\t\t\t\"like\",\n\t\t\t\":D\",\n\t\t\t\":)\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t28\n\t\t],\n\t\tl: [\n\t\t\t\"C:\",\n\t\t\t\"c:\",\n\t\t\t\":D\",\n\t\t\t\":-D\"\n\t\t],\n\t\tm: \":)\"\n\t},\n\tbanana: {\n\t\ta: \"Banana\",\n\t\tb: \"1F34C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"monkey\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t14\n\t\t]\n\t},\n\tmega: {\n\t\ta: \"Cheering Megaphone\",\n\t\tb: \"1F4E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"speaker\",\n\t\t\t\"volume\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t26\n\t\t]\n\t},\n\tjapan: {\n\t\ta: \"Silhouette of Japan\",\n\t\tb: \"1F5FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"japanese\",\n\t\t\t\"asia\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t22\n\t\t]\n\t},\n\tpoodle: {\n\t\ta: \"Poodle\",\n\t\tb: \"1F429\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dog\",\n\t\t\t\"animal\",\n\t\t\t\"101\",\n\t\t\t\"nature\",\n\t\t\t\"pet\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t19\n\t\t]\n\t},\n\tballoon: {\n\t\ta: \"Balloon\",\n\t\tb: \"1F388\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"party\",\n\t\t\t\"celebration\",\n\t\t\t\"birthday\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-ac\": {\n\t\ta: \"Ascension Island Flag\",\n\t\tb: \"1F1E6-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t31\n\t\t]\n\t},\n\tsweat_smile: {\n\t\ta: \"Smiling Face with Open Mouth and Cold Sweat\",\n\t\tb: \"1F605\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hot\",\n\t\t\t\"happy\",\n\t\t\t\"laugh\",\n\t\t\t\"sweat\",\n\t\t\t\"smile\",\n\t\t\t\"relief\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t29\n\t\t]\n\t},\n\tpineapple: {\n\t\ta: \"Pineapple\",\n\t\tb: \"1F34D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t15\n\t\t]\n\t},\n\trestroom: {\n\t\ta: \"Restroom\",\n\t\tb: \"1F6BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"toilet\",\n\t\t\t\"refresh\",\n\t\t\t\"wc\",\n\t\t\t\"gender\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t31\n\t\t]\n\t},\n\tpostal_horn: {\n\t\ta: \"Postal Horn\",\n\t\tb: \"1F4EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"instrument\",\n\t\t\t\"music\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t38\n\t\t]\n\t},\n\twolf: {\n\t\ta: \"Wolf Face\",\n\t\tb: \"1F43A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wild\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t36\n\t\t]\n\t},\n\ttada: {\n\t\ta: \"Party Popper\",\n\t\tb: \"1F389\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"party\",\n\t\t\t\"congratulations\",\n\t\t\t\"birthday\",\n\t\t\t\"magic\",\n\t\t\t\"circus\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t28\n\t\t]\n\t},\n\tsnow_capped_mountain: {\n\t\ta: \"Snow Capped Mountain\",\n\t\tb: \"1F3D4-FE0F\",\n\t\tc: \"1F3D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t37\n\t\t],\n\t\to: 7\n\t},\n\tlaughing: {\n\t\ta: \"Smiling Face with Open Mouth and Tightly-Closed Eyes\",\n\t\tb: \"1F606\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"lol\",\n\t\t\t\"satisfied\",\n\t\t\t\"haha\",\n\t\t\t\"face\",\n\t\t\t\"glad\",\n\t\t\t\"XD\",\n\t\t\t\"laugh\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t30\n\t\t],\n\t\tl: [\n\t\t\t\":>\",\n\t\t\t\":->\"\n\t\t],\n\t\tn: [\n\t\t\t\"satisfied\"\n\t\t]\n\t},\n\tapple: {\n\t\ta: \"Red Apple\",\n\t\tb: \"1F34E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"mac\",\n\t\t\t\"school\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-ad\": {\n\t\ta: \"Andorra Flag\",\n\t\tb: \"1F1E6-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t32\n\t\t]\n\t},\n\tfox_face: {\n\t\ta: \"Fox Face\",\n\t\tb: \"1F98A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t34\n\t\t],\n\t\to: 9\n\t},\n\tconfetti_ball: {\n\t\ta: \"Confetti Ball\",\n\t\tb: \"1F38A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"party\",\n\t\t\t\"birthday\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t29\n\t\t]\n\t},\n\tbell: {\n\t\ta: \"Bell\",\n\t\tb: \"1F514\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"notification\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\",\n\t\t\t\"chime\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t22\n\t\t]\n\t},\n\tmountain: {\n\t\ta: \"Mountain\",\n\t\tb: \"26F0-FE0F\",\n\t\tc: \"26F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"nature\",\n\t\t\t\"environment\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t38\n\t\t],\n\t\to: 5\n\t},\n\tbaby_symbol: {\n\t\ta: \"Baby Symbol\",\n\t\tb: \"1F6BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"child\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t32\n\t\t]\n\t},\n\twc: {\n\t\ta: \"Water Closet\",\n\t\tb: \"1F6BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"toilet\",\n\t\t\t\"restroom\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t34\n\t\t]\n\t},\n\twink: {\n\t\ta: \"Winking Face\",\n\t\tb: \"1F609\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"mischievous\",\n\t\t\t\"secret\",\n\t\t\t\";)\",\n\t\t\t\"smile\",\n\t\t\t\"eye\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t33\n\t\t],\n\t\tl: [\n\t\t\t\";)\",\n\t\t\t\";-)\"\n\t\t],\n\t\tm: \";)\"\n\t},\n\tno_bell: {\n\t\ta: \"Bell with Cancellation Stroke\",\n\t\tb: \"1F515\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"mute\",\n\t\t\t\"quiet\",\n\t\t\t\"silent\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t23\n\t\t]\n\t},\n\tgreen_apple: {\n\t\ta: \"Green Apple\",\n\t\tb: \"1F34F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t17\n\t\t]\n\t},\n\ttanabata_tree: {\n\t\ta: \"Tanabata Tree\",\n\t\tb: \"1F38B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"branch\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-ae\": {\n\t\ta: \"United Arab Emirates Flag\",\n\t\tb: \"1F1E6-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t33\n\t\t]\n\t},\n\tvolcano: {\n\t\ta: \"Volcano\",\n\t\tb: \"1F30B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"nature\",\n\t\t\t\"disaster\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t3\n\t\t]\n\t},\n\tcat: {\n\t\ta: \"Cat Face\",\n\t\tb: \"1F431\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"meow\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"kitten\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-af\": {\n\t\ta: \"Afghanistan Flag\",\n\t\tb: \"1F1E6-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t34\n\t\t]\n\t},\n\tmusical_score: {\n\t\ta: \"Musical Score\",\n\t\tb: \"1F3BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"treble\",\n\t\t\t\"clef\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t22\n\t\t]\n\t},\n\tblush: {\n\t\ta: \"Smiling Face with Smiling Eyes\",\n\t\tb: \"1F60A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"happy\",\n\t\t\t\"flushed\",\n\t\t\t\"crush\",\n\t\t\t\"embarrassed\",\n\t\t\t\"shy\",\n\t\t\t\"joy\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t34\n\t\t],\n\t\tm: \":)\"\n\t},\n\tpear: {\n\t\ta: \"Pear\",\n\t\tb: \"1F350\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t18\n\t\t]\n\t},\n\tbamboo: {\n\t\ta: \"Pine Decoration\",\n\t\tb: \"1F38D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"vegetable\",\n\t\t\t\"panda\",\n\t\t\t\"pine_decoration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t32\n\t\t]\n\t},\n\tpassport_control: {\n\t\ta: \"Passport Control\",\n\t\tb: \"1F6C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"custom\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t43\n\t\t]\n\t},\n\tmount_fuji: {\n\t\ta: \"Mount Fuji\",\n\t\tb: \"1F5FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"mountain\",\n\t\t\t\"nature\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t19\n\t\t]\n\t},\n\tcat2: {\n\t\ta: \"Cat\",\n\t\tb: \"1F408\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"meow\",\n\t\t\t\"pet\",\n\t\t\t\"cats\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t38\n\t\t]\n\t},\n\tmusical_note: {\n\t\ta: \"Musical Note\",\n\t\tb: \"1F3B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"score\",\n\t\t\t\"tone\",\n\t\t\t\"sound\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t15\n\t\t]\n\t},\n\tdolls: {\n\t\ta: \"Japanese Dolls\",\n\t\tb: \"1F38E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"toy\",\n\t\t\t\"kimono\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t33\n\t\t]\n\t},\n\tlion_face: {\n\t\ta: \"Lion Face\",\n\t\tb: \"1F981\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t25\n\t\t],\n\t\to: 8\n\t},\n\tcamping: {\n\t\ta: \"Camping\",\n\t\tb: \"1F3D5-FE0F\",\n\t\tc: \"1F3D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"outdoors\",\n\t\t\t\"tent\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t38\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ag\": {\n\t\ta: \"Antigua & Barbuda Flag\",\n\t\tb: \"1F1E6-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t35\n\t\t]\n\t},\n\tcustoms: {\n\t\ta: \"Customs\",\n\t\tb: \"1F6C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"passport\",\n\t\t\t\"border\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t44\n\t\t]\n\t},\n\tyum: {\n\t\ta: \"Face Savouring Delicious Food\",\n\t\tb: \"1F60B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"tongue\",\n\t\t\t\"smile\",\n\t\t\t\"face\",\n\t\t\t\"silly\",\n\t\t\t\"yummy\",\n\t\t\t\"nom\",\n\t\t\t\"delicious\",\n\t\t\t\"savouring\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t35\n\t\t]\n\t},\n\tpeach: {\n\t\ta: \"Peach\",\n\t\tb: \"1F351\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t19\n\t\t]\n\t},\n\ttiger: {\n\t\ta: \"Tiger Face\",\n\t\tb: \"1F42F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cat\",\n\t\t\t\"danger\",\n\t\t\t\"wild\",\n\t\t\t\"nature\",\n\t\t\t\"roar\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t25\n\t\t]\n\t},\n\tnotes: {\n\t\ta: \"Multiple Musical Notes\",\n\t\tb: \"1F3B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"score\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t16\n\t\t]\n\t},\n\tflags: {\n\t\ta: \"Carp Streamer\",\n\t\tb: \"1F38F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fish\",\n\t\t\t\"japanese\",\n\t\t\t\"koinobori\",\n\t\t\t\"carp\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t34\n\t\t]\n\t},\n\tbeach_with_umbrella: {\n\t\ta: \"Beach with Umbrella\",\n\t\tb: \"1F3D6-FE0F\",\n\t\tc: \"1F3D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t39\n\t\t],\n\t\to: 7\n\t},\n\tcherries: {\n\t\ta: \"Cherries\",\n\t\tb: \"1F352\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fruit\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-ai\": {\n\t\ta: \"Anguilla Flag\",\n\t\tb: \"1F1E6-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t36\n\t\t]\n\t},\n\tbaggage_claim: {\n\t\ta: \"Baggage Claim\",\n\t\tb: \"1F6C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"airport\",\n\t\t\t\"transport\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t45\n\t\t]\n\t},\n\tsunglasses: {\n\t\ta: \"Smiling Face with Sunglasses\",\n\t\tb: \"1F60E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cool\",\n\t\t\t\"smile\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"sunglass\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t38\n\t\t],\n\t\tl: [\n\t\t\t\"8)\"\n\t\t]\n\t},\n\tleft_luggage: {\n\t\ta: \"Left Luggage\",\n\t\tb: \"1F6C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t46\n\t\t]\n\t},\n\twind_chime: {\n\t\ta: \"Wind Chime\",\n\t\tb: \"1F390\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"ding\",\n\t\t\t\"spring\",\n\t\t\t\"bell\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t35\n\t\t]\n\t},\n\tstrawberry: {\n\t\ta: \"Strawberry\",\n\t\tb: \"1F353\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t21\n\t\t]\n\t},\n\tdesert: {\n\t\ta: \"Desert\",\n\t\tb: \"1F3DC-FE0F\",\n\t\tc: \"1F3DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"warm\",\n\t\t\t\"saharah\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\tstudio_microphone: {\n\t\ta: \"Studio Microphone\",\n\t\tb: \"1F399-FE0F\",\n\t\tc: \"1F399\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sing\",\n\t\t\t\"recording\",\n\t\t\t\"artist\",\n\t\t\t\"talkshow\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-al\": {\n\t\ta: \"Albania Flag\",\n\t\tb: \"1F1E6-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t37\n\t\t]\n\t},\n\ttiger2: {\n\t\ta: \"Tiger\",\n\t\tb: \"1F405\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"roar\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t35\n\t\t]\n\t},\n\theart_eyes: {\n\t\ta: \"Smiling Face with Heart-Shaped Eyes\",\n\t\tb: \"1F60D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"crush\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t37\n\t\t]\n\t},\n\tdesert_island: {\n\t\ta: \"Desert Island\",\n\t\tb: \"1F3DD-FE0F\",\n\t\tc: \"1F3DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"tropical\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t46\n\t\t],\n\t\to: 7\n\t},\n\tkiwifruit: {\n\t\ta: \"Kiwifruit\",\n\t\tb: \"1F95D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t9\n\t\t],\n\t\to: 9\n\t},\n\trice_scene: {\n\t\ta: \"Moon Viewing Ceremony\",\n\t\tb: \"1F391\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"japan\",\n\t\t\t\"asia\",\n\t\t\t\"tsukimi\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t36\n\t\t]\n\t},\n\tkissing_heart: {\n\t\ta: \"Face Throwing a Kiss\",\n\t\tb: \"1F618\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t48\n\t\t],\n\t\tl: [\n\t\t\t\":*\",\n\t\t\t\":-*\"\n\t\t]\n\t},\n\twarning: {\n\t\ta: \"Warning Sign\",\n\t\tb: \"26A0-FE0F\",\n\t\tc: \"26A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"exclamation\",\n\t\t\t\"wip\",\n\t\t\t\"alert\",\n\t\t\t\"error\",\n\t\t\t\"problem\",\n\t\t\t\"issue\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t20\n\t\t],\n\t\to: 4\n\t},\n\t\"flag-am\": {\n\t\ta: \"Armenia Flag\",\n\t\tb: \"1F1E6-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t38\n\t\t]\n\t},\n\tleopard: {\n\t\ta: \"Leopard\",\n\t\tb: \"1F406\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t36\n\t\t]\n\t},\n\tlevel_slider: {\n\t\ta: \"Level Slider\",\n\t\tb: \"1F39A-FE0F\",\n\t\tc: \"1F39A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"scale\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\thorse: {\n\t\ta: \"Horse Face\",\n\t\tb: \"1F434\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"brown\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t30\n\t\t]\n\t},\n\tchildren_crossing: {\n\t\ta: \"Children Crossing\",\n\t\tb: \"1F6B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"school\",\n\t\t\t\"warning\",\n\t\t\t\"danger\",\n\t\t\t\"sign\",\n\t\t\t\"driving\",\n\t\t\t\"yellow-diamond\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t28\n\t\t]\n\t},\n\tribbon: {\n\t\ta: \"Ribbon\",\n\t\tb: \"1F380\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"decoration\",\n\t\t\t\"pink\",\n\t\t\t\"girl\",\n\t\t\t\"bowtie\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t14\n\t\t]\n\t},\n\tnational_park: {\n\t\ta: \"National Park\",\n\t\tb: \"1F3DE-FE0F\",\n\t\tc: \"1F3DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"environment\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\tcontrol_knobs: {\n\t\ta: \"Control Knobs\",\n\t\tb: \"1F39B-FE0F\",\n\t\tc: \"1F39B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tkissing: {\n\t\ta: \"Kissing Face\",\n\t\tb: \"1F617\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"face\",\n\t\t\t\"3\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t47\n\t\t]\n\t},\n\ttomato: {\n\t\ta: \"Tomato\",\n\t\tb: \"1F345\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-ao\": {\n\t\ta: \"Angola Flag\",\n\t\tb: \"1F1E6-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t39\n\t\t]\n\t},\n\tstadium: {\n\t\ta: \"Stadium\",\n\t\tb: \"1F3DF-FE0F\",\n\t\tc: \"1F3DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"place\",\n\t\t\t\"sports\",\n\t\t\t\"concert\",\n\t\t\t\"venue\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t48\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-aq\": {\n\t\ta: \"Antarctica Flag\",\n\t\tb: \"1F1E6-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t40\n\t\t]\n\t},\n\tgift: {\n\t\ta: \"Wrapped Present\",\n\t\tb: \"1F381\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"present\",\n\t\t\t\"birthday\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t15\n\t\t]\n\t},\n\tno_entry: {\n\t\ta: \"No Entry\",\n\t\tb: \"26D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"limit\",\n\t\t\t\"security\",\n\t\t\t\"privacy\",\n\t\t\t\"bad\",\n\t\t\t\"denied\",\n\t\t\t\"stop\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t35\n\t\t],\n\t\to: 5\n\t},\n\tkissing_smiling_eyes: {\n\t\ta: \"Kissing Face with Smiling Eyes\",\n\t\tb: \"1F619\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t49\n\t\t]\n\t},\n\tcoconut: {\n\t\ta: \"Coconut\",\n\t\tb: \"1F965\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\tracehorse: {\n\t\ta: \"Horse\",\n\t\tb: \"1F40E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"gamble\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t44\n\t\t]\n\t},\n\tmicrophone: {\n\t\ta: \"Microphone\",\n\t\tb: \"1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"music\",\n\t\t\t\"PA\",\n\t\t\t\"sing\",\n\t\t\t\"talkshow\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t50\n\t\t]\n\t},\n\tclassical_building: {\n\t\ta: \"Classical Building\",\n\t\tb: \"1F3DB-FE0F\",\n\t\tc: \"1F3DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"art\",\n\t\t\t\"culture\",\n\t\t\t\"history\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tno_entry_sign: {\n\t\ta: \"No Entry Sign\",\n\t\tb: \"1F6AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"forbid\",\n\t\t\t\"stop\",\n\t\t\t\"limit\",\n\t\t\t\"denied\",\n\t\t\t\"disallow\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t16\n\t\t]\n\t},\n\treminder_ribbon: {\n\t\ta: \"Reminder Ribbon\",\n\t\tb: \"1F397-FE0F\",\n\t\tc: \"1F397\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"cause\",\n\t\t\t\"support\",\n\t\t\t\"awareness\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t40\n\t\t],\n\t\to: 7\n\t},\n\tkissing_closed_eyes: {\n\t\ta: \"Kissing Face with Closed Eyes\",\n\t\tb: \"1F61A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t50\n\t\t]\n\t},\n\tunicorn_face: {\n\t\ta: \"Unicorn Face\",\n\t\tb: \"1F984\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t28\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-ar\": {\n\t\ta: \"Argentina Flag\",\n\t\tb: \"1F1E6-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t41\n\t\t]\n\t},\n\theadphones: {\n\t\ta: \"Headphone\",\n\t\tb: \"1F3A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"score\",\n\t\t\t\"gadgets\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t1\n\t\t]\n\t},\n\tavocado: {\n\t\ta: \"Avocado\",\n\t\tb: \"1F951\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t49\n\t\t],\n\t\to: 9\n\t},\n\trelaxed: {\n\t\ta: \"White Smiling Face\",\n\t\tb: \"263A-FE0F\",\n\t\tc: \"263A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"blush\",\n\t\t\t\"massage\",\n\t\t\t\"happiness\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t41\n\t\t],\n\t\to: 1\n\t},\n\tzebra_face: {\n\t\ta: \"Zebra Face\",\n\t\tb: \"1F993\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t43\n\t\t],\n\t\to: 10\n\t},\n\teggplant: {\n\t\ta: \"Aubergine\",\n\t\tb: \"1F346\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"food\",\n\t\t\t\"aubergine\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t8\n\t\t]\n\t},\n\tradio: {\n\t\ta: \"Radio\",\n\t\tb: \"1F4FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"music\",\n\t\t\t\"podcast\",\n\t\t\t\"program\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t50\n\t\t]\n\t},\n\tbuilding_construction: {\n\t\ta: \"Building Construction\",\n\t\tb: \"1F3D7-FE0F\",\n\t\tc: \"1F3D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"wip\",\n\t\t\t\"working\",\n\t\t\t\"progress\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t40\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-as\": {\n\t\ta: \"American Samoa Flag\",\n\t\tb: \"1F1E6-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t42\n\t\t]\n\t},\n\tadmission_tickets: {\n\t\ta: \"Admission Tickets\",\n\t\tb: \"1F39F-FE0F\",\n\t\tc: \"1F39F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\tno_bicycles: {\n\t\ta: \"No Bicycles\",\n\t\tb: \"1F6B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cyclist\",\n\t\t\t\"prohibited\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t24\n\t\t]\n\t},\n\tno_smoking: {\n\t\ta: \"No Smoking Symbol\",\n\t\tb: \"1F6AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cigarette\",\n\t\t\t\"blue-square\",\n\t\t\t\"smell\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t18\n\t\t]\n\t},\n\tslightly_smiling_face: {\n\t\ta: \"Slightly Smiling Face\",\n\t\tb: \"1F642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t38\n\t\t],\n\t\tl: [\n\t\t\t\":)\",\n\t\t\t\"(:\",\n\t\t\t\":-)\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-at\": {\n\t\ta: \"Austria Flag\",\n\t\tb: \"1F1E6-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t43\n\t\t]\n\t},\n\tticket: {\n\t\ta: \"Ticket\",\n\t\tb: \"1F3AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"event\",\n\t\t\t\"concert\",\n\t\t\t\"pass\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t5\n\t\t]\n\t},\n\tsaxophone: {\n\t\ta: \"Saxophone\",\n\t\tb: \"1F3B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\",\n\t\t\t\"jazz\",\n\t\t\t\"blues\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t17\n\t\t]\n\t},\n\tdeer: {\n\t\ta: \"Deer\",\n\t\tb: \"1F98C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"horns\",\n\t\t\t\"venison\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\thouse_buildings: {\n\t\ta: \"House Buildings\",\n\t\tb: \"1F3D8-FE0F\",\n\t\tc: \"1F3D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\tpotato: {\n\t\ta: \"Potato\",\n\t\tb: \"1F954\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"tuber\",\n\t\t\t\"vegatable\",\n\t\t\t\"starch\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\tguitar: {\n\t\ta: \"Guitar\",\n\t\tb: \"1F3B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t18\n\t\t]\n\t},\n\tcarrot: {\n\t\ta: \"Carrot\",\n\t\tb: \"1F955\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"food\",\n\t\t\t\"orange\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t1\n\t\t],\n\t\to: 9\n\t},\n\tcityscape: {\n\t\ta: \"Cityscape\",\n\t\tb: \"1F3D9-FE0F\",\n\t\tc: \"1F3D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"night life\",\n\t\t\t\"urban\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-au\": {\n\t\ta: \"Australia Flag\",\n\t\tb: \"1F1E6-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t44\n\t\t]\n\t},\n\tdo_not_litter: {\n\t\ta: \"Do Not Litter Symbol\",\n\t\tb: \"1F6AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"trash\",\n\t\t\t\"bin\",\n\t\t\t\"garbage\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t20\n\t\t]\n\t},\n\thugging_face: {\n\t\ta: \"Hugging Face\",\n\t\tb: \"1F917\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t31\n\t\t],\n\t\to: 8\n\t},\n\tcow: {\n\t\ta: \"Cow Face\",\n\t\tb: \"1F42E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beef\",\n\t\t\t\"ox\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"moo\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t24\n\t\t]\n\t},\n\tmedal: {\n\t\ta: \"Medal\",\n\t\tb: \"1F396-FE0F\",\n\t\tc: \"1F396\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t39\n\t\t],\n\t\to: 7\n\t},\n\tmusical_keyboard: {\n\t\ta: \"Musical Keyboard\",\n\t\tb: \"1F3B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"piano\",\n\t\t\t\"instrument\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t19\n\t\t]\n\t},\n\tcorn: {\n\t\ta: \"Ear of Maize\",\n\t\tb: \"1F33D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"vegetable\",\n\t\t\t\"plant\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t51\n\t\t]\n\t},\n\tderelict_house_building: {\n\t\ta: \"Derelict House Building\",\n\t\tb: \"1F3DA-FE0F\",\n\t\tc: \"1F3DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\t\"non-potable_water\": {\n\t\ta: \"Non-Potable Water Symbol\",\n\t\tb: \"1F6B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"faucet\",\n\t\t\t\"tap\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t22\n\t\t]\n\t},\n\ttrophy: {\n\t\ta: \"Trophy\",\n\t\tb: \"1F3C6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"win\",\n\t\t\t\"award\",\n\t\t\t\"contest\",\n\t\t\t\"place\",\n\t\t\t\"ftw\",\n\t\t\t\"ceremony\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-aw\": {\n\t\ta: \"Aruba Flag\",\n\t\tb: \"1F1E6-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t45\n\t\t]\n\t},\n\t\"star-struck\": {\n\t\ta: \"Grinning Face with Star Eyes\",\n\t\tb: \"1F929\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t49\n\t\t],\n\t\tn: [\n\t\t\t\"grinning_face_with_star_eyes\"\n\t\t],\n\t\to: 10\n\t},\n\tox: {\n\t\ta: \"Ox\",\n\t\tb: \"1F402\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cow\",\n\t\t\t\"beef\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t32\n\t\t]\n\t},\n\ttrumpet: {\n\t\ta: \"Trumpet\",\n\t\tb: \"1F3BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"brass\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t20\n\t\t]\n\t},\n\thot_pepper: {\n\t\ta: \"Hot Pepper\",\n\t\tb: \"1F336-FE0F\",\n\t\tc: \"1F336\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"spicy\",\n\t\t\t\"chilli\",\n\t\t\t\"chili\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tsports_medal: {\n\t\ta: \"Sports Medal\",\n\t\tb: \"1F3C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ax\": {\n\t\ta: \"Åland Islands Flag\",\n\t\tb: \"1F1E6-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t46\n\t\t]\n\t},\n\twater_buffalo: {\n\t\ta: \"Water Buffalo\",\n\t\tb: \"1F403\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"ox\",\n\t\t\t\"cow\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t33\n\t\t]\n\t},\n\tno_pedestrians: {\n\t\ta: \"No Pedestrians\",\n\t\tb: \"1F6B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rules\",\n\t\t\t\"crossing\",\n\t\t\t\"walking\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t27\n\t\t]\n\t},\n\tthinking_face: {\n\t\ta: \"Thinking Face\",\n\t\tb: \"1F914\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t28\n\t\t],\n\t\to: 8\n\t},\n\thouse: {\n\t\ta: \"House Building\",\n\t\tb: \"1F3E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"home\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t49\n\t\t]\n\t},\n\tno_mobile_phones: {\n\t\ta: \"No Mobile Phones\",\n\t\tb: \"1F4F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"iphone\",\n\t\t\t\"mute\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t44\n\t\t]\n\t},\n\t\"flag-az\": {\n\t\ta: \"Azerbaijan Flag\",\n\t\tb: \"1F1E6-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t47\n\t\t]\n\t},\n\tfirst_place_medal: {\n\t\ta: \"First Place Medal\",\n\t\tb: \"1F947\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t42\n\t\t],\n\t\to: 9\n\t},\n\thouse_with_garden: {\n\t\ta: \"House with Garden\",\n\t\tb: \"1F3E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"home\",\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t50\n\t\t]\n\t},\n\tviolin: {\n\t\ta: \"Violin\",\n\t\tb: \"1F3BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\",\n\t\t\t\"orchestra\",\n\t\t\t\"symphony\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t21\n\t\t]\n\t},\n\tface_with_raised_eyebrow: {\n\t\ta: \"Face with One Eyebrow Raised\",\n\t\tb: \"1F928\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t48\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_one_eyebrow_raised\"\n\t\t],\n\t\to: 10\n\t},\n\tcucumber: {\n\t\ta: \"Cucumber\",\n\t\tb: \"1F952\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"pickle\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\tcow2: {\n\t\ta: \"Cow\",\n\t\tb: \"1F404\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beef\",\n\t\t\t\"ox\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"moo\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-ba\": {\n\t\ta: \"Bosnia & Herzegovina Flag\",\n\t\tb: \"1F1E7-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t0,\n\t\t\t48\n\t\t]\n\t},\n\tpig: {\n\t\ta: \"Pig Face\",\n\t\tb: \"1F437\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"oink\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t33\n\t\t]\n\t},\n\tdrum_with_drumsticks: {\n\t\ta: \"Drum with Drumsticks\",\n\t\tb: \"1F941\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t37\n\t\t],\n\t\to: 9\n\t},\n\tunderage: {\n\t\ta: \"No One Under Eighteen Symbol\",\n\t\tb: \"1F51E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"18\",\n\t\t\t\"drink\",\n\t\t\t\"pub\",\n\t\t\t\"night\",\n\t\t\t\"minor\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t32\n\t\t]\n\t},\n\tbroccoli: {\n\t\ta: \"Broccoli\",\n\t\tb: \"1F966\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\toffice: {\n\t\ta: \"Office Building\",\n\t\tb: \"1F3E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"bureau\",\n\t\t\t\"work\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t51\n\t\t]\n\t},\n\tsecond_place_medal: {\n\t\ta: \"Second Place Medal\",\n\t\tb: \"1F948\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t43\n\t\t],\n\t\to: 9\n\t},\n\tneutral_face: {\n\t\ta: \"Neutral Face\",\n\t\tb: \"1F610\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"indifference\",\n\t\t\t\"meh\",\n\t\t\t\":|\",\n\t\t\t\"neutral\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t40\n\t\t],\n\t\tl: [\n\t\t\t\":|\",\n\t\t\t\":-|\"\n\t\t]\n\t},\n\tthird_place_medal: {\n\t\ta: \"Third Place Medal\",\n\t\tb: \"1F949\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t44\n\t\t],\n\t\to: 9\n\t},\n\tmushroom: {\n\t\ta: \"Mushroom\",\n\t\tb: \"1F344\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-bb\": {\n\t\ta: \"Barbados Flag\",\n\t\tb: \"1F1E7-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t49\n\t\t]\n\t},\n\tradioactive_sign: {\n\t\ta: \"Radioactive Sign\",\n\t\tb: \"2622-FE0F\",\n\t\tc: \"2622\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t33\n\t\t],\n\t\to: 1\n\t},\n\tpig2: {\n\t\ta: \"Pig\",\n\t\tb: \"1F416\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t0\n\t\t]\n\t},\n\texpressionless: {\n\t\ta: \"Expressionless Face\",\n\t\tb: \"1F611\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"indifferent\",\n\t\t\t\"-_-\",\n\t\t\t\"meh\",\n\t\t\t\"deadpan\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t41\n\t\t]\n\t},\n\tiphone: {\n\t\ta: \"Mobile Phone\",\n\t\tb: \"1F4F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"apple\",\n\t\t\t\"gadgets\",\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t40\n\t\t]\n\t},\n\tpost_office: {\n\t\ta: \"Japanese Post Office\",\n\t\tb: \"1F3E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"envelope\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t0\n\t\t]\n\t},\n\teuropean_post_office: {\n\t\ta: \"European Post Office\",\n\t\tb: \"1F3E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"email\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t1\n\t\t]\n\t},\n\tsoccer: {\n\t\ta: \"Soccer Ball\",\n\t\tb: \"26BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"football\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t26\n\t\t],\n\t\to: 5\n\t},\n\tboar: {\n\t\ta: \"Boar\",\n\t\tb: \"1F417\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t1\n\t\t]\n\t},\n\tpeanuts: {\n\t\ta: \"Peanuts\",\n\t\tb: \"1F95C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"nut\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t8\n\t\t],\n\t\to: 9\n\t},\n\tcalling: {\n\t\ta: \"Mobile Phone with Rightwards Arrow at Left\",\n\t\tb: \"1F4F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"iphone\",\n\t\t\t\"incoming\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t41\n\t\t]\n\t},\n\tbiohazard_sign: {\n\t\ta: \"Biohazard Sign\",\n\t\tb: \"2623-FE0F\",\n\t\tc: \"2623\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t34\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bd\": {\n\t\ta: \"Bangladesh Flag\",\n\t\tb: \"1F1E7-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t50\n\t\t]\n\t},\n\tno_mouth: {\n\t\ta: \"Face Without Mouth\",\n\t\tb: \"1F636\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hellokitty\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t26\n\t\t]\n\t},\n\tface_with_rolling_eyes: {\n\t\ta: \"Face with Rolling Eyes\",\n\t\tb: \"1F644\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t40\n\t\t],\n\t\to: 8\n\t},\n\tphone: {\n\t\ta: \"Black Telephone\",\n\t\tb: \"260E-FE0F\",\n\t\tc: \"260E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"communication\",\n\t\t\t\"dial\",\n\t\t\t\"telephone\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t21\n\t\t],\n\t\tn: [\n\t\t\t\"telephone\"\n\t\t],\n\t\to: 1\n\t},\n\tpig_nose: {\n\t\ta: \"Pig Nose\",\n\t\tb: \"1F43D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"oink\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t39\n\t\t]\n\t},\n\tchestnut: {\n\t\ta: \"Chestnut\",\n\t\tb: \"1F330\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"squirrel\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t38\n\t\t]\n\t},\n\tarrow_up: {\n\t\ta: \"Upwards Black Arrow\",\n\t\tb: \"2B06-FE0F\",\n\t\tc: \"2B06\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"continue\",\n\t\t\t\"top\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t18\n\t\t],\n\t\to: 4\n\t},\n\thospital: {\n\t\ta: \"Hospital\",\n\t\tb: \"1F3E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"health\",\n\t\t\t\"surgery\",\n\t\t\t\"doctor\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-be\": {\n\t\ta: \"Belgium Flag\",\n\t\tb: \"1F1E7-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t51\n\t\t]\n\t},\n\tbaseball: {\n\t\ta: \"Baseball\",\n\t\tb: \"26BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t27\n\t\t],\n\t\to: 5\n\t},\n\tsmirk: {\n\t\ta: \"Smirking Face\",\n\t\tb: \"1F60F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"mean\",\n\t\t\t\"prank\",\n\t\t\t\"smug\",\n\t\t\t\"sarcasm\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t39\n\t\t]\n\t},\n\tarrow_upper_right: {\n\t\ta: \"North East Arrow\",\n\t\tb: \"2197-FE0F\",\n\t\tc: \"2197\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"point\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"northeast\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bf\": {\n\t\ta: \"Burkina Faso Flag\",\n\t\tb: \"1F1E7-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\tbasketball: {\n\t\ta: \"Basketball and Hoop\",\n\t\tb: \"1F3C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"NBA\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t26\n\t\t]\n\t},\n\tram: {\n\t\ta: \"Ram\",\n\t\tb: \"1F40F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"sheep\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t45\n\t\t]\n\t},\n\tbank: {\n\t\ta: \"Bank\",\n\t\tb: \"1F3E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"cash\",\n\t\t\t\"business\",\n\t\t\t\"enterprise\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t3\n\t\t]\n\t},\n\tbread: {\n\t\ta: \"Bread\",\n\t\tb: \"1F35E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"wheat\",\n\t\t\t\"breakfast\",\n\t\t\t\"toast\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t32\n\t\t]\n\t},\n\ttelephone_receiver: {\n\t\ta: \"Telephone Receiver\",\n\t\tb: \"1F4DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"communication\",\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t21\n\t\t]\n\t},\n\tcroissant: {\n\t\ta: \"Croissant\",\n\t\tb: \"1F950\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"bread\",\n\t\t\t\"french\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t48\n\t\t],\n\t\to: 9\n\t},\n\tpager: {\n\t\ta: \"Pager\",\n\t\tb: \"1F4DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bbcall\",\n\t\t\t\"oldschool\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t22\n\t\t]\n\t},\n\tsheep: {\n\t\ta: \"Sheep\",\n\t\tb: \"1F411\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wool\",\n\t\t\t\"shipit\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t47\n\t\t]\n\t},\n\tarrow_right: {\n\t\ta: \"Black Rightwards Arrow\",\n\t\tb: \"27A1-FE0F\",\n\t\tc: \"27A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"next\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t12\n\t\t],\n\t\to: 1\n\t},\n\tpersevere: {\n\t\ta: \"Persevering Face\",\n\t\tb: \"1F623\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sick\",\n\t\t\t\"no\",\n\t\t\t\"upset\",\n\t\t\t\"oops\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-bg\": {\n\t\ta: \"Bulgaria Flag\",\n\t\tb: \"1F1E7-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\tvolleyball: {\n\t\ta: \"Volleyball\",\n\t\tb: \"1F3D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t33\n\t\t],\n\t\to: 8\n\t},\n\thotel: {\n\t\ta: \"Hotel\",\n\t\tb: \"1F3E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"accomodation\",\n\t\t\t\"checkin\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t5\n\t\t]\n\t},\n\tarrow_lower_right: {\n\t\ta: \"South East Arrow\",\n\t\tb: \"2198-FE0F\",\n\t\tc: \"2198\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"southeast\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t37\n\t\t],\n\t\to: 1\n\t},\n\tgoat: {\n\t\ta: \"Goat\",\n\t\tb: \"1F410\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-bh\": {\n\t\ta: \"Bahrain Flag\",\n\t\tb: \"1F1E7-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t2\n\t\t]\n\t},\n\tlove_hotel: {\n\t\ta: \"Love Hotel\",\n\t\tb: \"1F3E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"dating\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t6\n\t\t]\n\t},\n\tdisappointed_relieved: {\n\t\ta: \"Disappointed but Relieved Face\",\n\t\tb: \"1F625\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"phew\",\n\t\t\t\"sweat\",\n\t\t\t\"nervous\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t9\n\t\t]\n\t},\n\tbaguette_bread: {\n\t\ta: \"Baguette Bread\",\n\t\tb: \"1F956\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"bread\",\n\t\t\t\"french\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t2\n\t\t],\n\t\to: 9\n\t},\n\tfootball: {\n\t\ta: \"American Football\",\n\t\tb: \"1F3C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"NFL\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t26\n\t\t]\n\t},\n\tfax: {\n\t\ta: \"Fax Machine\",\n\t\tb: \"1F4E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"technology\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t23\n\t\t]\n\t},\n\tconvenience_store: {\n\t\ta: \"Convenience Store\",\n\t\tb: \"1F3EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"shopping\",\n\t\t\t\"groceries\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t7\n\t\t]\n\t},\n\tdromedary_camel: {\n\t\ta: \"Dromedary Camel\",\n\t\tb: \"1F42A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"hot\",\n\t\t\t\"desert\",\n\t\t\t\"hump\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t20\n\t\t]\n\t},\n\tarrow_down: {\n\t\ta: \"Downwards Black Arrow\",\n\t\tb: \"2B07-FE0F\",\n\t\tc: \"2B07\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t19\n\t\t],\n\t\to: 4\n\t},\n\tbattery: {\n\t\ta: \"Battery\",\n\t\tb: \"1F50B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"power\",\n\t\t\t\"energy\",\n\t\t\t\"sustain\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t13\n\t\t]\n\t},\n\trugby_football: {\n\t\ta: \"Rugby Football\",\n\t\tb: \"1F3C9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"team\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t27\n\t\t]\n\t},\n\tpretzel: {\n\t\ta: \"Pretzel\",\n\t\tb: \"1F968\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\topen_mouth: {\n\t\ta: \"Face with Open Mouth\",\n\t\tb: \"1F62E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"surprise\",\n\t\t\t\"impressed\",\n\t\t\t\"wow\",\n\t\t\t\"whoa\",\n\t\t\t\":O\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t18\n\t\t],\n\t\tl: [\n\t\t\t\":o\",\n\t\t\t\":-o\",\n\t\t\t\":O\",\n\t\t\t\":-O\"\n\t\t]\n\t},\n\t\"flag-bi\": {\n\t\ta: \"Burundi Flag\",\n\t\tb: \"1F1E7-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-bj\": {\n\t\ta: \"Benin Flag\",\n\t\tb: \"1F1E7-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t4\n\t\t]\n\t},\n\tpancakes: {\n\t\ta: \"Pancakes\",\n\t\tb: \"1F95E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"flapjacks\",\n\t\t\t\"hotcakes\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t10\n\t\t],\n\t\to: 9\n\t},\n\tschool: {\n\t\ta: \"School\",\n\t\tb: \"1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"student\",\n\t\t\t\"education\",\n\t\t\t\"learn\",\n\t\t\t\"teach\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t8\n\t\t]\n\t},\n\ttennis: {\n\t\ta: \"Tennis Racquet and Ball\",\n\t\tb: \"1F3BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t24\n\t\t]\n\t},\n\tzipper_mouth_face: {\n\t\ta: \"Zipper-Mouth Face\",\n\t\tb: \"1F910\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sealed\",\n\t\t\t\"zipper\",\n\t\t\t\"secret\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tcamel: {\n\t\ta: \"Bactrian Camel\",\n\t\tb: \"1F42B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"hot\",\n\t\t\t\"desert\",\n\t\t\t\"hump\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t21\n\t\t]\n\t},\n\tarrow_lower_left: {\n\t\ta: \"South West Arrow\",\n\t\tb: \"2199-FE0F\",\n\t\tc: \"2199\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"southwest\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t38\n\t\t],\n\t\to: 1\n\t},\n\telectric_plug: {\n\t\ta: \"Electric Plug\",\n\t\tb: \"1F50C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"charger\",\n\t\t\t\"power\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t14\n\t\t]\n\t},\n\tcheese_wedge: {\n\t\ta: \"Cheese Wedge\",\n\t\tb: \"1F9C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t48\n\t\t],\n\t\to: 8\n\t},\n\thushed: {\n\t\ta: \"Hushed Face\",\n\t\tb: \"1F62F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"woo\",\n\t\t\t\"shh\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t19\n\t\t]\n\t},\n\tcomputer: {\n\t\ta: \"Personal Computer\",\n\t\tb: \"1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"laptop\",\n\t\t\t\"screen\",\n\t\t\t\"display\",\n\t\t\t\"monitor\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t38\n\t\t]\n\t},\n\tgiraffe_face: {\n\t\ta: \"Giraffe Face\",\n\t\tb: \"1F992\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t42\n\t\t],\n\t\to: 10\n\t},\n\t\"8ball\": {\n\t\ta: \"Billiards\",\n\t\tb: \"1F3B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pool\",\n\t\t\t\"hobby\",\n\t\t\t\"game\",\n\t\t\t\"luck\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-bl\": {\n\t\ta: \"St. Barthélemy Flag\",\n\t\tb: \"1F1E7-1F1F1\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t5\n\t\t]\n\t},\n\tarrow_left: {\n\t\ta: \"Leftwards Black Arrow\",\n\t\tb: \"2B05-FE0F\",\n\t\tc: \"2B05\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"previous\",\n\t\t\t\"back\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t17\n\t\t],\n\t\to: 4\n\t},\n\tdepartment_store: {\n\t\ta: \"Department Store\",\n\t\tb: \"1F3EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"shopping\",\n\t\t\t\"mall\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t9\n\t\t]\n\t},\n\tmeat_on_bone: {\n\t\ta: \"Meat on Bone\",\n\t\tb: \"1F356\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"food\",\n\t\t\t\"drumstick\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t24\n\t\t]\n\t},\n\tarrow_upper_left: {\n\t\ta: \"North West Arrow\",\n\t\tb: \"2196-FE0F\",\n\t\tc: \"2196\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"point\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"northwest\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t35\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bm\": {\n\t\ta: \"Bermuda Flag\",\n\t\tb: \"1F1E7-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t6\n\t\t]\n\t},\n\tsleepy: {\n\t\ta: \"Sleepy Face\",\n\t\tb: \"1F62A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"rest\",\n\t\t\t\"nap\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t14\n\t\t]\n\t},\n\tbowling: {\n\t\ta: \"Bowling\",\n\t\tb: \"1F3B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"fun\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t13\n\t\t]\n\t},\n\tfactory: {\n\t\ta: \"Factory\",\n\t\tb: \"1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"industry\",\n\t\t\t\"pollution\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t10\n\t\t]\n\t},\n\tdesktop_computer: {\n\t\ta: \"Desktop Computer\",\n\t\tb: \"1F5A5-FE0F\",\n\t\tc: \"1F5A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"computing\",\n\t\t\t\"screen\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t51\n\t\t],\n\t\to: 7\n\t},\n\telephant: {\n\t\ta: \"Elephant\",\n\t\tb: \"1F418\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"nose\",\n\t\t\t\"th\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t2\n\t\t]\n\t},\n\trhinoceros: {\n\t\ta: \"Rhinoceros\",\n\t\tb: \"1F98F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"horn\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t39\n\t\t],\n\t\to: 9\n\t},\n\tarrow_up_down: {\n\t\ta: \"Up Down Arrow\",\n\t\tb: \"2195-FE0F\",\n\t\tc: \"2195\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"way\",\n\t\t\t\"vertical\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t34\n\t\t],\n\t\to: 1\n\t},\n\tcricket_bat_and_ball: {\n\t\ta: \"Cricket Bat and Ball\",\n\t\tb: \"1F3CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t32\n\t\t],\n\t\to: 8\n\t},\n\tprinter: {\n\t\ta: \"Printer\",\n\t\tb: \"1F5A8-FE0F\",\n\t\tc: \"1F5A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"paper\",\n\t\t\t\"ink\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\tpoultry_leg: {\n\t\ta: \"Poultry Leg\",\n\t\tb: \"1F357\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"meat\",\n\t\t\t\"drumstick\",\n\t\t\t\"bird\",\n\t\t\t\"chicken\",\n\t\t\t\"turkey\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t25\n\t\t]\n\t},\n\ttired_face: {\n\t\ta: \"Tired Face\",\n\t\tb: \"1F62B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sick\",\n\t\t\t\"whine\",\n\t\t\t\"upset\",\n\t\t\t\"frustrated\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t15\n\t\t]\n\t},\n\tjapanese_castle: {\n\t\ta: \"Japanese Castle\",\n\t\tb: \"1F3EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"building\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-bn\": {\n\t\ta: \"Brunei Flag\",\n\t\tb: \"1F1E7-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t1,\n\t\t\t7\n\t\t]\n\t},\n\tfield_hockey_stick_and_ball: {\n\t\ta: \"Field Hockey Stick and Ball\",\n\t\tb: \"1F3D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t34\n\t\t],\n\t\to: 8\n\t},\n\tsleeping: {\n\t\ta: \"Sleeping Face\",\n\t\tb: \"1F634\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"sleepy\",\n\t\t\t\"night\",\n\t\t\t\"zzz\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t24\n\t\t]\n\t},\n\tleft_right_arrow: {\n\t\ta: \"Left Right Arrow\",\n\t\tb: \"2194-FE0F\",\n\t\tc: \"2194\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"horizontal\",\n\t\t\t\"sideways\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t33\n\t\t],\n\t\to: 1\n\t},\n\tkeyboard: {\n\t\ta: \"Keyboard\",\n\t\tb: \"2328-FE0F\",\n\t\tc: \"2328\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"computer\",\n\t\t\t\"type\",\n\t\t\t\"input\",\n\t\t\t\"text\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\teuropean_castle: {\n\t\ta: \"European Castle\",\n\t\tb: \"1F3F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"royalty\",\n\t\t\t\"history\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t13\n\t\t]\n\t},\n\tmouse: {\n\t\ta: \"Mouse Face\",\n\t\tb: \"1F42D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"cheese_wedge\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-bo\": {\n\t\ta: \"Bolivia Flag\",\n\t\tb: \"1F1E7-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t8\n\t\t]\n\t},\n\tcut_of_meat: {\n\t\ta: \"Cut of Meat\",\n\t\tb: \"1F969\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t21\n\t\t],\n\t\to: 10\n\t},\n\tice_hockey_stick_and_puck: {\n\t\ta: \"Ice Hockey Stick and Puck\",\n\t\tb: \"1F3D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t35\n\t\t],\n\t\to: 8\n\t},\n\tmouse2: {\n\t\ta: \"Mouse\",\n\t\tb: \"1F401\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t31\n\t\t]\n\t},\n\tthree_button_mouse: {\n\t\ta: \"Three Button Mouse\",\n\t\tb: \"1F5B1-FE0F\",\n\t\tc: \"1F5B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t1\n\t\t],\n\t\to: 7\n\t},\n\tleftwards_arrow_with_hook: {\n\t\ta: \"Leftwards Arrow with Hook\",\n\t\tb: \"21A9-FE0F\",\n\t\tc: \"21A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"back\",\n\t\t\t\"return\",\n\t\t\t\"blue-square\",\n\t\t\t\"undo\",\n\t\t\t\"enter\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t39\n\t\t],\n\t\to: 1\n\t},\n\tbacon: {\n\t\ta: \"Bacon\",\n\t\tb: \"1F953\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"pork\",\n\t\t\t\"pig\",\n\t\t\t\"meat\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t51\n\t\t],\n\t\to: 9\n\t},\n\trelieved: {\n\t\ta: \"Relieved Face\",\n\t\tb: \"1F60C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"relaxed\",\n\t\t\t\"phew\",\n\t\t\t\"massage\",\n\t\t\t\"happiness\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-bq\": {\n\t\ta: \"Caribbean Netherlands Flag\",\n\t\tb: \"1F1E7-1F1F6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t9\n\t\t]\n\t},\n\twedding: {\n\t\ta: \"Wedding\",\n\t\tb: \"1F492\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"bride\",\n\t\t\t\"groom\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t44\n\t\t]\n\t},\n\ttokyo_tower: {\n\t\ta: \"Tokyo Tower\",\n\t\tb: \"1F5FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t20\n\t\t]\n\t},\n\tarrow_right_hook: {\n\t\ta: \"Rightwards Arrow with Hook\",\n\t\tb: \"21AA-FE0F\",\n\t\tc: \"21AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"return\",\n\t\t\t\"rotate\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t40\n\t\t],\n\t\to: 1\n\t},\n\thamburger: {\n\t\ta: \"Hamburger\",\n\t\tb: \"1F354\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"meat\",\n\t\t\t\"fast food\",\n\t\t\t\"beef\",\n\t\t\t\"cheeseburger\",\n\t\t\t\"mcdonalds\",\n\t\t\t\"burger king\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t22\n\t\t]\n\t},\n\tstuck_out_tongue: {\n\t\ta: \"Face with Stuck-out Tongue\",\n\t\tb: \"1F61B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"childish\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t51\n\t\t],\n\t\tl: [\n\t\t\t\":p\",\n\t\t\t\":-p\",\n\t\t\t\":P\",\n\t\t\t\":-P\",\n\t\t\t\":b\",\n\t\t\t\":-b\"\n\t\t],\n\t\tm: \":p\"\n\t},\n\ttrackball: {\n\t\ta: \"Trackball\",\n\t\tb: \"1F5B2-FE0F\",\n\t\tc: \"1F5B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"trackpad\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t2\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-br\": {\n\t\ta: \"Brazil Flag\",\n\t\tb: \"1F1E7-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t10\n\t\t]\n\t},\n\trat: {\n\t\ta: \"Rat\",\n\t\tb: \"1F400\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"mouse\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t30\n\t\t]\n\t},\n\ttable_tennis_paddle_and_ball: {\n\t\ta: \"Table Tennis Paddle and Ball\",\n\t\tb: \"1F3D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t36\n\t\t],\n\t\to: 8\n\t},\n\tminidisc: {\n\t\ta: \"Minidisc\",\n\t\tb: \"1F4BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"record\",\n\t\t\t\"data\",\n\t\t\t\"disk\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t40\n\t\t]\n\t},\n\tstuck_out_tongue_winking_eye: {\n\t\ta: \"Face with Stuck-out Tongue and Winking Eye\",\n\t\tb: \"1F61C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"childish\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"wink\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t0\n\t\t],\n\t\tl: [\n\t\t\t\";p\",\n\t\t\t\";-p\",\n\t\t\t\";b\",\n\t\t\t\";-b\",\n\t\t\t\";P\",\n\t\t\t\";-P\"\n\t\t],\n\t\tm: \";p\"\n\t},\n\tfries: {\n\t\ta: \"French Fries\",\n\t\tb: \"1F35F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chips\",\n\t\t\t\"snack\",\n\t\t\t\"fast food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t33\n\t\t]\n\t},\n\tbadminton_racquet_and_shuttlecock: {\n\t\ta: \"Badminton Racquet and Shuttlecock\",\n\t\tb: \"1F3F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t22\n\t\t],\n\t\to: 8\n\t},\n\tstatue_of_liberty: {\n\t\ta: \"Statue of Liberty\",\n\t\tb: \"1F5FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"american\",\n\t\t\t\"newyork\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-bs\": {\n\t\ta: \"Bahamas Flag\",\n\t\tb: \"1F1E7-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t11\n\t\t]\n\t},\n\tarrow_heading_up: {\n\t\ta: \"Arrow Pointing Rightwards Then Curving Upwards\",\n\t\tb: \"2934-FE0F\",\n\t\tc: \"2934\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t15\n\t\t],\n\t\to: 3\n\t},\n\thamster: {\n\t\ta: \"Hamster Face\",\n\t\tb: \"1F439\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t35\n\t\t]\n\t},\n\tstuck_out_tongue_closed_eyes: {\n\t\ta: \"Face with Stuck-out Tongue and Tightly-Closed Eyes\",\n\t\tb: \"1F61D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t1\n\t\t]\n\t},\n\tpizza: {\n\t\ta: \"Slice of Pizza\",\n\t\tb: \"1F355\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"party\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t23\n\t\t]\n\t},\n\tboxing_glove: {\n\t\ta: \"Boxing Glove\",\n\t\tb: \"1F94A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"fighting\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t45\n\t\t],\n\t\to: 9\n\t},\n\tfloppy_disk: {\n\t\ta: \"Floppy Disk\",\n\t\tb: \"1F4BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"oldschool\",\n\t\t\t\"technology\",\n\t\t\t\"save\",\n\t\t\t\"90s\",\n\t\t\t\"80s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t41\n\t\t]\n\t},\n\tarrow_heading_down: {\n\t\ta: \"Arrow Pointing Rightwards Then Curving Downwards\",\n\t\tb: \"2935-FE0F\",\n\t\tc: \"2935\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t16\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-bt\": {\n\t\ta: \"Bhutan Flag\",\n\t\tb: \"1F1E7-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t12\n\t\t]\n\t},\n\trabbit: {\n\t\ta: \"Rabbit Face\",\n\t\tb: \"1F430\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"spring\",\n\t\t\t\"magic\",\n\t\t\t\"bunny\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t26\n\t\t]\n\t},\n\tchurch: {\n\t\ta: \"Church\",\n\t\tb: \"26EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"religion\",\n\t\t\t\"christ\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t37\n\t\t],\n\t\to: 5\n\t},\n\tdrooling_face: {\n\t\ta: \"Drooling Face\",\n\t\tb: \"1F924\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t27\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-bv\": {\n\t\ta: \"Bouvet Island Flag\",\n\t\tb: \"1F1E7-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t13\n\t\t]\n\t},\n\tmosque: {\n\t\ta: \"Mosque\",\n\t\tb: \"1F54C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"islam\",\n\t\t\t\"worship\",\n\t\t\t\"minaret\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t15\n\t\t],\n\t\to: 8\n\t},\n\trabbit2: {\n\t\ta: \"Rabbit\",\n\t\tb: \"1F407\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"magic\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t37\n\t\t]\n\t},\n\thotdog: {\n\t\ta: \"Hot Dog\",\n\t\tb: \"1F32D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"frankfurter\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t35\n\t\t],\n\t\to: 8\n\t},\n\tmartial_arts_uniform: {\n\t\ta: \"Martial Arts Uniform\",\n\t\tb: \"1F94B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judo\",\n\t\t\t\"karate\",\n\t\t\t\"taekwondo\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t46\n\t\t],\n\t\to: 9\n\t},\n\tarrows_clockwise: {\n\t\ta: \"Clockwise Downwards and Upwards Open Circle Arrows\",\n\t\tb: \"1F503\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sync\",\n\t\t\t\"cycle\",\n\t\t\t\"round\",\n\t\t\t\"repeat\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t5\n\t\t]\n\t},\n\tcd: {\n\t\ta: \"Optical Disc\",\n\t\tb: \"1F4BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"dvd\",\n\t\t\t\"disk\",\n\t\t\t\"disc\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t42\n\t\t]\n\t},\n\tarrows_counterclockwise: {\n\t\ta: \"Anticlockwise Downwards and Upwards Open Circle Arrows\",\n\t\tb: \"1F504\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"sync\",\n\t\t\t\"cycle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t6\n\t\t]\n\t},\n\tsandwich: {\n\t\ta: \"Sandwich\",\n\t\tb: \"1F96A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\tchipmunk: {\n\t\ta: \"Chipmunk\",\n\t\tb: \"1F43F-FE0F\",\n\t\tc: \"1F43F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"rodent\",\n\t\t\t\"squirrel\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\tsynagogue: {\n\t\ta: \"Synagogue\",\n\t\tb: \"1F54D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judaism\",\n\t\t\t\"worship\",\n\t\t\t\"temple\",\n\t\t\t\"jewish\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t16\n\t\t],\n\t\to: 8\n\t},\n\tunamused: {\n\t\ta: \"Unamused Face\",\n\t\tb: \"1F612\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"indifference\",\n\t\t\t\"bored\",\n\t\t\t\"straight face\",\n\t\t\t\"serious\",\n\t\t\t\"sarcasm\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t42\n\t\t],\n\t\tm: \":(\"\n\t},\n\tgoal_net: {\n\t\ta: \"Goal Net\",\n\t\tb: \"1F945\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-bw\": {\n\t\ta: \"Botswana Flag\",\n\t\tb: \"1F1E7-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t14\n\t\t]\n\t},\n\tdvd: {\n\t\ta: \"Dvd\",\n\t\tb: \"1F4C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cd\",\n\t\t\t\"disk\",\n\t\t\t\"disc\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t43\n\t\t]\n\t},\n\thedgehog: {\n\t\ta: \"Hedgehog\",\n\t\tb: \"1F994\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t44\n\t\t],\n\t\to: 10\n\t},\n\tdart: {\n\t\ta: \"Direct Hit\",\n\t\tb: \"1F3AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"bar\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t9\n\t\t]\n\t},\n\ttaco: {\n\t\ta: \"Taco\",\n\t\tb: \"1F32E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"mexican\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t36\n\t\t],\n\t\to: 8\n\t},\n\tback: {\n\t\ta: \"Back with Leftwards Arrow Above\",\n\t\tb: \"1F519\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\",\n\t\t\t\"return\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-by\": {\n\t\ta: \"Belarus Flag\",\n\t\tb: \"1F1E7-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t15\n\t\t]\n\t},\n\tshinto_shrine: {\n\t\ta: \"Shinto Shrine\",\n\t\tb: \"26E9-FE0F\",\n\t\tc: \"26E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"temple\",\n\t\t\t\"japan\",\n\t\t\t\"kyoto\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t36\n\t\t],\n\t\to: 5\n\t},\n\tmovie_camera: {\n\t\ta: \"Movie Camera\",\n\t\tb: \"1F3A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t51\n\t\t]\n\t},\n\tsweat: {\n\t\ta: \"Face with Cold Sweat\",\n\t\tb: \"1F613\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hot\",\n\t\t\t\"sad\",\n\t\t\t\"tired\",\n\t\t\t\"exercise\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t43\n\t\t]\n\t},\n\tburrito: {\n\t\ta: \"Burrito\",\n\t\tb: \"1F32F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"mexican\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t37\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-bz\": {\n\t\ta: \"Belize Flag\",\n\t\tb: \"1F1E7-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t16\n\t\t]\n\t},\n\tpensive: {\n\t\ta: \"Pensive Face\",\n\t\tb: \"1F614\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sad\",\n\t\t\t\"depressed\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t44\n\t\t]\n\t},\n\tkaaba: {\n\t\ta: \"Kaaba\",\n\t\tb: \"1F54B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"mecca\",\n\t\t\t\"mosque\",\n\t\t\t\"islam\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t14\n\t\t],\n\t\to: 8\n\t},\n\tfilm_frames: {\n\t\ta: \"Film Frames\",\n\t\tb: \"1F39E-FE0F\",\n\t\tc: \"1F39E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tbat: {\n\t\ta: \"Bat\",\n\t\tb: \"1F987\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"blind\",\n\t\t\t\"vampire\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t31\n\t\t],\n\t\to: 9\n\t},\n\tgolf: {\n\t\ta: \"Flag in Hole\",\n\t\tb: \"26F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"business\",\n\t\t\t\"flag\",\n\t\t\t\"hole\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t41\n\t\t],\n\t\to: 5\n\t},\n\tend: {\n\t\ta: \"End with Leftwards Arrow Above\",\n\t\tb: \"1F51A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"arrow\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t28\n\t\t]\n\t},\n\tfilm_projector: {\n\t\ta: \"Film Projector\",\n\t\tb: \"1F4FD-FE0F\",\n\t\tc: \"1F4FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"video\",\n\t\t\t\"tape\",\n\t\t\t\"record\",\n\t\t\t\"movie\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\tbear: {\n\t\ta: \"Bear Face\",\n\t\tb: \"1F43B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wild\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t37\n\t\t]\n\t},\n\tice_skate: {\n\t\ta: \"Ice Skate\",\n\t\tb: \"26F8-FE0F\",\n\t\tc: \"26F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t45\n\t\t],\n\t\to: 5\n\t},\n\tfountain: {\n\t\ta: \"Fountain\",\n\t\tb: \"26F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"summer\",\n\t\t\t\"water\",\n\t\t\t\"fresh\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t40\n\t\t],\n\t\to: 5\n\t},\n\tconfused: {\n\t\ta: \"Confused Face\",\n\t\tb: \"1F615\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"indifference\",\n\t\t\t\"huh\",\n\t\t\t\"weird\",\n\t\t\t\"hmmm\",\n\t\t\t\":/\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t45\n\t\t],\n\t\tl: [\n\t\t\t\":\\\\\",\n\t\t\t\":-\\\\\",\n\t\t\t\":/\",\n\t\t\t\":-/\"\n\t\t]\n\t},\n\t\"flag-ca\": {\n\t\ta: \"Canada Flag\",\n\t\tb: \"1F1E8-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t17\n\t\t]\n\t},\n\ton: {\n\t\ta: \"On with Exclamation Mark with Left Right Arrow Above\",\n\t\tb: \"1F51B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t29\n\t\t]\n\t},\n\tstuffed_flatbread: {\n\t\ta: \"Stuffed Flatbread\",\n\t\tb: \"1F959\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"flatbread\",\n\t\t\t\"stuffed\",\n\t\t\t\"gyro\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t5\n\t\t],\n\t\to: 9\n\t},\n\tsoon: {\n\t\ta: \"Soon with Rightwards Arrow Above\",\n\t\tb: \"1F51C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t30\n\t\t]\n\t},\n\tupside_down_face: {\n\t\ta: \"Upside-Down Face\",\n\t\tb: \"1F643\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"flipped\",\n\t\t\t\"silly\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t39\n\t\t],\n\t\to: 8\n\t},\n\tfishing_pole_and_fish: {\n\t\ta: \"Fishing Pole and Fish\",\n\t\tb: \"1F3A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hobby\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t49\n\t\t]\n\t},\n\ttent: {\n\t\ta: \"Tent\",\n\t\tb: \"26FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"camping\",\n\t\t\t\"outdoors\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t12\n\t\t],\n\t\to: 5\n\t},\n\tclapper: {\n\t\ta: \"Clapper Board\",\n\t\tb: \"1F3AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"movie\",\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t6\n\t\t]\n\t},\n\tegg: {\n\t\ta: \"Egg\",\n\t\tb: \"1F95A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"chicken\",\n\t\t\t\"breakfast\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-cc\": {\n\t\ta: \"Cocos (keeling) Islands Flag\",\n\t\tb: \"1F1E8-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t18\n\t\t]\n\t},\n\tkoala: {\n\t\ta: \"Koala\",\n\t\tb: \"1F428\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t18\n\t\t]\n\t},\n\tfoggy: {\n\t\ta: \"Foggy\",\n\t\tb: \"1F301\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"mountain\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t45\n\t\t]\n\t},\n\ttv: {\n\t\ta: \"Television\",\n\t\tb: \"1F4FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"program\",\n\t\t\t\"oldschool\",\n\t\t\t\"show\",\n\t\t\t\"television\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t49\n\t\t]\n\t},\n\tpanda_face: {\n\t\ta: \"Panda Face\",\n\t\tb: \"1F43C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"panda\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t38\n\t\t]\n\t},\n\tfried_egg: {\n\t\ta: \"Cooking\",\n\t\tb: \"1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"kitchen\",\n\t\t\t\"egg\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t1\n\t\t],\n\t\tn: [\n\t\t\t\"cooking\"\n\t\t]\n\t},\n\ttop: {\n\t\ta: \"Top with Upwards Arrow Above\",\n\t\tb: \"1F51D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-cd\": {\n\t\ta: \"Congo - Kinshasa Flag\",\n\t\tb: \"1F1E8-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t19\n\t\t]\n\t},\n\tmoney_mouth_face: {\n\t\ta: \"Money-Mouth Face\",\n\t\tb: \"1F911\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"rich\",\n\t\t\t\"dollar\",\n\t\t\t\"money\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t25\n\t\t],\n\t\to: 8\n\t},\n\trunning_shirt_with_sash: {\n\t\ta: \"Running Shirt with Sash\",\n\t\tb: \"1F3BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"pageant\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t23\n\t\t]\n\t},\n\tastonished: {\n\t\ta: \"Astonished Face\",\n\t\tb: \"1F632\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"xox\",\n\t\t\t\"surprised\",\n\t\t\t\"poisoned\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t22\n\t\t]\n\t},\n\tfeet: {\n\t\ta: \"Paw Prints\",\n\t\tb: \"1F43E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t13,\n\t\t\t40\n\t\t],\n\t\tn: [\n\t\t\t\"paw_prints\"\n\t\t]\n\t},\n\tcamera: {\n\t\ta: \"Camera\",\n\t\tb: \"1F4F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gadgets\",\n\t\t\t\"photography\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-cf\": {\n\t\ta: \"Central African Republic Flag\",\n\t\tb: \"1F1E8-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t20\n\t\t]\n\t},\n\tplace_of_worship: {\n\t\ta: \"Place of Worship\",\n\t\tb: \"1F6D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"religion\",\n\t\t\t\"church\",\n\t\t\t\"temple\",\n\t\t\t\"prayer\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t5\n\t\t],\n\t\to: 8\n\t},\n\tnight_with_stars: {\n\t\ta: \"Night with Stars\",\n\t\tb: \"1F303\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"evening\",\n\t\t\t\"city\",\n\t\t\t\"downtown\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t47\n\t\t]\n\t},\n\tski: {\n\t\ta: \"Ski and Ski Boot\",\n\t\tb: \"1F3BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\",\n\t\t\t\"cold\",\n\t\t\t\"snow\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t25\n\t\t]\n\t},\n\tshallow_pan_of_food: {\n\t\ta: \"Shallow Pan of Food\",\n\t\tb: \"1F958\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"cooking\",\n\t\t\t\"casserole\",\n\t\t\t\"paella\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\tcamera_with_flash: {\n\t\ta: \"Camera with Flash\",\n\t\tb: \"1F4F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t26,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\tsunrise_over_mountains: {\n\t\ta: \"Sunrise over Mountains\",\n\t\tb: \"1F304\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"view\",\n\t\t\t\"vacation\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t48\n\t\t]\n\t},\n\tturkey: {\n\t\ta: \"Turkey\",\n\t\tb: \"1F983\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t27\n\t\t],\n\t\to: 8\n\t},\n\twhite_frowning_face: {\n\t\ta: \"White Frowning Face\",\n\t\tb: \"2639-FE0F\",\n\t\tc: \"2639\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t40\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-cg\": {\n\t\ta: \"Congo - Brazzaville Flag\",\n\t\tb: \"1F1E8-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t21\n\t\t]\n\t},\n\tstew: {\n\t\ta: \"Pot of Food\",\n\t\tb: \"1F372\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"meat\",\n\t\t\t\"soup\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t0\n\t\t]\n\t},\n\tsled: {\n\t\ta: \"Sled\",\n\t\tb: \"1F6F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\tatom_symbol: {\n\t\ta: \"Atom Symbol\",\n\t\tb: \"269B-FE0F\",\n\t\tc: \"269B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"science\",\n\t\t\t\"physics\",\n\t\t\t\"chemistry\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t18\n\t\t],\n\t\to: 4\n\t},\n\tcurling_stone: {\n\t\ta: \"Curling Stone\",\n\t\tb: \"1F94C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t47\n\t\t],\n\t\to: 10\n\t},\n\tslightly_frowning_face: {\n\t\ta: \"Slightly Frowning Face\",\n\t\tb: \"1F641\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"frowning\",\n\t\t\t\"disappointed\",\n\t\t\t\"sad\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t37\n\t\t],\n\t\to: 7\n\t},\n\tsunrise: {\n\t\ta: \"Sunrise\",\n\t\tb: \"1F305\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"morning\",\n\t\t\t\"view\",\n\t\t\t\"vacation\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t49\n\t\t]\n\t},\n\tom_symbol: {\n\t\ta: \"Om Symbol\",\n\t\tb: \"1F549-FE0F\",\n\t\tc: \"1F549\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tchicken: {\n\t\ta: \"Chicken\",\n\t\tb: \"1F414\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cluck\",\n\t\t\t\"nature\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t50\n\t\t]\n\t},\n\tbowl_with_spoon: {\n\t\ta: \"Bowl with Spoon\",\n\t\tb: \"1F963\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t15\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ch\": {\n\t\ta: \"Switzerland Flag\",\n\t\tb: \"1F1E8-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t22\n\t\t]\n\t},\n\tvideo_camera: {\n\t\ta: \"Video Camera\",\n\t\tb: \"1F4F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t48\n\t\t]\n\t},\n\tvideo_game: {\n\t\ta: \"Video Game\",\n\t\tb: \"1F3AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"console\",\n\t\t\t\"PS4\",\n\t\t\t\"controller\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t8\n\t\t]\n\t},\n\trooster: {\n\t\ta: \"Rooster\",\n\t\tb: \"1F413\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"chicken\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t49\n\t\t]\n\t},\n\tvhs: {\n\t\ta: \"Videocassette\",\n\t\tb: \"1F4FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"record\",\n\t\t\t\"video\",\n\t\t\t\"oldschool\",\n\t\t\t\"90s\",\n\t\t\t\"80s\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t51\n\t\t]\n\t},\n\tcity_sunset: {\n\t\ta: \"Cityscape at Dusk\",\n\t\tb: \"1F306\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"evening\",\n\t\t\t\"sky\",\n\t\t\t\"buildings\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t50\n\t\t]\n\t},\n\tconfounded: {\n\t\ta: \"Confounded Face\",\n\t\tb: \"1F616\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"confused\",\n\t\t\t\"sick\",\n\t\t\t\"unwell\",\n\t\t\t\"oops\",\n\t\t\t\":S\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t46\n\t\t]\n\t},\n\tgreen_salad: {\n\t\ta: \"Green Salad\",\n\t\tb: \"1F957\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"healthy\",\n\t\t\t\"lettuce\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t3\n\t\t],\n\t\to: 9\n\t},\n\tstar_of_david: {\n\t\ta: \"Star of David\",\n\t\tb: \"2721-FE0F\",\n\t\tc: \"2721\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judaism\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t47\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ci\": {\n\t\ta: \"Côte D’ivoire Flag\",\n\t\tb: \"1F1E8-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t23\n\t\t]\n\t},\n\tpopcorn: {\n\t\ta: \"Popcorn\",\n\t\tb: \"1F37F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"movie theater\",\n\t\t\t\"films\",\n\t\t\t\"snack\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t13\n\t\t],\n\t\to: 8\n\t},\n\tcity_sunrise: {\n\t\ta: \"Sunset over Buildings\",\n\t\tb: \"1F307\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"good morning\",\n\t\t\t\"dawn\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t51\n\t\t]\n\t},\n\tdisappointed: {\n\t\ta: \"Disappointed Face\",\n\t\tb: \"1F61E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sad\",\n\t\t\t\"upset\",\n\t\t\t\"depressed\",\n\t\t\t\":(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t2\n\t\t],\n\t\tl: [\n\t\t\t\"):\",\n\t\t\t\":(\",\n\t\t\t\":-(\"\n\t\t],\n\t\tm: \":(\"\n\t},\n\tmag: {\n\t\ta: \"Left-Pointing Magnifying Glass\",\n\t\tb: \"1F50D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"search\",\n\t\t\t\"zoom\",\n\t\t\t\"find\",\n\t\t\t\"detective\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t15\n\t\t]\n\t},\n\thatching_chick: {\n\t\ta: \"Hatching Chick\",\n\t\tb: \"1F423\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"egg\",\n\t\t\t\"born\",\n\t\t\t\"baby\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t13\n\t\t]\n\t},\n\tjoystick: {\n\t\ta: \"Joystick\",\n\t\tb: \"1F579-FE0F\",\n\t\tc: \"1F579\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t20\n\t\t],\n\t\to: 7\n\t},\n\twheel_of_dharma: {\n\t\ta: \"Wheel of Dharma\",\n\t\tb: \"2638-FE0F\",\n\t\tc: \"2638\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hinduism\",\n\t\t\t\"buddhism\",\n\t\t\t\"sikhism\",\n\t\t\t\"jainism\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t39\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ck\": {\n\t\ta: \"Cook Islands Flag\",\n\t\tb: \"1F1E8-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t24\n\t\t]\n\t},\n\tcanned_food: {\n\t\ta: \"Canned Food\",\n\t\tb: \"1F96B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\tworried: {\n\t\ta: \"Worried Face\",\n\t\tb: \"1F61F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"concern\",\n\t\t\t\"nervous\",\n\t\t\t\":(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t3\n\t\t]\n\t},\n\tbaby_chick: {\n\t\ta: \"Baby Chick\",\n\t\tb: \"1F424\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t14\n\t\t]\n\t},\n\t\"flag-cl\": {\n\t\ta: \"Chile Flag\",\n\t\tb: \"1F1E8-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t25\n\t\t]\n\t},\n\tgame_die: {\n\t\ta: \"Game Die\",\n\t\tb: \"1F3B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dice\",\n\t\t\t\"random\",\n\t\t\t\"tabletop\",\n\t\t\t\"play\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t12\n\t\t]\n\t},\n\tmag_right: {\n\t\ta: \"Right-Pointing Magnifying Glass\",\n\t\tb: \"1F50E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"search\",\n\t\t\t\"zoom\",\n\t\t\t\"find\",\n\t\t\t\"detective\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t16\n\t\t]\n\t},\n\tyin_yang: {\n\t\ta: \"Yin Yang\",\n\t\tb: \"262F-FE0F\",\n\t\tc: \"262F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"balance\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t38\n\t\t],\n\t\to: 1\n\t},\n\tbridge_at_night: {\n\t\ta: \"Bridge at Night\",\n\t\tb: \"1F309\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"sanfrancisco\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t1\n\t\t]\n\t},\n\tspades: {\n\t\ta: \"Black Spade Suit\",\n\t\tb: \"2660-FE0F\",\n\t\tc: \"2660\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"suits\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t4\n\t\t],\n\t\to: 1\n\t},\n\thatched_chick: {\n\t\ta: \"Front-Facing Baby Chick\",\n\t\tb: \"1F425\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"baby\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-cm\": {\n\t\ta: \"Cameroon Flag\",\n\t\tb: \"1F1E8-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t26\n\t\t]\n\t},\n\tlatin_cross: {\n\t\ta: \"Latin Cross\",\n\t\tb: \"271D-FE0F\",\n\t\tc: \"271D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"christianity\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t46\n\t\t],\n\t\to: 1\n\t},\n\ttriumph: {\n\t\ta: \"Face with Look of Triumph\",\n\t\tb: \"1F624\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"gas\",\n\t\t\t\"phew\",\n\t\t\t\"proud\",\n\t\t\t\"pride\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t8\n\t\t]\n\t},\n\thotsprings: {\n\t\ta: \"Hot Springs\",\n\t\tb: \"2668-FE0F\",\n\t\tc: \"2668\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bath\",\n\t\t\t\"warm\",\n\t\t\t\"relax\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t8\n\t\t],\n\t\to: 1\n\t},\n\tbento: {\n\t\ta: \"Bento Box\",\n\t\tb: \"1F371\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\",\n\t\t\t\"box\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t51\n\t\t]\n\t},\n\tmicroscope: {\n\t\ta: \"Microscope\",\n\t\tb: \"1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"laboratory\",\n\t\t\t\"experiment\",\n\t\t\t\"zoomin\",\n\t\t\t\"science\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t46\n\t\t]\n\t},\n\tcry: {\n\t\ta: \"Crying Face\",\n\t\tb: \"1F622\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tears\",\n\t\t\t\"sad\",\n\t\t\t\"depressed\",\n\t\t\t\"upset\",\n\t\t\t\":'(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t6\n\t\t],\n\t\tl: [\n\t\t\t\":'(\"\n\t\t],\n\t\tm: \":'(\"\n\t},\n\tbird: {\n\t\ta: \"Bird\",\n\t\tb: \"1F426\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fly\",\n\t\t\t\"tweet\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t16\n\t\t]\n\t},\n\tcn: {\n\t\ta: \"China Flag\",\n\t\tb: \"1F1E8-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"china\",\n\t\t\t\"chinese\",\n\t\t\t\"prc\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"nation\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t27\n\t\t],\n\t\tn: [\n\t\t\t\"flag-cn\"\n\t\t]\n\t},\n\ttelescope: {\n\t\ta: \"Telescope\",\n\t\tb: \"1F52D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"space\",\n\t\t\t\"zoom\",\n\t\t\t\"science\",\n\t\t\t\"astronomy\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t47\n\t\t]\n\t},\n\trice_cracker: {\n\t\ta: \"Rice Cracker\",\n\t\tb: \"1F358\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t26\n\t\t]\n\t},\n\thearts: {\n\t\ta: \"Black Heart Suit\",\n\t\tb: \"2665-FE0F\",\n\t\tc: \"2665\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t6\n\t\t],\n\t\to: 1\n\t},\n\torthodox_cross: {\n\t\ta: \"Orthodox Cross\",\n\t\tb: \"2626-FE0F\",\n\t\tc: \"2626\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"suppedaneum\",\n\t\t\t\"religion\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t35\n\t\t],\n\t\to: 1\n\t},\n\tmilky_way: {\n\t\ta: \"Milky Way\",\n\t\tb: \"1F30C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"space\",\n\t\t\t\"stars\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t4\n\t\t]\n\t},\n\trice_ball: {\n\t\ta: \"Rice Ball\",\n\t\tb: \"1F359\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t27\n\t\t]\n\t},\n\tsatellite_antenna: {\n\t\ta: \"Satellite Antenna\",\n\t\tb: \"1F4E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t26,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-co\": {\n\t\ta: \"Colombia Flag\",\n\t\tb: \"1F1E8-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t28\n\t\t]\n\t},\n\tcarousel_horse: {\n\t\ta: \"Carousel Horse\",\n\t\tb: \"1F3A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"carnival\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t46\n\t\t]\n\t},\n\tsob: {\n\t\ta: \"Loudly Crying Face\",\n\t\tb: \"1F62D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cry\",\n\t\t\t\"tears\",\n\t\t\t\"sad\",\n\t\t\t\"upset\",\n\t\t\t\"depressed\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t17\n\t\t],\n\t\tm: \":'(\"\n\t},\n\tdiamonds: {\n\t\ta: \"Black Diamond Suit\",\n\t\tb: \"2666-FE0F\",\n\t\tc: \"2666\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tstar_and_crescent: {\n\t\ta: \"Star and Crescent\",\n\t\tb: \"262A-FE0F\",\n\t\tc: \"262A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"islam\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\tpenguin: {\n\t\ta: \"Penguin\",\n\t\tb: \"1F427\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t17\n\t\t]\n\t},\n\tdove_of_peace: {\n\t\ta: \"Dove of Peace\",\n\t\tb: \"1F54A-FE0F\",\n\t\tc: \"1F54A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-cp\": {\n\t\ta: \"Clipperton Island Flag\",\n\t\tb: \"1F1E8-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t1,\n\t\t\t29\n\t\t]\n\t},\n\tferris_wheel: {\n\t\ta: \"Ferris Wheel\",\n\t\tb: \"1F3A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"carnival\",\n\t\t\t\"londoneye\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t47\n\t\t]\n\t},\n\tclubs: {\n\t\ta: \"Black Club Suit\",\n\t\tb: \"2663-FE0F\",\n\t\tc: \"2663\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t5\n\t\t],\n\t\to: 1\n\t},\n\tpeace_symbol: {\n\t\ta: \"Peace Symbol\",\n\t\tb: \"262E-FE0F\",\n\t\tc: \"262E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hippie\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t37\n\t\t],\n\t\to: 1\n\t},\n\tcandle: {\n\t\ta: \"Candle\",\n\t\tb: \"1F56F-FE0F\",\n\t\tc: \"1F56F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fire\",\n\t\t\t\"wax\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\tfrowning: {\n\t\ta: \"Frowning Face with Open Mouth\",\n\t\tb: \"1F626\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"aw\",\n\t\t\t\"what\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t10\n\t\t]\n\t},\n\trice: {\n\t\ta: \"Cooked Rice\",\n\t\tb: \"1F35A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"china\",\n\t\t\t\"asian\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-cr\": {\n\t\ta: \"Costa Rica Flag\",\n\t\tb: \"1F1E8-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t30\n\t\t]\n\t},\n\troller_coaster: {\n\t\ta: \"Roller Coaster\",\n\t\tb: \"1F3A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"carnival\",\n\t\t\t\"playground\",\n\t\t\t\"photo\",\n\t\t\t\"fun\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t48\n\t\t]\n\t},\n\tmenorah_with_nine_branches: {\n\t\ta: \"Menorah with Nine Branches\",\n\t\tb: \"1F54E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t17\n\t\t],\n\t\to: 8\n\t},\n\tblack_joker: {\n\t\ta: \"Playing Card Black Joker\",\n\t\tb: \"1F0CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t15\n\t\t]\n\t},\n\teagle: {\n\t\ta: \"Eagle\",\n\t\tb: \"1F985\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t29\n\t\t],\n\t\to: 9\n\t},\n\tcurry: {\n\t\ta: \"Curry and Rice\",\n\t\tb: \"1F35B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"spicy\",\n\t\t\t\"hot\",\n\t\t\t\"indian\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t29\n\t\t]\n\t},\n\tbulb: {\n\t\ta: \"Electric Light Bulb\",\n\t\tb: \"1F4A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"light\",\n\t\t\t\"electricity\",\n\t\t\t\"idea\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t7\n\t\t]\n\t},\n\tanguished: {\n\t\ta: \"Anguished Face\",\n\t\tb: \"1F627\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"stunned\",\n\t\t\t\"nervous\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t11\n\t\t],\n\t\tl: [\n\t\t\t\"D:\"\n\t\t]\n\t},\n\t\"flag-cu\": {\n\t\ta: \"Cuba Flag\",\n\t\tb: \"1F1E8-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t31\n\t\t]\n\t},\n\tbarber: {\n\t\ta: \"Barber Pole\",\n\t\tb: \"1F488\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hair\",\n\t\t\t\"salon\",\n\t\t\t\"style\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t34\n\t\t]\n\t},\n\tduck: {\n\t\ta: \"Duck\",\n\t\tb: \"1F986\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\",\n\t\t\t\"mallard\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\tsix_pointed_star: {\n\t\ta: \"Six Pointed Star with Middle Dot\",\n\t\tb: \"1F52F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"religion\",\n\t\t\t\"jewish\",\n\t\t\t\"hexagram\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t49\n\t\t]\n\t},\n\tramen: {\n\t\ta: \"Steaming Bowl\",\n\t\tb: \"1F35C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\",\n\t\t\t\"noodle\",\n\t\t\t\"chopsticks\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t30\n\t\t]\n\t},\n\tflashlight: {\n\t\ta: \"Electric Torch\",\n\t\tb: \"1F526\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dark\",\n\t\t\t\"camping\",\n\t\t\t\"sight\",\n\t\t\t\"night\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t40\n\t\t]\n\t},\n\tmahjong: {\n\t\ta: \"Mahjong Tile Red Dragon\",\n\t\tb: \"1F004\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t14\n\t\t],\n\t\to: 5\n\t},\n\tfearful: {\n\t\ta: \"Fearful Face\",\n\t\tb: \"1F628\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"scared\",\n\t\t\t\"terrified\",\n\t\t\t\"nervous\",\n\t\t\t\"oops\",\n\t\t\t\"huh\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t12\n\t\t]\n\t},\n\taries: {\n\t\ta: \"Aries\",\n\t\tb: \"2648\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t44\n\t\t],\n\t\to: 1\n\t},\n\tspaghetti: {\n\t\ta: \"Spaghetti\",\n\t\tb: \"1F35D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"italian\",\n\t\t\t\"noodle\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t31\n\t\t]\n\t},\n\tcircus_tent: {\n\t\ta: \"Circus Tent\",\n\t\tb: \"1F3AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"carnival\",\n\t\t\t\"party\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t4\n\t\t]\n\t},\n\tizakaya_lantern: {\n\t\ta: \"Izakaya Lantern\",\n\t\tb: \"1F3EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"light\",\n\t\t\t\"paper\",\n\t\t\t\"halloween\",\n\t\t\t\"spooky\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"lantern\"\n\t\t]\n\t},\n\t\"flag-cv\": {\n\t\ta: \"Cape Verde Flag\",\n\t\tb: \"1F1E8-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t32\n\t\t]\n\t},\n\tweary: {\n\t\ta: \"Weary Face\",\n\t\tb: \"1F629\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"sleepy\",\n\t\t\t\"sad\",\n\t\t\t\"frustrated\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t13\n\t\t]\n\t},\n\tflower_playing_cards: {\n\t\ta: \"Flower Playing Cards\",\n\t\tb: \"1F3B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"sunset\",\n\t\t\t\"red\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t14\n\t\t]\n\t},\n\towl: {\n\t\ta: \"Owl\",\n\t\tb: \"1F989\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\",\n\t\t\t\"hoot\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t33\n\t\t],\n\t\to: 9\n\t},\n\tperforming_arts: {\n\t\ta: \"Performing Arts\",\n\t\tb: \"1F3AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"acting\",\n\t\t\t\"theater\",\n\t\t\t\"drama\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t7\n\t\t]\n\t},\n\tfrog: {\n\t\ta: \"Frog Face\",\n\t\tb: \"1F438\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"croak\",\n\t\t\t\"toad\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-cw\": {\n\t\ta: \"Curaçao Flag\",\n\t\tb: \"1F1E8-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t33\n\t\t]\n\t},\n\tnotebook_with_decorative_cover: {\n\t\ta: \"Notebook with Decorative Cover\",\n\t\tb: \"1F4D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"classroom\",\n\t\t\t\"notes\",\n\t\t\t\"record\",\n\t\t\t\"paper\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t11\n\t\t]\n\t},\n\texploding_head: {\n\t\ta: \"Shocked Face with Exploding Head\",\n\t\tb: \"1F92F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t3\n\t\t],\n\t\tn: [\n\t\t\t\"shocked_face_with_exploding_head\"\n\t\t],\n\t\to: 10\n\t},\n\ttaurus: {\n\t\ta: \"Taurus\",\n\t\tb: \"2649\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t45\n\t\t],\n\t\to: 1\n\t},\n\tsweet_potato: {\n\t\ta: \"Roasted Sweet Potato\",\n\t\tb: \"1F360\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t34\n\t\t]\n\t},\n\tclosed_book: {\n\t\ta: \"Closed Book\",\n\t\tb: \"1F4D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"textbook\",\n\t\t\t\"learn\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t12\n\t\t]\n\t},\n\tgemini: {\n\t\ta: \"Gemini\",\n\t\tb: \"264A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t46\n\t\t],\n\t\to: 1\n\t},\n\tframe_with_picture: {\n\t\ta: \"Frame with Picture\",\n\t\tb: \"1F5BC-FE0F\",\n\t\tc: \"1F5BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t3\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-cx\": {\n\t\ta: \"Christmas Island Flag\",\n\t\tb: \"1F1E8-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t34\n\t\t]\n\t},\n\tgrimacing: {\n\t\ta: \"Grimacing Face\",\n\t\tb: \"1F62C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"grimace\",\n\t\t\t\"teeth\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t16\n\t\t]\n\t},\n\tcrocodile: {\n\t\ta: \"Crocodile\",\n\t\tb: \"1F40A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"reptile\",\n\t\t\t\"lizard\",\n\t\t\t\"alligator\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t40\n\t\t]\n\t},\n\toden: {\n\t\ta: \"Oden\",\n\t\tb: \"1F362\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-cy\": {\n\t\ta: \"Cyprus Flag\",\n\t\tb: \"1F1E8-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t35\n\t\t]\n\t},\n\tbook: {\n\t\ta: \"Open Book\",\n\t\tb: \"1F4D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t26,\n\t\t\t13\n\t\t],\n\t\tn: [\n\t\t\t\"open_book\"\n\t\t]\n\t},\n\tturtle: {\n\t\ta: \"Turtle\",\n\t\tb: \"1F422\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"slow\",\n\t\t\t\"nature\",\n\t\t\t\"tortoise\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t12\n\t\t]\n\t},\n\tart: {\n\t\ta: \"Artist Palette\",\n\t\tb: \"1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"design\",\n\t\t\t\"paint\",\n\t\t\t\"draw\",\n\t\t\t\"colors\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t2\n\t\t]\n\t},\n\tsushi: {\n\t\ta: \"Sushi\",\n\t\tb: \"1F363\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fish\",\n\t\t\t\"japanese\",\n\t\t\t\"rice\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t37\n\t\t]\n\t},\n\tcold_sweat: {\n\t\ta: \"Face with Open Mouth and Cold Sweat\",\n\t\tb: \"1F630\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"nervous\",\n\t\t\t\"sweat\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t20\n\t\t]\n\t},\n\tcancer: {\n\t\ta: \"Cancer\",\n\t\tb: \"264B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t47\n\t\t],\n\t\to: 1\n\t},\n\tfried_shrimp: {\n\t\ta: \"Fried Shrimp\",\n\t\tb: \"1F364\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"animal\",\n\t\t\t\"appetizer\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t38\n\t\t]\n\t},\n\tslot_machine: {\n\t\ta: \"Slot Machine\",\n\t\tb: \"1F3B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bet\",\n\t\t\t\"gamble\",\n\t\t\t\"vegas\",\n\t\t\t\"fruit machine\",\n\t\t\t\"luck\",\n\t\t\t\"casino\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t10\n\t\t]\n\t},\n\tscream: {\n\t\ta: \"Face Screaming in Fear\",\n\t\tb: \"1F631\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"munch\",\n\t\t\t\"scared\",\n\t\t\t\"omg\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t21\n\t\t]\n\t},\n\tgreen_book: {\n\t\ta: \"Green Book\",\n\t\tb: \"1F4D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t14\n\t\t]\n\t},\n\tleo: {\n\t\ta: \"Leo\",\n\t\tb: \"264C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t48\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-cz\": {\n\t\ta: \"Czechia Flag\",\n\t\tb: \"1F1E8-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t36\n\t\t]\n\t},\n\tlizard: {\n\t\ta: \"Lizard\",\n\t\tb: \"1F98E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"reptile\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\tvirgo: {\n\t\ta: \"Virgo\",\n\t\tb: \"264D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t49\n\t\t],\n\t\to: 1\n\t},\n\tsteam_locomotive: {\n\t\ta: \"Steam Locomotive\",\n\t\tb: \"1F682\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"train\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t10\n\t\t]\n\t},\n\tde: {\n\t\ta: \"Germany Flag\",\n\t\tb: \"1F1E9-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"german\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t37\n\t\t],\n\t\tn: [\n\t\t\t\"flag-de\"\n\t\t]\n\t},\n\tflushed: {\n\t\ta: \"Flushed Face\",\n\t\tb: \"1F633\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"blush\",\n\t\t\t\"shy\",\n\t\t\t\"flattered\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t23\n\t\t]\n\t},\n\tblue_book: {\n\t\ta: \"Blue Book\",\n\t\tb: \"1F4D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"learn\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t15\n\t\t]\n\t},\n\tsnake: {\n\t\ta: \"Snake\",\n\t\tb: \"1F40D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"evil\",\n\t\t\t\"nature\",\n\t\t\t\"hiss\",\n\t\t\t\"python\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t43\n\t\t]\n\t},\n\tfish_cake: {\n\t\ta: \"Fish Cake with Swirl Design\",\n\t\tb: \"1F365\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japan\",\n\t\t\t\"sea\",\n\t\t\t\"beach\",\n\t\t\t\"narutomaki\",\n\t\t\t\"pink\",\n\t\t\t\"swirl\",\n\t\t\t\"kamaboko\",\n\t\t\t\"surimi\",\n\t\t\t\"ramen\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t39\n\t\t]\n\t},\n\trailway_car: {\n\t\ta: \"Railway Car\",\n\t\tb: \"1F683\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t11\n\t\t]\n\t},\n\tdango: {\n\t\ta: \"Dango\",\n\t\tb: \"1F361\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\",\n\t\t\t\"japanese\",\n\t\t\t\"barbecue\",\n\t\t\t\"meat\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t35\n\t\t]\n\t},\n\torange_book: {\n\t\ta: \"Orange Book\",\n\t\tb: \"1F4D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"textbook\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t16\n\t\t]\n\t},\n\tlibra: {\n\t\ta: \"Libra\",\n\t\tb: \"264E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t50\n\t\t],\n\t\to: 1\n\t},\n\tdragon_face: {\n\t\ta: \"Dragon Face\",\n\t\tb: \"1F432\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"myth\",\n\t\t\t\"nature\",\n\t\t\t\"chinese\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-dg\": {\n\t\ta: \"Diego Garcia Flag\",\n\t\tb: \"1F1E9-1F1EC\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t38\n\t\t]\n\t},\n\tzany_face: {\n\t\ta: \"Grinning Face with One Large and One Small Eye\",\n\t\tb: \"1F92A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t50\n\t\t],\n\t\tn: [\n\t\t\t\"grinning_face_with_one_large_and_one_small_eye\"\n\t\t],\n\t\to: 10\n\t},\n\tbooks: {\n\t\ta: \"Books\",\n\t\tb: \"1F4DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"literature\",\n\t\t\t\"library\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t17\n\t\t]\n\t},\n\tdragon: {\n\t\ta: \"Dragon\",\n\t\tb: \"1F409\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"myth\",\n\t\t\t\"nature\",\n\t\t\t\"chinese\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t39\n\t\t]\n\t},\n\t\"flag-dj\": {\n\t\ta: \"Djibouti Flag\",\n\t\tb: \"1F1E9-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t39\n\t\t]\n\t},\n\tdumpling: {\n\t\ta: \"Dumpling\",\n\t\tb: \"1F95F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t11\n\t\t],\n\t\to: 10\n\t},\n\tdizzy_face: {\n\t\ta: \"Dizzy Face\",\n\t\tb: \"1F635\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"spent\",\n\t\t\t\"unconscious\",\n\t\t\t\"xox\",\n\t\t\t\"dizzy\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t25\n\t\t]\n\t},\n\tscorpius: {\n\t\ta: \"Scorpius\",\n\t\tb: \"264F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\",\n\t\t\t\"scorpio\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t51\n\t\t],\n\t\to: 1\n\t},\n\tbullettrain_side: {\n\t\ta: \"High-Speed Train\",\n\t\tb: \"1F684\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t12\n\t\t]\n\t},\n\tbullettrain_front: {\n\t\ta: \"High-Speed Train with Bullet Nose\",\n\t\tb: \"1F685\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"speed\",\n\t\t\t\"fast\",\n\t\t\t\"public\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t13\n\t\t]\n\t},\n\tnotebook: {\n\t\ta: \"Notebook\",\n\t\tb: \"1F4D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"record\",\n\t\t\t\"notes\",\n\t\t\t\"paper\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t10\n\t\t]\n\t},\n\tfortune_cookie: {\n\t\ta: \"Fortune Cookie\",\n\t\tb: \"1F960\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t12\n\t\t],\n\t\to: 10\n\t},\n\tsagittarius: {\n\t\ta: \"Sagittarius\",\n\t\tb: \"2650\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t0\n\t\t],\n\t\to: 1\n\t},\n\tsauropod: {\n\t\ta: \"Sauropod\",\n\t\tb: \"1F995\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t45\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-dk\": {\n\t\ta: \"Denmark Flag\",\n\t\tb: \"1F1E9-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t40\n\t\t]\n\t},\n\trage: {\n\t\ta: \"Pouting Face\",\n\t\tb: \"1F621\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"mad\",\n\t\t\t\"hate\",\n\t\t\t\"despise\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t5\n\t\t]\n\t},\n\tledger: {\n\t\ta: \"Ledger\",\n\t\tb: \"1F4D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"notes\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t9\n\t\t]\n\t},\n\tangry: {\n\t\ta: \"Angry Face\",\n\t\tb: \"1F620\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mad\",\n\t\t\t\"face\",\n\t\t\t\"annoyed\",\n\t\t\t\"frustrated\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t4\n\t\t],\n\t\tl: [\n\t\t\t\">:(\",\n\t\t\t\">:-(\"\n\t\t]\n\t},\n\t\"t-rex\": {\n\t\ta: \"T-Rex\",\n\t\tb: \"1F996\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t46\n\t\t],\n\t\to: 10\n\t},\n\tcapricorn: {\n\t\ta: \"Capricorn\",\n\t\tb: \"2651\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t1\n\t\t],\n\t\to: 1\n\t},\n\ttakeout_box: {\n\t\ta: \"Takeout Box\",\n\t\tb: \"1F961\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t13\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-dm\": {\n\t\ta: \"Dominica Flag\",\n\t\tb: \"1F1E9-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t41\n\t\t]\n\t},\n\ttrain2: {\n\t\ta: \"Train\",\n\t\tb: \"1F686\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t14\n\t\t]\n\t},\n\tpage_with_curl: {\n\t\ta: \"Page with Curl\",\n\t\tb: \"1F4C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"office\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t46\n\t\t]\n\t},\n\twhale: {\n\t\ta: \"Spouting Whale\",\n\t\tb: \"1F433\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t29\n\t\t]\n\t},\n\tface_with_symbols_on_mouth: {\n\t\ta: \"Serious Face with Symbols Covering Mouth\",\n\t\tb: \"1F92C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t0\n\t\t],\n\t\tn: [\n\t\t\t\"serious_face_with_symbols_covering_mouth\"\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-do\": {\n\t\ta: \"Dominican Republic Flag\",\n\t\tb: \"1F1E9-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t42\n\t\t]\n\t},\n\tmetro: {\n\t\ta: \"Metro\",\n\t\tb: \"1F687\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"blue-square\",\n\t\t\t\"mrt\",\n\t\t\t\"underground\",\n\t\t\t\"tube\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t15\n\t\t]\n\t},\n\ticecream: {\n\t\ta: \"Soft Ice Cream\",\n\t\tb: \"1F366\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hot\",\n\t\t\t\"dessert\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t40\n\t\t]\n\t},\n\taquarius: {\n\t\ta: \"Aquarius\",\n\t\tb: \"2652\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t2\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-dz\": {\n\t\ta: \"Algeria Flag\",\n\t\tb: \"1F1E9-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t43\n\t\t]\n\t},\n\twhale2: {\n\t\ta: \"Whale\",\n\t\tb: \"1F40B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t41\n\t\t]\n\t},\n\tmask: {\n\t\ta: \"Face with Medical Mask\",\n\t\tb: \"1F637\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sick\",\n\t\t\t\"ill\",\n\t\t\t\"disease\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t27\n\t\t]\n\t},\n\tscroll: {\n\t\ta: \"Scroll\",\n\t\tb: \"1F4DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"ancient\",\n\t\t\t\"history\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t19\n\t\t]\n\t},\n\tshaved_ice: {\n\t\ta: \"Shaved Ice\",\n\t\tb: \"1F367\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hot\",\n\t\t\t\"dessert\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t41\n\t\t]\n\t},\n\tpisces: {\n\t\ta: \"Pisces\",\n\t\tb: \"2653\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t3\n\t\t],\n\t\to: 1\n\t},\n\tlight_rail: {\n\t\ta: \"Light Rail\",\n\t\tb: \"1F688\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t16\n\t\t]\n\t},\n\tdolphin: {\n\t\ta: \"Dolphin\",\n\t\tb: \"1F42C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fish\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\",\n\t\t\t\"flipper\",\n\t\t\t\"fins\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t22\n\t\t],\n\t\tn: [\n\t\t\t\"flipper\"\n\t\t]\n\t},\n\tface_with_thermometer: {\n\t\ta: \"Face with Thermometer\",\n\t\tb: \"1F912\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sick\",\n\t\t\t\"temperature\",\n\t\t\t\"thermometer\",\n\t\t\t\"cold\",\n\t\t\t\"fever\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t26\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-ea\": {\n\t\ta: \"Ceuta & Melilla Flag\",\n\t\tb: \"1F1EA-1F1E6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t44\n\t\t]\n\t},\n\tophiuchus: {\n\t\ta: \"Ophiuchus\",\n\t\tb: \"26CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"constellation\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t31\n\t\t]\n\t},\n\tstation: {\n\t\ta: \"Station\",\n\t\tb: \"1F689\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"public\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t17\n\t\t]\n\t},\n\tice_cream: {\n\t\ta: \"Ice Cream\",\n\t\tb: \"1F368\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hot\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t42\n\t\t]\n\t},\n\tpage_facing_up: {\n\t\ta: \"Page Facing Up\",\n\t\tb: \"1F4C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"office\",\n\t\t\t\"paper\",\n\t\t\t\"information\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t47\n\t\t]\n\t},\n\tdoughnut: {\n\t\ta: \"Doughnut\",\n\t\tb: \"1F369\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"snack\",\n\t\t\t\"sweet\",\n\t\t\t\"donut\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t43\n\t\t]\n\t},\n\tface_with_head_bandage: {\n\t\ta: \"Face with Head-Bandage\",\n\t\tb: \"1F915\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"injured\",\n\t\t\t\"clumsy\",\n\t\t\t\"bandage\",\n\t\t\t\"hurt\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t29\n\t\t],\n\t\to: 8\n\t},\n\tfish: {\n\t\ta: \"Fish\",\n\t\tb: \"1F41F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t9\n\t\t]\n\t},\n\tnewspaper: {\n\t\ta: \"Newspaper\",\n\t\tb: \"1F4F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"press\",\n\t\t\t\"headline\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t39\n\t\t]\n\t},\n\ttram: {\n\t\ta: \"Tram\",\n\t\tb: \"1F68A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-ec\": {\n\t\ta: \"Ecuador Flag\",\n\t\tb: \"1F1EA-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t45\n\t\t]\n\t},\n\ttwisted_rightwards_arrows: {\n\t\ta: \"Twisted Rightwards Arrows\",\n\t\tb: \"1F500\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"shuffle\",\n\t\t\t\"music\",\n\t\t\t\"random\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-ee\": {\n\t\ta: \"Estonia Flag\",\n\t\tb: \"1F1EA-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t46\n\t\t]\n\t},\n\tcookie: {\n\t\ta: \"Cookie\",\n\t\tb: \"1F36A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"oreo\",\n\t\t\t\"chocolate\",\n\t\t\t\"sweet\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t44\n\t\t]\n\t},\n\tmonorail: {\n\t\ta: \"Monorail\",\n\t\tb: \"1F69D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t37\n\t\t]\n\t},\n\ttropical_fish: {\n\t\ta: \"Tropical Fish\",\n\t\tb: \"1F420\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"swim\",\n\t\t\t\"ocean\",\n\t\t\t\"beach\",\n\t\t\t\"nemo\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t10\n\t\t]\n\t},\n\trolled_up_newspaper: {\n\t\ta: \"Rolled Up Newspaper\",\n\t\tb: \"1F5DE-FE0F\",\n\t\tc: \"1F5DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tnauseated_face: {\n\t\ta: \"Nauseated Face\",\n\t\tb: \"1F922\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"vomit\",\n\t\t\t\"gross\",\n\t\t\t\"green\",\n\t\t\t\"sick\",\n\t\t\t\"throw up\",\n\t\t\t\"ill\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t25\n\t\t],\n\t\to: 9\n\t},\n\trepeat: {\n\t\ta: \"Clockwise Rightwards and Leftwards Open Circle Arrows\",\n\t\tb: \"1F501\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"loop\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t3\n\t\t]\n\t},\n\tbookmark_tabs: {\n\t\ta: \"Bookmark Tabs\",\n\t\tb: \"1F4D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"favorite\",\n\t\t\t\"save\",\n\t\t\t\"order\",\n\t\t\t\"tidy\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t8\n\t\t]\n\t},\n\trepeat_one: {\n\t\ta: \"Clockwise Rightwards and Leftwards Open Circle Arrows with Circled One Overlay\",\n\t\tb: \"1F502\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"loop\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-eg\": {\n\t\ta: \"Egypt Flag\",\n\t\tb: \"1F1EA-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t47\n\t\t]\n\t},\n\tmountain_railway: {\n\t\ta: \"Mountain Railway\",\n\t\tb: \"1F69E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t38\n\t\t]\n\t},\n\tbirthday: {\n\t\ta: \"Birthday Cake\",\n\t\tb: \"1F382\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"cake\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t16\n\t\t]\n\t},\n\tblowfish: {\n\t\ta: \"Blowfish\",\n\t\tb: \"1F421\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"food\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t11\n\t\t]\n\t},\n\tface_vomiting: {\n\t\ta: \"Face with Open Mouth Vomiting\",\n\t\tb: \"1F92E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_open_mouth_vomiting\"\n\t\t],\n\t\to: 10\n\t},\n\tarrow_forward: {\n\t\ta: \"Black Right-Pointing Triangle\",\n\t\tb: \"25B6-FE0F\",\n\t\tc: \"25B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"right\",\n\t\t\t\"direction\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t10\n\t\t],\n\t\to: 1\n\t},\n\tbookmark: {\n\t\ta: \"Bookmark\",\n\t\tb: \"1F516\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"favorite\",\n\t\t\t\"label\",\n\t\t\t\"save\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-eh\": {\n\t\ta: \"Western Sahara Flag\",\n\t\tb: \"1F1EA-1F1ED\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t48\n\t\t]\n\t},\n\tshark: {\n\t\ta: \"Shark\",\n\t\tb: \"1F988\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fish\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\",\n\t\t\t\"jaws\",\n\t\t\t\"fins\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t32\n\t\t],\n\t\to: 9\n\t},\n\ttrain: {\n\t\ta: \"Tram Car\",\n\t\tb: \"1F68B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"carriage\",\n\t\t\t\"public\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t19\n\t\t]\n\t},\n\tsneezing_face: {\n\t\ta: \"Sneezing Face\",\n\t\tb: \"1F927\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"gesundheit\",\n\t\t\t\"sneeze\",\n\t\t\t\"sick\",\n\t\t\t\"allergy\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t47\n\t\t],\n\t\to: 9\n\t},\n\tcake: {\n\t\ta: \"Shortcake\",\n\t\tb: \"1F370\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t50\n\t\t]\n\t},\n\tbus: {\n\t\ta: \"Bus\",\n\t\tb: \"1F68C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"car\",\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t20\n\t\t]\n\t},\n\tpie: {\n\t\ta: \"Pie\",\n\t\tb: \"1F967\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t19\n\t\t],\n\t\to: 10\n\t},\n\tinnocent: {\n\t\ta: \"Smiling Face with Halo\",\n\t\tb: \"1F607\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"angel\",\n\t\t\t\"heaven\",\n\t\t\t\"halo\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t31\n\t\t]\n\t},\n\tfast_forward: {\n\t\ta: \"Black Right-Pointing Double Triangle\",\n\t\tb: \"23E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"play\",\n\t\t\t\"speed\",\n\t\t\t\"continue\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t45\n\t\t]\n\t},\n\tlabel: {\n\t\ta: \"Label\",\n\t\tb: \"1F3F7-FE0F\",\n\t\tc: \"1F3F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sale\",\n\t\t\t\"tag\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t21\n\t\t],\n\t\to: 7\n\t},\n\toctopus: {\n\t\ta: \"Octopus\",\n\t\tb: \"1F419\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"creature\",\n\t\t\t\"ocean\",\n\t\t\t\"sea\",\n\t\t\t\"nature\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-er\": {\n\t\ta: \"Eritrea Flag\",\n\t\tb: \"1F1EA-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t49\n\t\t]\n\t},\n\tblack_right_pointing_double_triangle_with_vertical_bar: {\n\t\ta: \"Black Right Pointing Double Triangle with Vertical Bar\",\n\t\tb: \"23ED-FE0F\",\n\t\tc: \"23ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t49\n\t\t]\n\t},\n\tchocolate_bar: {\n\t\ta: \"Chocolate Bar\",\n\t\tb: \"1F36B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t45\n\t\t]\n\t},\n\toncoming_bus: {\n\t\ta: \"Oncoming Bus\",\n\t\tb: \"1F68D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t21\n\t\t]\n\t},\n\tshell: {\n\t\ta: \"Spiral Shell\",\n\t\tb: \"1F41A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t4\n\t\t]\n\t},\n\tface_with_cowboy_hat: {\n\t\ta: \"Face with Cowboy Hat\",\n\t\tb: \"1F920\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t23\n\t\t],\n\t\to: 9\n\t},\n\tmoneybag: {\n\t\ta: \"Money Bag\",\n\t\tb: \"1F4B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dollar\",\n\t\t\t\"payment\",\n\t\t\t\"coins\",\n\t\t\t\"sale\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t27\n\t\t]\n\t},\n\tes: {\n\t\ta: \"Spain Flag\",\n\t\tb: \"1F1EA-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"spain\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t50\n\t\t],\n\t\tn: [\n\t\t\t\"flag-es\"\n\t\t]\n\t},\n\tcrab: {\n\t\ta: \"Crab\",\n\t\tb: \"1F980\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"crustacean\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tyen: {\n\t\ta: \"Banknote with Yen Sign\",\n\t\tb: \"1F4B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"japanese\",\n\t\t\t\"dollar\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-et\": {\n\t\ta: \"Ethiopia Flag\",\n\t\tb: \"1F1EA-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t51\n\t\t]\n\t},\n\tclown_face: {\n\t\ta: \"Clown Face\",\n\t\tb: \"1F921\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\tblack_right_pointing_triangle_with_double_vertical_bar: {\n\t\ta: \"Black Right Pointing Triangle with Double Vertical Bar\",\n\t\tb: \"23EF-FE0F\",\n\t\tc: \"23EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t51\n\t\t]\n\t},\n\ttrolleybus: {\n\t\ta: \"Trolleybus\",\n\t\tb: \"1F68E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bart\",\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t22\n\t\t]\n\t},\n\tcandy: {\n\t\ta: \"Candy\",\n\t\tb: \"1F36C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"snack\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\",\n\t\t\t\"lolly\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t46\n\t\t]\n\t},\n\tlying_face: {\n\t\ta: \"Lying Face\",\n\t\tb: \"1F925\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"lie\",\n\t\t\t\"pinocchio\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t28\n\t\t],\n\t\to: 9\n\t},\n\tarrow_backward: {\n\t\ta: \"Black Left-Pointing Triangle\",\n\t\tb: \"25C0-FE0F\",\n\t\tc: \"25C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"left\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t11\n\t\t],\n\t\to: 1\n\t},\n\tdollar: {\n\t\ta: \"Banknote with Dollar Sign\",\n\t\tb: \"1F4B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bill\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t32\n\t\t]\n\t},\n\tshrimp: {\n\t\ta: \"Shrimp\",\n\t\tb: \"1F990\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"ocean\",\n\t\t\t\"nature\",\n\t\t\t\"seafood\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t40\n\t\t],\n\t\to: 9\n\t},\n\tminibus: {\n\t\ta: \"Minibus\",\n\t\tb: \"1F690\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"car\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-eu\": {\n\t\ta: \"European Union Flag\",\n\t\tb: \"1F1EA-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t0\n\t\t]\n\t},\n\tlollipop: {\n\t\ta: \"Lollipop\",\n\t\tb: \"1F36D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"candy\",\n\t\t\t\"sweet\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t47\n\t\t]\n\t},\n\tsquid: {\n\t\ta: \"Squid\",\n\t\tb: \"1F991\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"ocean\",\n\t\t\t\"sea\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\teuro: {\n\t\ta: \"Banknote with Euro Sign\",\n\t\tb: \"1F4B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t33\n\t\t]\n\t},\n\t\"flag-fi\": {\n\t\ta: \"Finland Flag\",\n\t\tb: \"1F1EB-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t1\n\t\t]\n\t},\n\tambulance: {\n\t\ta: \"Ambulance\",\n\t\tb: \"1F691\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"911\",\n\t\t\t\"hospital\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t25\n\t\t]\n\t},\n\tcustard: {\n\t\ta: \"Custard\",\n\t\tb: \"1F36E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dessert\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t48\n\t\t]\n\t},\n\tshushing_face: {\n\t\ta: \"Face with Finger Covering Closed Lips\",\n\t\tb: \"1F92B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t51\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_finger_covering_closed_lips\"\n\t\t],\n\t\to: 10\n\t},\n\trewind: {\n\t\ta: \"Black Left-Pointing Double Triangle\",\n\t\tb: \"23EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t46\n\t\t]\n\t},\n\tblack_left_pointing_double_triangle_with_vertical_bar: {\n\t\ta: \"Black Left Pointing Double Triangle with Vertical Bar\",\n\t\tb: \"23EE-FE0F\",\n\t\tc: \"23EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t50\n\t\t]\n\t},\n\tface_with_hand_over_mouth: {\n\t\ta: \"Smiling Face with Smiling Eyes and Hand Covering Mouth\",\n\t\tb: \"1F92D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t1\n\t\t],\n\t\tn: [\n\t\t\t\"smiling_face_with_smiling_eyes_and_hand_covering_mouth\"\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-fj\": {\n\t\ta: \"Fiji Flag\",\n\t\tb: \"1F1EB-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t2\n\t\t]\n\t},\n\thoney_pot: {\n\t\ta: \"Honey Pot\",\n\t\tb: \"1F36F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bees\",\n\t\t\t\"sweet\",\n\t\t\t\"kitchen\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t49\n\t\t]\n\t},\n\tsnail: {\n\t\ta: \"Snail\",\n\t\tb: \"1F40C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"slow\",\n\t\t\t\"animal\",\n\t\t\t\"shell\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t42\n\t\t]\n\t},\n\tpound: {\n\t\ta: \"Banknote with Pound Sign\",\n\t\tb: \"1F4B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"british\",\n\t\t\t\"sterling\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bills\",\n\t\t\t\"uk\",\n\t\t\t\"england\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t34\n\t\t]\n\t},\n\tfire_engine: {\n\t\ta: \"Fire Engine\",\n\t\tb: \"1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"cars\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t26\n\t\t]\n\t},\n\tbaby_bottle: {\n\t\ta: \"Baby Bottle\",\n\t\tb: \"1F37C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"container\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-fk\": {\n\t\ta: \"Falkland Islands Flag\",\n\t\tb: \"1F1EB-1F1F0\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t},\n\tbutterfly: {\n\t\ta: \"Butterfly\",\n\t\tb: \"1F98B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"caterpillar\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t35\n\t\t],\n\t\to: 9\n\t},\n\tmoney_with_wings: {\n\t\ta: \"Money with Wings\",\n\t\tb: \"1F4B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dollar\",\n\t\t\t\"bills\",\n\t\t\t\"payment\",\n\t\t\t\"sale\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t35\n\t\t]\n\t},\n\tface_with_monocle: {\n\t\ta: \"Face with Monocle\",\n\t\tb: \"1F9D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t49\n\t\t],\n\t\to: 10\n\t},\n\tpolice_car: {\n\t\ta: \"Police Car\",\n\t\tb: \"1F693\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"enforcement\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t27\n\t\t]\n\t},\n\tarrow_up_small: {\n\t\ta: \"Up-Pointing Small Red Triangle\",\n\t\tb: \"1F53C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"triangle\",\n\t\t\t\"direction\",\n\t\t\t\"point\",\n\t\t\t\"forward\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-fm\": {\n\t\ta: \"Micronesia Flag\",\n\t\tb: \"1F1EB-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t4\n\t\t]\n\t},\n\tglass_of_milk: {\n\t\ta: \"Glass of Milk\",\n\t\tb: \"1F95B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t7\n\t\t],\n\t\to: 9\n\t},\n\tcredit_card: {\n\t\ta: \"Credit Card\",\n\t\tb: \"1F4B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"bill\",\n\t\t\t\"payment\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t30\n\t\t]\n\t},\n\toncoming_police_car: {\n\t\ta: \"Oncoming Police Car\",\n\t\tb: \"1F694\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"enforcement\",\n\t\t\t\"911\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t28\n\t\t]\n\t},\n\tbug: {\n\t\ta: \"Bug\",\n\t\tb: \"1F41B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"worm\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t5\n\t\t]\n\t},\n\tnerd_face: {\n\t\ta: \"Nerd Face\",\n\t\tb: \"1F913\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"nerdy\",\n\t\t\t\"geek\",\n\t\t\t\"dork\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t27\n\t\t],\n\t\to: 8\n\t},\n\tarrow_double_up: {\n\t\ta: \"Black Up-Pointing Double Triangle\",\n\t\tb: \"23EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t47\n\t\t]\n\t},\n\tchart: {\n\t\ta: \"Chart with Upwards Trend and Yen Sign\",\n\t\tb: \"1F4B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"green-square\",\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-fo\": {\n\t\ta: \"Faroe Islands Flag\",\n\t\tb: \"1F1EB-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t5\n\t\t]\n\t},\n\tant: {\n\t\ta: \"Ant\",\n\t\tb: \"1F41C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"bug\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t6\n\t\t]\n\t},\n\tarrow_down_small: {\n\t\ta: \"Down-Pointing Small Red Triangle\",\n\t\tb: \"1F53D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t11\n\t\t]\n\t},\n\tsmiling_imp: {\n\t\ta: \"Smiling Face with Horns\",\n\t\tb: \"1F608\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"devil\",\n\t\t\t\"horns\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t32\n\t\t]\n\t},\n\ttaxi: {\n\t\ta: \"Taxi\",\n\t\tb: \"1F695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"uber\",\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t29\n\t\t]\n\t},\n\tcoffee: {\n\t\ta: \"Hot Beverage\",\n\t\tb: \"2615\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"caffeine\",\n\t\t\t\"latte\",\n\t\t\t\"espresso\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t24\n\t\t],\n\t\to: 4\n\t},\n\tfr: {\n\t\ta: \"France Flag\",\n\t\tb: \"1F1EB-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"banner\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"france\",\n\t\t\t\"french\",\n\t\t\t\"country\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t6\n\t\t],\n\t\tn: [\n\t\t\t\"flag-fr\"\n\t\t]\n\t},\n\toncoming_taxi: {\n\t\ta: \"Oncoming Taxi\",\n\t\tb: \"1F696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"uber\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t30\n\t\t]\n\t},\n\tarrow_double_down: {\n\t\ta: \"Black Down-Pointing Double Triangle\",\n\t\tb: \"23EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t48\n\t\t]\n\t},\n\timp: {\n\t\ta: \"Imp\",\n\t\tb: \"1F47F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"devil\",\n\t\t\t\"angry\",\n\t\t\t\"horns\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t51\n\t\t]\n\t},\n\tcurrency_exchange: {\n\t\ta: \"Currency Exchange\",\n\t\tb: \"1F4B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t28\n\t\t]\n\t},\n\ttea: {\n\t\ta: \"Teacup Without Handle\",\n\t\tb: \"1F375\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"bowl\",\n\t\t\t\"breakfast\",\n\t\t\t\"green\",\n\t\t\t\"british\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t3\n\t\t]\n\t},\n\tbee: {\n\t\ta: \"Honeybee\",\n\t\tb: \"1F41D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t13,\n\t\t\t7\n\t\t],\n\t\tn: [\n\t\t\t\"honeybee\"\n\t\t]\n\t},\n\theavy_dollar_sign: {\n\t\ta: \"Heavy Dollar Sign\",\n\t\tb: \"1F4B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"payment\",\n\t\t\t\"currency\",\n\t\t\t\"buck\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t29\n\t\t]\n\t},\n\tcar: {\n\t\ta: \"Automobile\",\n\t\tb: \"1F697\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t34,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"red_car\"\n\t\t]\n\t},\n\tsake: {\n\t\ta: \"Sake Bottle and Cup\",\n\t\tb: \"1F376\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wine\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"beverage\",\n\t\t\t\"japanese\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-ga\": {\n\t\ta: \"Gabon Flag\",\n\t\tb: \"1F1EC-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t7\n\t\t]\n\t},\n\tbeetle: {\n\t\ta: \"Lady Beetle\",\n\t\tb: \"1F41E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"ladybug\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t8\n\t\t]\n\t},\n\tjapanese_ogre: {\n\t\ta: \"Japanese Ogre\",\n\t\tb: \"1F479\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monster\",\n\t\t\t\"red\",\n\t\t\t\"mask\",\n\t\t\t\"halloween\",\n\t\t\t\"scary\",\n\t\t\t\"creepy\",\n\t\t\t\"devil\",\n\t\t\t\"demon\",\n\t\t\t\"japanese\",\n\t\t\t\"ogre\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t40\n\t\t]\n\t},\n\tdouble_vertical_bar: {\n\t\ta: \"Double Vertical Bar\",\n\t\tb: \"23F8-FE0F\",\n\t\tc: \"23F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\tchampagne: {\n\t\ta: \"Bottle with Popping Cork\",\n\t\tb: \"1F37E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"wine\",\n\t\t\t\"bottle\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t12\n\t\t],\n\t\to: 8\n\t},\n\tjapanese_goblin: {\n\t\ta: \"Japanese Goblin\",\n\t\tb: \"1F47A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red\",\n\t\t\t\"evil\",\n\t\t\t\"mask\",\n\t\t\t\"monster\",\n\t\t\t\"scary\",\n\t\t\t\"creepy\",\n\t\t\t\"japanese\",\n\t\t\t\"goblin\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t41\n\t\t]\n\t},\n\tblack_square_for_stop: {\n\t\ta: \"Black Square for Stop\",\n\t\tb: \"23F9-FE0F\",\n\t\tc: \"23F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\toncoming_automobile: {\n\t\ta: \"Oncoming Automobile\",\n\t\tb: \"1F698\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"car\",\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t32\n\t\t]\n\t},\n\temail: {\n\t\ta: \"Envelope\",\n\t\tb: \"2709-FE0F\",\n\t\tc: \"2709\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"letter\",\n\t\t\t\"postal\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t17\n\t\t],\n\t\tn: [\n\t\t\t\"envelope\"\n\t\t],\n\t\to: 1\n\t},\n\tcricket: {\n\t\ta: \"Cricket\",\n\t\tb: \"1F997\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t47\n\t\t],\n\t\to: 10\n\t},\n\tgb: {\n\t\ta: \"United Kingdom Flag\",\n\t\tb: \"1F1EC-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t8\n\t\t],\n\t\tn: [\n\t\t\t\"uk\",\n\t\t\t\"flag-gb\"\n\t\t]\n\t},\n\tblack_circle_for_record: {\n\t\ta: \"Black Circle for Record\",\n\t\tb: \"23FA-FE0F\",\n\t\tc: \"23FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-gd\": {\n\t\ta: \"Grenada Flag\",\n\t\tb: \"1F1EC-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t9\n\t\t]\n\t},\n\tspider: {\n\t\ta: \"Spider\",\n\t\tb: \"1F577-FE0F\",\n\t\tc: \"1F577\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"arachnid\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tblue_car: {\n\t\ta: \"Recreational Vehicle\",\n\t\tb: \"1F699\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t33\n\t\t]\n\t},\n\tskull: {\n\t\ta: \"Skull\",\n\t\tb: \"1F480\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dead\",\n\t\t\t\"skeleton\",\n\t\t\t\"creepy\",\n\t\t\t\"death\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t0\n\t\t]\n\t},\n\t\"e-mail\": {\n\t\ta: \"E-Mail Symbol\",\n\t\tb: \"1F4E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t30\n\t\t]\n\t},\n\twine_glass: {\n\t\ta: \"Wine Glass\",\n\t\tb: \"1F377\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"beverage\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t5\n\t\t]\n\t},\n\tspider_web: {\n\t\ta: \"Spider Web\",\n\t\tb: \"1F578-FE0F\",\n\t\tc: \"1F578\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"arachnid\",\n\t\t\t\"silk\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t19\n\t\t],\n\t\to: 7\n\t},\n\tcocktail: {\n\t\ta: \"Cocktail Glass\",\n\t\tb: \"1F378\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"beverage\",\n\t\t\t\"booze\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t6\n\t\t]\n\t},\n\tskull_and_crossbones: {\n\t\ta: \"Skull and Crossbones\",\n\t\tb: \"2620-FE0F\",\n\t\tc: \"2620\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"poison\",\n\t\t\t\"danger\",\n\t\t\t\"deadly\",\n\t\t\t\"scary\",\n\t\t\t\"death\",\n\t\t\t\"pirate\",\n\t\t\t\"evil\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t32\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ge\": {\n\t\ta: \"Georgia Flag\",\n\t\tb: \"1F1EC-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t10\n\t\t]\n\t},\n\teject: {\n\t\ta: \"Eject\",\n\t\tb: \"23CF-FE0F\",\n\t\tc: \"23CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t44\n\t\t],\n\t\to: 4\n\t},\n\ttruck: {\n\t\ta: \"Delivery Truck\",\n\t\tb: \"1F69A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cars\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t34\n\t\t]\n\t},\n\tincoming_envelope: {\n\t\ta: \"Incoming Envelope\",\n\t\tb: \"1F4E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t31\n\t\t]\n\t},\n\ttropical_drink: {\n\t\ta: \"Tropical Drink\",\n\t\tb: \"1F379\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"cocktail\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t7\n\t\t]\n\t},\n\tscorpion: {\n\t\ta: \"Scorpion\",\n\t\tb: \"1F982\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"arachnid\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t26\n\t\t],\n\t\to: 8\n\t},\n\tcinema: {\n\t\ta: \"Cinema\",\n\t\tb: \"1F3A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"record\",\n\t\t\t\"film\",\n\t\t\t\"movie\",\n\t\t\t\"curtain\",\n\t\t\t\"stage\",\n\t\t\t\"theater\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t0\n\t\t]\n\t},\n\tarticulated_lorry: {\n\t\ta: \"Articulated Lorry\",\n\t\tb: \"1F69B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\",\n\t\t\t\"express\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t35\n\t\t]\n\t},\n\tenvelope_with_arrow: {\n\t\ta: \"Envelope with Downwards Arrow Above\",\n\t\tb: \"1F4E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t32\n\t\t]\n\t},\n\tghost: {\n\t\ta: \"Ghost\",\n\t\tb: \"1F47B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"halloween\",\n\t\t\t\"spooky\",\n\t\t\t\"scary\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t42\n\t\t]\n\t},\n\t\"flag-gf\": {\n\t\ta: \"French Guiana Flag\",\n\t\tb: \"1F1EC-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t11\n\t\t]\n\t},\n\tbouquet: {\n\t\ta: \"Bouquet\",\n\t\tb: \"1F490\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"nature\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t42\n\t\t]\n\t},\n\ttractor: {\n\t\ta: \"Tractor\",\n\t\tb: \"1F69C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"car\",\n\t\t\t\"farming\",\n\t\t\t\"agriculture\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t36\n\t\t]\n\t},\n\tbeer: {\n\t\ta: \"Beer Mug\",\n\t\tb: \"1F37A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"relax\",\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"party\",\n\t\t\t\"pub\",\n\t\t\t\"summer\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t8\n\t\t]\n\t},\n\toutbox_tray: {\n\t\ta: \"Outbox Tray\",\n\t\tb: \"1F4E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"inbox\",\n\t\t\t\"email\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t27\n\t\t]\n\t},\n\tlow_brightness: {\n\t\ta: \"Low Brightness Symbol\",\n\t\tb: \"1F505\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sun\",\n\t\t\t\"afternoon\",\n\t\t\t\"warm\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t7\n\t\t]\n\t},\n\talien: {\n\t\ta: \"Extraterrestrial Alien\",\n\t\tb: \"1F47D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"UFO\",\n\t\t\t\"paul\",\n\t\t\t\"weird\",\n\t\t\t\"outer_space\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t49\n\t\t]\n\t},\n\t\"flag-gg\": {\n\t\ta: \"Guernsey Flag\",\n\t\tb: \"1F1EC-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t12\n\t\t]\n\t},\n\tcherry_blossom: {\n\t\ta: \"Cherry Blossom\",\n\t\tb: \"1F338\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"spring\",\n\t\t\t\"flower\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t46\n\t\t]\n\t},\n\tinbox_tray: {\n\t\ta: \"Inbox Tray\",\n\t\tb: \"1F4E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"documents\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-gh\": {\n\t\ta: \"Ghana Flag\",\n\t\tb: \"1F1EC-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t13\n\t\t]\n\t},\n\tbike: {\n\t\ta: \"Bicycle\",\n\t\tb: \"1F6B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"bicycle\",\n\t\t\t\"exercise\",\n\t\t\t\"hipster\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t23\n\t\t]\n\t},\n\tspace_invader: {\n\t\ta: \"Alien Monster\",\n\t\tb: \"1F47E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"arcade\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t50\n\t\t]\n\t},\n\tbeers: {\n\t\ta: \"Clinking Beer Mugs\",\n\t\tb: \"1F37B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"relax\",\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"party\",\n\t\t\t\"pub\",\n\t\t\t\"summer\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t9\n\t\t]\n\t},\n\thigh_brightness: {\n\t\ta: \"High Brightness Symbol\",\n\t\tb: \"1F506\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sun\",\n\t\t\t\"light\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t8\n\t\t]\n\t},\n\t\"package\": {\n\t\ta: \"Package\",\n\t\tb: \"1F4E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mail\",\n\t\t\t\"gift\",\n\t\t\t\"cardboard\",\n\t\t\t\"box\",\n\t\t\t\"moving\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t29\n\t\t]\n\t},\n\tscooter: {\n\t\ta: \"Scooter\",\n\t\tb: \"1F6F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t19\n\t\t],\n\t\to: 9\n\t},\n\twhite_flower: {\n\t\ta: \"White Flower\",\n\t\tb: \"1F4AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t25\n\t\t]\n\t},\n\tclinking_glasses: {\n\t\ta: \"Clinking Glasses\",\n\t\tb: \"1F942\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"party\",\n\t\t\t\"alcohol\",\n\t\t\t\"celebrate\",\n\t\t\t\"cheers\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\trobot_face: {\n\t\ta: \"Robot Face\",\n\t\tb: \"1F916\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t30\n\t\t],\n\t\to: 8\n\t},\n\tsignal_strength: {\n\t\ta: \"Antenna with Bars\",\n\t\tb: \"1F4F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"reception\",\n\t\t\t\"phone\",\n\t\t\t\"internet\",\n\t\t\t\"connection\",\n\t\t\t\"wifi\",\n\t\t\t\"bluetooth\",\n\t\t\t\"bars\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t45\n\t\t]\n\t},\n\t\"flag-gi\": {\n\t\ta: \"Gibraltar Flag\",\n\t\tb: \"1F1EC-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t14\n\t\t]\n\t},\n\t\"flag-gl\": {\n\t\ta: \"Greenland Flag\",\n\t\tb: \"1F1EC-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t15\n\t\t]\n\t},\n\tmotor_scooter: {\n\t\ta: \"Motor Scooter\",\n\t\tb: \"1F6F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"vespa\",\n\t\t\t\"sasha\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t20\n\t\t],\n\t\to: 9\n\t},\n\tmailbox: {\n\t\ta: \"Closed Mailbox with Raised Flag\",\n\t\tb: \"1F4EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t34\n\t\t]\n\t},\n\tvibration_mode: {\n\t\ta: \"Vibration Mode\",\n\t\tb: \"1F4F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"phone\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t42\n\t\t]\n\t},\n\thankey: {\n\t\ta: \"Pile of Poo\",\n\t\tb: \"1F4A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t25,\n\t\t\t15\n\t\t],\n\t\tn: [\n\t\t\t\"poop\",\n\t\t\t\"shit\"\n\t\t]\n\t},\n\trosette: {\n\t\ta: \"Rosette\",\n\t\tb: \"1F3F5-FE0F\",\n\t\tc: \"1F3F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"flower\",\n\t\t\t\"decoration\",\n\t\t\t\"military\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t20\n\t\t],\n\t\to: 7\n\t},\n\ttumbler_glass: {\n\t\ta: \"Tumbler Glass\",\n\t\tb: \"1F943\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"beverage\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"liquor\",\n\t\t\t\"booze\",\n\t\t\t\"bourbon\",\n\t\t\t\"scotch\",\n\t\t\t\"whisky\",\n\t\t\t\"glass\",\n\t\t\t\"shot\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t39\n\t\t],\n\t\to: 9\n\t},\n\tcup_with_straw: {\n\t\ta: \"Cup with Straw\",\n\t\tb: \"1F964\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-gm\": {\n\t\ta: \"Gambia Flag\",\n\t\tb: \"1F1EC-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t16\n\t\t]\n\t},\n\tmailbox_closed: {\n\t\ta: \"Closed Mailbox with Lowered Flag\",\n\t\tb: \"1F4EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"communication\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t33\n\t\t]\n\t},\n\tmobile_phone_off: {\n\t\ta: \"Mobile Phone off\",\n\t\tb: \"1F4F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mute\",\n\t\t\t\"orange-square\",\n\t\t\t\"silence\",\n\t\t\t\"quiet\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t43\n\t\t]\n\t},\n\tbusstop: {\n\t\ta: \"Bus Stop\",\n\t\tb: \"1F68F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"wait\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t23\n\t\t]\n\t},\n\tsmiley_cat: {\n\t\ta: \"Smiling Cat Face with Open Mouth\",\n\t\tb: \"1F63A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"happy\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t30\n\t\t]\n\t},\n\trose: {\n\t\ta: \"Rose\",\n\t\tb: \"1F339\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"valentines\",\n\t\t\t\"love\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t47\n\t\t]\n\t},\n\tmotorway: {\n\t\ta: \"Motorway\",\n\t\tb: \"1F6E3-FE0F\",\n\t\tc: \"1F6E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"road\",\n\t\t\t\"cupertino\",\n\t\t\t\"interstate\",\n\t\t\t\"highway\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\tsmile_cat: {\n\t\ta: \"Grinning Cat Face with Smiling Eyes\",\n\t\tb: \"1F638\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-gn\": {\n\t\ta: \"Guinea Flag\",\n\t\tb: \"1F1EC-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t17\n\t\t]\n\t},\n\twilted_flower: {\n\t\ta: \"Wilted Flower\",\n\t\tb: \"1F940\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"flower\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\tmailbox_with_mail: {\n\t\ta: \"Open Mailbox with Raised Flag\",\n\t\tb: \"1F4EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t35\n\t\t]\n\t},\n\tchopsticks: {\n\t\ta: \"Chopsticks\",\n\t\tb: \"1F962\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t14\n\t\t],\n\t\to: 10\n\t},\n\tfemale_sign: {\n\t\ta: \"Female Sign\",\n\t\tb: \"2640-FE0F\",\n\t\tc: \"2640\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\tmailbox_with_no_mail: {\n\t\ta: \"Open Mailbox with Lowered Flag\",\n\t\tb: \"1F4ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t36\n\t\t]\n\t},\n\tknife_fork_plate: {\n\t\ta: \"Knife Fork Plate\",\n\t\tb: \"1F37D-FE0F\",\n\t\tc: \"1F37D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\thibiscus: {\n\t\ta: \"Hibiscus\",\n\t\tb: \"1F33A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"flowers\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-gp\": {\n\t\ta: \"Guadeloupe Flag\",\n\t\tb: \"1F1EC-1F1F5\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t18\n\t\t]\n\t},\n\trailway_track: {\n\t\ta: \"Railway Track\",\n\t\tb: \"1F6E4-FE0F\",\n\t\tc: \"1F6E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"train\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tmale_sign: {\n\t\ta: \"Male Sign\",\n\t\tb: \"2642-FE0F\",\n\t\tc: \"2642\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\tjoy_cat: {\n\t\ta: \"Cat Face with Tears of Joy\",\n\t\tb: \"1F639\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"haha\",\n\t\t\t\"happy\",\n\t\t\t\"tears\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t29\n\t\t]\n\t},\n\tfuelpump: {\n\t\ta: \"Fuel Pump\",\n\t\tb: \"26FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gas station\",\n\t\t\t\"petroleum\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t13\n\t\t],\n\t\to: 5\n\t},\n\tsunflower: {\n\t\ta: \"Sunflower\",\n\t\tb: \"1F33B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t49\n\t\t]\n\t},\n\tpostbox: {\n\t\ta: \"Postbox\",\n\t\tb: \"1F4EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"letter\",\n\t\t\t\"envelope\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-gq\": {\n\t\ta: \"Equatorial Guinea Flag\",\n\t\tb: \"1F1EC-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t19\n\t\t]\n\t},\n\theart_eyes_cat: {\n\t\ta: \"Smiling Cat Face with Heart-Shaped Eyes\",\n\t\tb: \"1F63B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"cats\",\n\t\t\t\"valentines\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t31\n\t\t]\n\t},\n\tfork_and_knife: {\n\t\ta: \"Fork and Knife\",\n\t\tb: \"1F374\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t2\n\t\t]\n\t},\n\tmedical_symbol: {\n\t\ta: \"Medical Symbol\",\n\t\tb: \"2695-FE0F\",\n\t\tc: \"2695\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t14\n\t\t],\n\t\tn: [\n\t\t\t\"staff_of_aesculapius\"\n\t\t],\n\t\to: 4\n\t},\n\trecycle: {\n\t\ta: \"Black Universal Recycling Symbol\",\n\t\tb: \"267B-FE0F\",\n\t\tc: \"267B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"environment\",\n\t\t\t\"garbage\",\n\t\t\t\"trash\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t9\n\t\t],\n\t\to: 3\n\t},\n\tspoon: {\n\t\ta: \"Spoon\",\n\t\tb: \"1F944\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\",\n\t\t\t\"tableware\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t40\n\t\t],\n\t\to: 9\n\t},\n\tblossom: {\n\t\ta: \"Blossom\",\n\t\tb: \"1F33C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"flowers\",\n\t\t\t\"yellow\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t50\n\t\t]\n\t},\n\trotating_light: {\n\t\ta: \"Police Cars Revolving Light\",\n\t\tb: \"1F6A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"police\",\n\t\t\t\"ambulance\",\n\t\t\t\"911\",\n\t\t\t\"emergency\",\n\t\t\t\"alert\",\n\t\t\t\"error\",\n\t\t\t\"pinged\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t13\n\t\t]\n\t},\n\tsmirk_cat: {\n\t\ta: \"Cat Face with Wry Smile\",\n\t\tb: \"1F63C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"smirk\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t32\n\t\t]\n\t},\n\tballot_box_with_ballot: {\n\t\ta: \"Ballot Box with Ballot\",\n\t\tb: \"1F5F3-FE0F\",\n\t\tc: \"1F5F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-gr\": {\n\t\ta: \"Greece Flag\",\n\t\tb: \"1F1EC-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t20\n\t\t]\n\t},\n\tkissing_cat: {\n\t\ta: \"Kissing Cat Face with Closed Eyes\",\n\t\tb: \"1F63D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t33\n\t\t]\n\t},\n\tpencil2: {\n\t\ta: \"Pencil\",\n\t\tb: \"270F-FE0F\",\n\t\tc: \"270F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"write\",\n\t\t\t\"paper\",\n\t\t\t\"writing\",\n\t\t\t\"school\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\ttraffic_light: {\n\t\ta: \"Horizontal Traffic Light\",\n\t\tb: \"1F6A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"signal\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t10\n\t\t]\n\t},\n\tfleur_de_lis: {\n\t\ta: \"Fleur De Lis\",\n\t\tb: \"269C-FE0F\",\n\t\tc: \"269C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"decorative\",\n\t\t\t\"scout\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t19\n\t\t],\n\t\to: 4\n\t},\n\ttulip: {\n\t\ta: \"Tulip\",\n\t\tb: \"1F337\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"summer\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t45\n\t\t]\n\t},\n\thocho: {\n\t\ta: \"Hocho\",\n\t\tb: \"1F52A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"knife\",\n\t\t\t\"blade\",\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\",\n\t\t\t\"weapon\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t44\n\t\t],\n\t\tn: [\n\t\t\t\"knife\"\n\t\t]\n\t},\n\t\"flag-gs\": {\n\t\ta: \"South Georgia & South Sandwich Islands Flag\",\n\t\tb: \"1F1EC-1F1F8\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t21\n\t\t]\n\t},\n\tseedling: {\n\t\ta: \"Seedling\",\n\t\tb: \"1F331\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t39\n\t\t]\n\t},\n\tamphora: {\n\t\ta: \"Amphora\",\n\t\tb: \"1F3FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vase\",\n\t\t\t\"jar\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tscream_cat: {\n\t\ta: \"Weary Cat Face\",\n\t\tb: \"1F640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"munch\",\n\t\t\t\"scared\",\n\t\t\t\"scream\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t36\n\t\t]\n\t},\n\tvertical_traffic_light: {\n\t\ta: \"Vertical Traffic Light\",\n\t\tb: \"1F6A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"driving\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t11\n\t\t]\n\t},\n\tblack_nib: {\n\t\ta: \"Black Nib\",\n\t\tb: \"2712-FE0F\",\n\t\tc: \"2712\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pen\",\n\t\t\t\"stationery\",\n\t\t\t\"writing\",\n\t\t\t\"write\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-gt\": {\n\t\ta: \"Guatemala Flag\",\n\t\tb: \"1F1EC-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t22\n\t\t]\n\t},\n\ttrident: {\n\t\ta: \"Trident Emblem\",\n\t\tb: \"1F531\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weapon\",\n\t\t\t\"spear\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t51\n\t\t]\n\t},\n\t\"flag-gu\": {\n\t\ta: \"Guam Flag\",\n\t\tb: \"1F1EC-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t23\n\t\t]\n\t},\n\tname_badge: {\n\t\ta: \"Name Badge\",\n\t\tb: \"1F4DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fire\",\n\t\t\t\"forbid\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t18\n\t\t]\n\t},\n\tconstruction: {\n\t\ta: \"Construction Sign\",\n\t\tb: \"1F6A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wip\",\n\t\t\t\"progress\",\n\t\t\t\"caution\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t12\n\t\t]\n\t},\n\tlower_left_fountain_pen: {\n\t\ta: \"Lower Left Fountain Pen\",\n\t\tb: \"1F58B-FE0F\",\n\t\tc: \"1F58B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t29\n\t\t],\n\t\to: 7\n\t},\n\tevergreen_tree: {\n\t\ta: \"Evergreen Tree\",\n\t\tb: \"1F332\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t40\n\t\t]\n\t},\n\tcrying_cat_face: {\n\t\ta: \"Crying Cat Face\",\n\t\tb: \"1F63F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"tears\",\n\t\t\t\"weep\",\n\t\t\t\"sad\",\n\t\t\t\"cats\",\n\t\t\t\"upset\",\n\t\t\t\"cry\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t35\n\t\t]\n\t},\n\t\"flag-gw\": {\n\t\ta: \"Guinea-Bissau Flag\",\n\t\tb: \"1F1EC-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t24\n\t\t]\n\t},\n\tlower_left_ballpoint_pen: {\n\t\ta: \"Lower Left Ballpoint Pen\",\n\t\tb: \"1F58A-FE0F\",\n\t\tc: \"1F58A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t28\n\t\t],\n\t\to: 7\n\t},\n\tpouting_cat: {\n\t\ta: \"Pouting Cat Face\",\n\t\tb: \"1F63E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t34\n\t\t]\n\t},\n\tdeciduous_tree: {\n\t\ta: \"Deciduous Tree\",\n\t\tb: \"1F333\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t41\n\t\t]\n\t},\n\toctagonal_sign: {\n\t\ta: \"Octagonal Sign\",\n\t\tb: \"1F6D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\tbeginner: {\n\t\ta: \"Japanese Symbol for Beginner\",\n\t\tb: \"1F530\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"badge\",\n\t\t\t\"shield\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-gy\": {\n\t\ta: \"Guyana Flag\",\n\t\tb: \"1F1EC-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t25\n\t\t]\n\t},\n\tlower_left_paintbrush: {\n\t\ta: \"Lower Left Paintbrush\",\n\t\tb: \"1F58C-FE0F\",\n\t\tc: \"1F58C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\to: {\n\t\ta: \"Heavy Large Circle\",\n\t\tb: \"2B55\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"circle\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t23\n\t\t],\n\t\to: 5\n\t},\n\tpalm_tree: {\n\t\ta: \"Palm Tree\",\n\t\tb: \"1F334\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"mojito\",\n\t\t\t\"tropical\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t42\n\t\t]\n\t},\n\tanchor: {\n\t\ta: \"Anchor\",\n\t\tb: \"2693\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ship\",\n\t\t\t\"ferry\",\n\t\t\t\"sea\",\n\t\t\t\"boat\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t12\n\t\t],\n\t\to: 4\n\t},\n\tsee_no_evil: {\n\t\ta: \"See-No-Evil Monkey\",\n\t\tb: \"1F648\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monkey\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"haha\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t43\n\t\t]\n\t},\n\tboat: {\n\t\ta: \"Sailboat\",\n\t\tb: \"26F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t48,\n\t\t\t43\n\t\t],\n\t\tn: [\n\t\t\t\"sailboat\"\n\t\t],\n\t\to: 5\n\t},\n\twhite_check_mark: {\n\t\ta: \"White Heavy Check Mark\",\n\t\tb: \"2705\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"green-square\",\n\t\t\t\"ok\",\n\t\t\t\"agree\",\n\t\t\t\"vote\",\n\t\t\t\"election\",\n\t\t\t\"answer\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-hk\": {\n\t\ta: \"Hong Kong Sar China Flag\",\n\t\tb: \"1F1ED-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t26\n\t\t]\n\t},\n\tlower_left_crayon: {\n\t\ta: \"Lower Left Crayon\",\n\t\tb: \"1F58D-FE0F\",\n\t\tc: \"1F58D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t31\n\t\t],\n\t\to: 7\n\t},\n\thear_no_evil: {\n\t\ta: \"Hear-No-Evil Monkey\",\n\t\tb: \"1F649\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"monkey\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t44\n\t\t]\n\t},\n\tcactus: {\n\t\ta: \"Cactus\",\n\t\tb: \"1F335\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t43\n\t\t]\n\t},\n\tear_of_rice: {\n\t\ta: \"Ear of Rice\",\n\t\tb: \"1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t0\n\t\t]\n\t},\n\tspeak_no_evil: {\n\t\ta: \"Speak-No-Evil Monkey\",\n\t\tb: \"1F64A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monkey\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"omg\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t45\n\t\t]\n\t},\n\t\"flag-hm\": {\n\t\ta: \"Heard & Mcdonald Islands Flag\",\n\t\tb: \"1F1ED-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t27\n\t\t]\n\t},\n\tballot_box_with_check: {\n\t\ta: \"Ballot Box with Check\",\n\t\tb: \"2611-FE0F\",\n\t\tc: \"2611\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"agree\",\n\t\t\t\"confirm\",\n\t\t\t\"black-square\",\n\t\t\t\"vote\",\n\t\t\t\"election\",\n\t\t\t\"yes\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t22\n\t\t],\n\t\to: 1\n\t},\n\tcanoe: {\n\t\ta: \"Canoe\",\n\t\tb: \"1F6F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boat\",\n\t\t\t\"paddle\",\n\t\t\t\"water\",\n\t\t\t\"ship\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t21\n\t\t],\n\t\to: 9\n\t},\n\tmemo: {\n\t\ta: \"Memo\",\n\t\tb: \"1F4DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"write\",\n\t\t\t\"documents\",\n\t\t\t\"stationery\",\n\t\t\t\"pencil\",\n\t\t\t\"paper\",\n\t\t\t\"writing\",\n\t\t\t\"legal\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\",\n\t\t\t\"study\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t20\n\t\t],\n\t\tn: [\n\t\t\t\"pencil\"\n\t\t]\n\t},\n\therb: {\n\t\ta: \"Herb\",\n\t\tb: \"1F33F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"medicine\",\n\t\t\t\"weed\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-hn\": {\n\t\ta: \"Honduras Flag\",\n\t\tb: \"1F1ED-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t28\n\t\t]\n\t},\n\theavy_check_mark: {\n\t\ta: \"Heavy Check Mark\",\n\t\tb: \"2714-FE0F\",\n\t\tc: \"2714\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"nike\",\n\t\t\t\"answer\",\n\t\t\t\"yes\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t44\n\t\t],\n\t\to: 1\n\t},\n\tbriefcase: {\n\t\ta: \"Briefcase\",\n\t\tb: \"1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"documents\",\n\t\t\t\"work\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"job\",\n\t\t\t\"career\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t39\n\t\t]\n\t},\n\tspeedboat: {\n\t\ta: \"Speedboat\",\n\t\tb: \"1F6A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ship\",\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t9\n\t\t]\n\t},\n\tbaby: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F476-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F476-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F476-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F476-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F476-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Baby\",\n\t\tb: \"1F476\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"child\",\n\t\t\t\"boy\",\n\t\t\t\"girl\",\n\t\t\t\"toddler\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t10\n\t\t]\n\t},\n\theavy_multiplication_x: {\n\t\ta: \"Heavy Multiplication X\",\n\t\tb: \"2716-FE0F\",\n\t\tc: \"2716\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t45\n\t\t],\n\t\to: 1\n\t},\n\tchild: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D2-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D2-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D2-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D2-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D2-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Child\",\n\t\tb: \"1F9D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t4\n\t\t],\n\t\to: 10\n\t},\n\tshamrock: {\n\t\ta: \"Shamrock\",\n\t\tb: \"2618-FE0F\",\n\t\tc: \"2618\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"irish\",\n\t\t\t\"clover\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t25\n\t\t],\n\t\to: 4\n\t},\n\tpassenger_ship: {\n\t\ta: \"Passenger Ship\",\n\t\tb: \"1F6F3-FE0F\",\n\t\tc: \"1F6F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"yacht\",\n\t\t\t\"cruise\",\n\t\t\t\"ferry\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-hr\": {\n\t\ta: \"Croatia Flag\",\n\t\tb: \"1F1ED-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t29\n\t\t]\n\t},\n\tfile_folder: {\n\t\ta: \"File Folder\",\n\t\tb: \"1F4C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"business\",\n\t\t\t\"office\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t44\n\t\t]\n\t},\n\tx: {\n\t\ta: \"Cross Mark\",\n\t\tb: \"274C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"no\",\n\t\t\t\"delete\",\n\t\t\t\"remove\",\n\t\t\t\"cancel\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t1\n\t\t]\n\t},\n\tfour_leaf_clover: {\n\t\ta: \"Four Leaf Clover\",\n\t\tb: \"1F340\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"lucky\",\n\t\t\t\"irish\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t2\n\t\t]\n\t},\n\topen_file_folder: {\n\t\ta: \"Open File Folder\",\n\t\tb: \"1F4C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"load\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t45\n\t\t]\n\t},\n\tboy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F466-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F466-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F466-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F466-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F466-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Boy\",\n\t\tb: \"1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"guy\",\n\t\t\t\"teenager\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t42\n\t\t]\n\t},\n\tferry: {\n\t\ta: \"Ferry\",\n\t\tb: \"26F4-FE0F\",\n\t\tc: \"26F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boat\",\n\t\t\t\"ship\",\n\t\t\t\"yacht\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t42\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-ht\": {\n\t\ta: \"Haiti Flag\",\n\t\tb: \"1F1ED-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t30\n\t\t]\n\t},\n\tgirl: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F467-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F467-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F467-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F467-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fe.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F467-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3ff.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Girl\",\n\t\tb: \"1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"woman\",\n\t\t\t\"teenager\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t48\n\t\t]\n\t},\n\tnegative_squared_cross_mark: {\n\t\ta: \"Negative Squared Cross Mark\",\n\t\tb: \"274E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"x\",\n\t\t\t\"green-square\",\n\t\t\t\"no\",\n\t\t\t\"deny\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-hu\": {\n\t\ta: \"Hungary Flag\",\n\t\tb: \"1F1ED-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t31\n\t\t]\n\t},\n\tcard_index_dividers: {\n\t\ta: \"Card Index Dividers\",\n\t\tb: \"1F5C2-FE0F\",\n\t\tc: \"1F5C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"organizing\",\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\tmaple_leaf: {\n\t\ta: \"Maple Leaf\",\n\t\tb: \"1F341\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"ca\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t3\n\t\t]\n\t},\n\tmotor_boat: {\n\t\ta: \"Motor Boat\",\n\t\tb: \"1F6E5-FE0F\",\n\t\tc: \"1F6E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"ship\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ic\": {\n\t\ta: \"Canary Islands Flag\",\n\t\tb: \"1F1EE-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t32\n\t\t]\n\t},\n\tfallen_leaf: {\n\t\ta: \"Fallen Leaf\",\n\t\tb: \"1F342\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"leaves\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t4\n\t\t]\n\t},\n\tadult: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D1-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fb.png\",\n\t\t\t\tsheet_x: 42,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D1-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D1-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D1-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D1-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Adult\",\n\t\tb: \"1F9D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t50\n\t\t],\n\t\to: 10\n\t},\n\tship: {\n\t\ta: \"Ship\",\n\t\tb: \"1F6A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"titanic\",\n\t\t\t\"deploy\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t42\n\t\t]\n\t},\n\theavy_plus_sign: {\n\t\ta: \"Heavy Plus Sign\",\n\t\tb: \"2795\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\",\n\t\t\t\"addition\",\n\t\t\t\"more\",\n\t\t\t\"increase\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t9\n\t\t]\n\t},\n\tdate: {\n\t\ta: \"Calendar\",\n\t\tb: \"1F4C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"calendar\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t48\n\t\t]\n\t},\n\tman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Man\",\n\t\tb: \"1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mustache\",\n\t\t\t\"father\",\n\t\t\t\"dad\",\n\t\t\t\"guy\",\n\t\t\t\"classy\",\n\t\t\t\"sir\",\n\t\t\t\"moustache\"\n\t\t],\n\t\tk: [\n\t\t\t18,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-id\": {\n\t\ta: \"Indonesia Flag\",\n\t\tb: \"1F1EE-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t33\n\t\t]\n\t},\n\tleaves: {\n\t\ta: \"Leaf Fluttering in Wind\",\n\t\tb: \"1F343\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"tree\",\n\t\t\t\"vegetable\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t5\n\t\t]\n\t},\n\theavy_minus_sign: {\n\t\ta: \"Heavy Minus Sign\",\n\t\tb: \"2796\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\",\n\t\t\t\"subtract\",\n\t\t\t\"less\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t10\n\t\t]\n\t},\n\tcalendar: {\n\t\ta: \"Tear-off Calendar\",\n\t\tb: \"1F4C6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"schedule\",\n\t\t\t\"date\",\n\t\t\t\"planning\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t49\n\t\t]\n\t},\n\tairplane: {\n\t\ta: \"Airplane\",\n\t\tb: \"2708-FE0F\",\n\t\tc: \"2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\",\n\t\t\t\"flight\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t16\n\t\t],\n\t\to: 1\n\t},\n\tspiral_note_pad: {\n\t\ta: \"Spiral Note Pad\",\n\t\tb: \"1F5D2-FE0F\",\n\t\tc: \"1F5D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t8\n\t\t],\n\t\to: 7\n\t},\n\theavy_division_sign: {\n\t\ta: \"Heavy Division Sign\",\n\t\tb: \"2797\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"divide\",\n\t\t\t\"math\",\n\t\t\t\"calculation\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t11\n\t\t]\n\t},\n\tsmall_airplane: {\n\t\ta: \"Small Airplane\",\n\t\tb: \"1F6E9-FE0F\",\n\t\tc: \"1F6E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"flight\",\n\t\t\t\"transportation\",\n\t\t\t\"fly\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\twoman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Woman\",\n\t\tb: \"1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girls\",\n\t\t\t\"lady\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-ie\": {\n\t\ta: \"Ireland Flag\",\n\t\tb: \"1F1EE-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t34\n\t\t]\n\t},\n\tcurly_loop: {\n\t\ta: \"Curly Loop\",\n\t\tb: \"27B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"scribble\",\n\t\t\t\"draw\",\n\t\t\t\"shape\",\n\t\t\t\"squiggle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-il\": {\n\t\ta: \"Israel Flag\",\n\t\tb: \"1F1EE-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t35\n\t\t]\n\t},\n\tairplane_departure: {\n\t\ta: \"Airplane Departure\",\n\t\tb: \"1F6EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tspiral_calendar_pad: {\n\t\ta: \"Spiral Calendar Pad\",\n\t\tb: \"1F5D3-FE0F\",\n\t\tc: \"1F5D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t9\n\t\t],\n\t\to: 7\n\t},\n\tolder_adult: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Older Adult\",\n\t\tb: \"1F9D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tairplane_arriving: {\n\t\ta: \"Airplane Arriving\",\n\t\tb: \"1F6EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\tcard_index: {\n\t\ta: \"Card Index\",\n\t\tb: \"1F4C7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t50\n\t\t]\n\t},\n\tloop: {\n\t\ta: \"Double Curly Loop\",\n\t\tb: \"27BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tape\",\n\t\t\t\"cassette\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t14\n\t\t]\n\t},\n\tolder_man: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F474-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F474-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F474-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F474-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F474-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Older Man\",\n\t\tb: \"1F474\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"human\",\n\t\t\t\"male\",\n\t\t\t\"men\",\n\t\t\t\"old\",\n\t\t\t\"elder\",\n\t\t\t\"senior\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-im\": {\n\t\ta: \"Isle of Man Flag\",\n\t\tb: \"1F1EE-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-in\": {\n\t\ta: \"India Flag\",\n\t\tb: \"1F1EE-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t37\n\t\t]\n\t},\n\tchart_with_upwards_trend: {\n\t\ta: \"Chart with Upwards Trend\",\n\t\tb: \"1F4C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"recovery\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"good\",\n\t\t\t\"success\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t51\n\t\t]\n\t},\n\tpart_alternation_mark: {\n\t\ta: \"Part Alternation Mark\",\n\t\tb: \"303D-FE0F\",\n\t\tc: \"303D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"bad\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t25\n\t\t],\n\t\to: 3\n\t},\n\tseat: {\n\t\ta: \"Seat\",\n\t\tb: \"1F4BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sit\",\n\t\t\t\"airplane\",\n\t\t\t\"transport\",\n\t\t\t\"bus\",\n\t\t\t\"flight\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t37\n\t\t]\n\t},\n\tolder_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F475-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F475-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F475-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F475-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F475-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Older Woman\",\n\t\tb: \"1F475\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"human\",\n\t\t\t\"female\",\n\t\t\t\"women\",\n\t\t\t\"lady\",\n\t\t\t\"old\",\n\t\t\t\"elder\",\n\t\t\t\"senior\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t4\n\t\t]\n\t},\n\teight_spoked_asterisk: {\n\t\ta: \"Eight Spoked Asterisk\",\n\t\tb: \"2733-FE0F\",\n\t\tc: \"2733\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"star\",\n\t\t\t\"sparkle\",\n\t\t\t\"green-square\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t49\n\t\t],\n\t\to: 1\n\t},\n\tchart_with_downwards_trend: {\n\t\ta: \"Chart with Downwards Trend\",\n\t\tb: \"1F4C9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"recession\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bad\",\n\t\t\t\"failure\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t0\n\t\t]\n\t},\n\t\"flag-io\": {\n\t\ta: \"British Indian Ocean Territory Flag\",\n\t\tb: \"1F1EE-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t38\n\t\t]\n\t},\n\t\"male-doctor\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2695\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Doctor\",\n\t\tb: \"1F468-200D-2695-FE0F\",\n\t\tc: \"1F468-200D-2695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t43\n\t\t]\n\t},\n\thelicopter: {\n\t\ta: \"Helicopter\",\n\t\tb: \"1F681\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t9\n\t\t]\n\t},\n\t\"female-doctor\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2695\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Doctor\",\n\t\tb: \"1F469-200D-2695-FE0F\",\n\t\tc: \"1F469-200D-2695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t1\n\t\t]\n\t},\n\tsuspension_railway: {\n\t\ta: \"Suspension Railway\",\n\t\tb: \"1F69F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t39\n\t\t]\n\t},\n\tbar_chart: {\n\t\ta: \"Bar Chart\",\n\t\tb: \"1F4CA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-iq\": {\n\t\ta: \"Iraq Flag\",\n\t\tb: \"1F1EE-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t39\n\t\t]\n\t},\n\teight_pointed_black_star: {\n\t\ta: \"Eight Pointed Black Star\",\n\t\tb: \"2734-FE0F\",\n\t\tc: \"2734\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"shape\",\n\t\t\t\"polygon\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t50\n\t\t],\n\t\to: 1\n\t},\n\tmountain_cableway: {\n\t\ta: \"Mountain Cableway\",\n\t\tb: \"1F6A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"ski\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t40\n\t\t]\n\t},\n\t\"male-student\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Student\",\n\t\tb: \"1F468-200D-1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t14\n\t\t]\n\t},\n\tclipboard: {\n\t\ta: \"Clipboard\",\n\t\tb: \"1F4CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"documents\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-ir\": {\n\t\ta: \"Iran Flag\",\n\t\tb: \"1F1EE-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t40\n\t\t]\n\t},\n\tsparkle: {\n\t\ta: \"Sparkle\",\n\t\tb: \"2747-FE0F\",\n\t\tc: \"2747\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"green-square\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"fireworks\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t0\n\t\t],\n\t\to: 1\n\t},\n\t\"female-student\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Student\",\n\t\tb: \"1F469-200D-1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t29\n\t\t]\n\t},\n\tpushpin: {\n\t\ta: \"Pushpin\",\n\t\tb: \"1F4CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"mark\",\n\t\t\t\"here\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t3\n\t\t]\n\t},\n\taerial_tramway: {\n\t\ta: \"Aerial Tramway\",\n\t\tb: \"1F6A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"ski\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-is\": {\n\t\ta: \"Iceland Flag\",\n\t\tb: \"1F1EE-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t41\n\t\t]\n\t},\n\tbangbang: {\n\t\ta: \"Double Exclamation Mark\",\n\t\tb: \"203C-FE0F\",\n\t\tc: \"203C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"exclamation\",\n\t\t\t\"surprise\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t29\n\t\t],\n\t\to: 1\n\t},\n\tinterrobang: {\n\t\ta: \"Exclamation Question Mark\",\n\t\tb: \"2049-FE0F\",\n\t\tc: \"2049\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wat\",\n\t\t\t\"punctuation\",\n\t\t\t\"surprise\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t30\n\t\t],\n\t\to: 3\n\t},\n\tsatellite: {\n\t\ta: \"Satellite\",\n\t\tb: \"1F6F0-FE0F\",\n\t\tc: \"1F6F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"future\",\n\t\t\t\"radio\",\n\t\t\t\"space\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\tit: {\n\t\ta: \"Italy Flag\",\n\t\tb: \"1F1EE-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"italy\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t42\n\t\t],\n\t\tn: [\n\t\t\t\"flag-it\"\n\t\t]\n\t},\n\t\"male-teacher\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Teacher\",\n\t\tb: \"1F468-200D-1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t32\n\t\t]\n\t},\n\tround_pushpin: {\n\t\ta: \"Round Pushpin\",\n\t\tb: \"1F4CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"location\",\n\t\t\t\"map\",\n\t\t\t\"here\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-je\": {\n\t\ta: \"Jersey Flag\",\n\t\tb: \"1F1EF-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t43\n\t\t]\n\t},\n\tquestion: {\n\t\ta: \"Black Question Mark Ornament\",\n\t\tb: \"2753\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"doubt\",\n\t\t\t\"confused\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t3\n\t\t]\n\t},\n\trocket: {\n\t\ta: \"Rocket\",\n\t\tb: \"1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"launch\",\n\t\t\t\"ship\",\n\t\t\t\"staffmode\",\n\t\t\t\"NASA\",\n\t\t\t\"outer space\",\n\t\t\t\"outer_space\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t8\n\t\t]\n\t},\n\t\"female-teacher\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Teacher\",\n\t\tb: \"1F469-200D-1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t47\n\t\t]\n\t},\n\tpaperclip: {\n\t\ta: \"Paperclip\",\n\t\tb: \"1F4CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t5\n\t\t]\n\t},\n\tlinked_paperclips: {\n\t\ta: \"Linked Paperclips\",\n\t\tb: \"1F587-FE0F\",\n\t\tc: \"1F587\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t27\n\t\t],\n\t\to: 7\n\t},\n\tflying_saucer: {\n\t\ta: \"Flying Saucer\",\n\t\tb: \"1F6F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\t\"male-judge\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2696\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Judge\",\n\t\tb: \"1F468-200D-2696-FE0F\",\n\t\tc: \"1F468-200D-2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t49\n\t\t]\n\t},\n\tgrey_question: {\n\t\ta: \"White Question Mark Ornament\",\n\t\tb: \"2754\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"doubts\",\n\t\t\t\"gray\",\n\t\t\t\"huh\",\n\t\t\t\"confused\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-jm\": {\n\t\ta: \"Jamaica Flag\",\n\t\tb: \"1F1EF-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t44\n\t\t]\n\t},\n\tbellhop_bell: {\n\t\ta: \"Bellhop Bell\",\n\t\tb: \"1F6CE-FE0F\",\n\t\tc: \"1F6CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"service\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t3\n\t\t],\n\t\to: 7\n\t},\n\tstraight_ruler: {\n\t\ta: \"Straight Ruler\",\n\t\tb: \"1F4CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"calculate\",\n\t\t\t\"length\",\n\t\t\t\"math\",\n\t\t\t\"school\",\n\t\t\t\"drawing\",\n\t\t\t\"architect\",\n\t\t\t\"sketch\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-jo\": {\n\t\ta: \"Jordan Flag\",\n\t\tb: \"1F1EF-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t45\n\t\t]\n\t},\n\t\"female-judge\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2696\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Judge\",\n\t\tb: \"1F469-200D-2696-FE0F\",\n\t\tc: \"1F469-200D-2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t7\n\t\t]\n\t},\n\tgrey_exclamation: {\n\t\ta: \"White Exclamation Mark Ornament\",\n\t\tb: \"2755\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"surprise\",\n\t\t\t\"punctuation\",\n\t\t\t\"gray\",\n\t\t\t\"wow\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t5\n\t\t]\n\t},\n\tdoor: {\n\t\ta: \"Door\",\n\t\tb: \"1F6AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"house\",\n\t\t\t\"entry\",\n\t\t\t\"exit\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t15\n\t\t]\n\t},\n\t\"male-farmer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Farmer\",\n\t\tb: \"1F468-200D-1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t2\n\t\t]\n\t},\n\tjp: {\n\t\ta: \"Japan Flag\",\n\t\tb: \"1F1EF-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t46\n\t\t],\n\t\tn: [\n\t\t\t\"flag-jp\"\n\t\t]\n\t},\n\ttriangular_ruler: {\n\t\ta: \"Triangular Ruler\",\n\t\tb: \"1F4D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"math\",\n\t\t\t\"architect\",\n\t\t\t\"sketch\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t7\n\t\t]\n\t},\n\texclamation: {\n\t\ta: \"Heavy Exclamation Mark Symbol\",\n\t\tb: \"2757\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"heavy_exclamation_mark\",\n\t\t\t\"danger\",\n\t\t\t\"surprise\",\n\t\t\t\"punctuation\",\n\t\t\t\"wow\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t6\n\t\t],\n\t\tn: [\n\t\t\t\"heavy_exclamation_mark\"\n\t\t],\n\t\to: 5\n\t},\n\tbed: {\n\t\ta: \"Bed\",\n\t\tb: \"1F6CF-FE0F\",\n\t\tc: \"1F6CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sleep\",\n\t\t\t\"rest\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\t\"female-farmer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Farmer\",\n\t\tb: \"1F469-200D-1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t17\n\t\t]\n\t},\n\tscissors: {\n\t\ta: \"Black Scissors\",\n\t\tb: \"2702-FE0F\",\n\t\tc: \"2702\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"cut\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t14\n\t\t],\n\t\to: 1\n\t},\n\twavy_dash: {\n\t\ta: \"Wavy Dash\",\n\t\tb: \"3030-FE0F\",\n\t\tc: \"3030\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"draw\",\n\t\t\t\"line\",\n\t\t\t\"moustache\",\n\t\t\t\"mustache\",\n\t\t\t\"squiggle\",\n\t\t\t\"scribble\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t24\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ke\": {\n\t\ta: \"Kenya Flag\",\n\t\tb: \"1F1F0-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t47\n\t\t]\n\t},\n\t\"flag-kg\": {\n\t\ta: \"Kyrgyzstan Flag\",\n\t\tb: \"1F1F0-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t48\n\t\t]\n\t},\n\tcouch_and_lamp: {\n\t\ta: \"Couch and Lamp\",\n\t\tb: \"1F6CB-FE0F\",\n\t\tc: \"1F6CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"chill\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\t\"male-cook\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Cook\",\n\t\tb: \"1F468-200D-1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t8\n\t\t]\n\t},\n\tcard_file_box: {\n\t\ta: \"Card File Box\",\n\t\tb: \"1F5C3-FE0F\",\n\t\tc: \"1F5C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\tcopyright: {\n\t\ta: \"Copyright Sign\",\n\t\tb: \"00A9-FE0F\",\n\t\tc: \"00A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"ip\",\n\t\t\t\"license\",\n\t\t\t\"circle\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t12\n\t\t],\n\t\to: 1\n\t},\n\tfile_cabinet: {\n\t\ta: \"File Cabinet\",\n\t\tb: \"1F5C4-FE0F\",\n\t\tc: \"1F5C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"filing\",\n\t\t\t\"organizing\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\tregistered: {\n\t\ta: \"Registered Sign\",\n\t\tb: \"00AE-FE0F\",\n\t\tc: \"00AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t13\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-kh\": {\n\t\ta: \"Cambodia Flag\",\n\t\tb: \"1F1F0-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t49\n\t\t]\n\t},\n\t\"female-cook\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Cook\",\n\t\tb: \"1F469-200D-1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t23\n\t\t]\n\t},\n\ttoilet: {\n\t\ta: \"Toilet\",\n\t\tb: \"1F6BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"restroom\",\n\t\t\t\"wc\",\n\t\t\t\"washroom\",\n\t\t\t\"bathroom\",\n\t\t\t\"potty\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t33\n\t\t]\n\t},\n\twastebasket: {\n\t\ta: \"Wastebasket\",\n\t\tb: \"1F5D1-FE0F\",\n\t\tc: \"1F5D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"bin\",\n\t\t\t\"trash\",\n\t\t\t\"rubbish\",\n\t\t\t\"garbage\",\n\t\t\t\"toss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t7\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ki\": {\n\t\ta: \"Kiribati Flag\",\n\t\tb: \"1F1F0-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t50\n\t\t]\n\t},\n\tshower: {\n\t\ta: \"Shower\",\n\t\tb: \"1F6BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"water\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-mechanic\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Mechanic\",\n\t\tb: \"1F468-200D-1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t19\n\t\t]\n\t},\n\ttm: {\n\t\ta: \"Trade Mark Sign\",\n\t\tb: \"2122-FE0F\",\n\t\tc: \"2122\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"trademark\",\n\t\t\t\"brand\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t31\n\t\t],\n\t\to: 1\n\t},\n\thash: {\n\t\ta: \"Hash Key\",\n\t\tb: \"0023-FE0F-20E3\",\n\t\tc: \"0023-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"symbol\",\n\t\t\t\"blue-square\",\n\t\t\t\"twitter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-km\": {\n\t\ta: \"Comoros Flag\",\n\t\tb: \"1F1F0-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t51\n\t\t]\n\t},\n\tbathtub: {\n\t\ta: \"Bathtub\",\n\t\tb: \"1F6C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"shower\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t42\n\t\t]\n\t},\n\t\"female-mechanic\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Mechanic\",\n\t\tb: \"1F469-200D-1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t29\n\t\t]\n\t},\n\tlock: {\n\t\ta: \"Lock\",\n\t\tb: \"1F512\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"password\",\n\t\t\t\"padlock\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t20\n\t\t]\n\t},\n\t\"male-factory-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Factory Worker\",\n\t\tb: \"1F468-200D-1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t38\n\t\t]\n\t},\n\t\"flag-kn\": {\n\t\ta: \"St. Kitts & Nevis Flag\",\n\t\tb: \"1F1F0-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t0\n\t\t]\n\t},\n\thourglass: {\n\t\ta: \"Hourglass\",\n\t\tb: \"231B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"clock\",\n\t\t\t\"oldschool\",\n\t\t\t\"limit\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\tkeycap_star: {\n\t\ta: \"Keycap Star\",\n\t\tb: \"002A-FE0F-20E3\",\n\t\tc: \"002A-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t0,\n\t\t\t1\n\t\t],\n\t\to: 3\n\t},\n\tunlock: {\n\t\ta: \"Open Lock\",\n\t\tb: \"1F513\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"privacy\",\n\t\t\t\"security\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-kp\": {\n\t\ta: \"North Korea Flag\",\n\t\tb: \"1F1F0-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t1\n\t\t]\n\t},\n\t\"female-factory-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Factory Worker\",\n\t\tb: \"1F469-200D-1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t1\n\t\t]\n\t},\n\tzero: {\n\t\ta: \"Keycap 0\",\n\t\tb: \"0030-FE0F-20E3\",\n\t\tc: \"0030-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"0\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"null\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t2\n\t\t],\n\t\to: 3\n\t},\n\tlock_with_ink_pen: {\n\t\ta: \"Lock with Ink Pen\",\n\t\tb: \"1F50F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"secret\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t17\n\t\t]\n\t},\n\thourglass_flowing_sand: {\n\t\ta: \"Hourglass with Flowing Sand\",\n\t\tb: \"23F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"oldschool\",\n\t\t\t\"time\",\n\t\t\t\"countdown\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t3\n\t\t]\n\t},\n\tone: {\n\t\ta: \"Keycap 1\",\n\t\tb: \"0031-FE0F-20E3\",\n\t\tc: \"0031-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\",\n\t\t\t\"1\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t3\n\t\t],\n\t\to: 3\n\t},\n\tkr: {\n\t\ta: \"South Korea Flag\",\n\t\tb: \"1F1F0-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"south\",\n\t\t\t\"korea\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t3,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"flag-kr\"\n\t\t]\n\t},\n\twatch: {\n\t\ta: \"Watch\",\n\t\tb: \"231A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"accessories\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t41\n\t\t],\n\t\to: 1\n\t},\n\t\"male-office-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Office Worker\",\n\t\tb: \"1F468-200D-1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t13\n\t\t]\n\t},\n\tclosed_lock_with_key: {\n\t\ta: \"Closed Lock with Key\",\n\t\tb: \"1F510\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"privacy\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-office-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Office Worker\",\n\t\tb: \"1F469-200D-1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t23\n\t\t]\n\t},\n\ttwo: {\n\t\ta: \"Keycap 2\",\n\t\tb: \"0032-FE0F-20E3\",\n\t\tc: \"0032-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"2\",\n\t\t\t\"prime\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t4\n\t\t],\n\t\to: 3\n\t},\n\talarm_clock: {\n\t\ta: \"Alarm Clock\",\n\t\tb: \"23F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"wake\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t0\n\t\t]\n\t},\n\tkey: {\n\t\ta: \"Key\",\n\t\tb: \"1F511\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"door\",\n\t\t\t\"password\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-kw\": {\n\t\ta: \"Kuwait Flag\",\n\t\tb: \"1F1F0-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t3\n\t\t]\n\t},\n\tstopwatch: {\n\t\ta: \"Stopwatch\",\n\t\tb: \"23F1-FE0F\",\n\t\tc: \"23F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"deadline\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t1\n\t\t]\n\t},\n\t\"male-scientist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Scientist\",\n\t\tb: \"1F468-200D-1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t25\n\t\t]\n\t},\n\tthree: {\n\t\ta: \"Keycap 3\",\n\t\tb: \"0033-FE0F-20E3\",\n\t\tc: \"0033-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"3\",\n\t\t\t\"numbers\",\n\t\t\t\"prime\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t5\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-ky\": {\n\t\ta: \"Cayman Islands Flag\",\n\t\tb: \"1F1F0-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t4\n\t\t]\n\t},\n\told_key: {\n\t\ta: \"Old Key\",\n\t\tb: \"1F5DD-FE0F\",\n\t\tc: \"1F5DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"door\",\n\t\t\t\"password\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-kz\": {\n\t\ta: \"Kazakhstan Flag\",\n\t\tb: \"1F1F0-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t5\n\t\t]\n\t},\n\thammer: {\n\t\ta: \"Hammer\",\n\t\tb: \"1F528\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t42\n\t\t]\n\t},\n\t\"female-scientist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Scientist\",\n\t\tb: \"1F469-200D-1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t35\n\t\t]\n\t},\n\ttimer_clock: {\n\t\ta: \"Timer Clock\",\n\t\tb: \"23F2-FE0F\",\n\t\tc: \"23F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"alarm\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t2\n\t\t]\n\t},\n\tfour: {\n\t\ta: \"Keycap 4\",\n\t\tb: \"0034-FE0F-20E3\",\n\t\tc: \"0034-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"4\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t6\n\t\t],\n\t\to: 3\n\t},\n\t\"male-technologist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Technologist\",\n\t\tb: \"1F468-200D-1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t7\n\t\t]\n\t},\n\tmantelpiece_clock: {\n\t\ta: \"Mantelpiece Clock\",\n\t\tb: \"1F570-FE0F\",\n\t\tc: \"1F570\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"time\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tfive: {\n\t\ta: \"Keycap 5\",\n\t\tb: \"0035-FE0F-20E3\",\n\t\tc: \"0035-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"5\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"prime\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t7\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-la\": {\n\t\ta: \"Laos Flag\",\n\t\tb: \"1F1F1-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t6\n\t\t]\n\t},\n\tpick: {\n\t\ta: \"Pick\",\n\t\tb: \"26CF-FE0F\",\n\t\tc: \"26CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"dig\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t32\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-lb\": {\n\t\ta: \"Lebanon Flag\",\n\t\tb: \"1F1F1-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t7\n\t\t]\n\t},\n\tclock12: {\n\t\ta: \"Clock Face Twelve Oclock\",\n\t\tb: \"1F55B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"noon\",\n\t\t\t\"midnight\",\n\t\t\t\"midday\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t29\n\t\t]\n\t},\n\thammer_and_pick: {\n\t\ta: \"Hammer and Pick\",\n\t\tb: \"2692-FE0F\",\n\t\tc: \"2692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t11\n\t\t],\n\t\to: 4\n\t},\n\tsix: {\n\t\ta: \"Keycap 6\",\n\t\tb: \"0036-FE0F-20E3\",\n\t\tc: \"0036-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"6\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t8\n\t\t],\n\t\to: 3\n\t},\n\t\"female-technologist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Technologist\",\n\t\tb: \"1F469-200D-1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t17\n\t\t]\n\t},\n\thammer_and_wrench: {\n\t\ta: \"Hammer and Wrench\",\n\t\tb: \"1F6E0-FE0F\",\n\t\tc: \"1F6E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t8\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-lc\": {\n\t\ta: \"St. Lucia Flag\",\n\t\tb: \"1F1F1-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t8\n\t\t]\n\t},\n\tclock1230: {\n\t\ta: \"Clock Face Twelve-Thirty\",\n\t\tb: \"1F567\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t41\n\t\t]\n\t},\n\tseven: {\n\t\ta: \"Keycap 7\",\n\t\tb: \"0037-FE0F-20E3\",\n\t\tc: \"0037-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"7\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"prime\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t9\n\t\t],\n\t\to: 3\n\t},\n\t\"male-singer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Singer\",\n\t\tb: \"1F468-200D-1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t20\n\t\t]\n\t},\n\teight: {\n\t\ta: \"Keycap 8\",\n\t\tb: \"0038-FE0F-20E3\",\n\t\tc: \"0038-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"8\",\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t10\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-li\": {\n\t\ta: \"Liechtenstein Flag\",\n\t\tb: \"1F1F1-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t9\n\t\t]\n\t},\n\tdagger_knife: {\n\t\ta: \"Dagger Knife\",\n\t\tb: \"1F5E1-FE0F\",\n\t\tc: \"1F5E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\tclock1: {\n\t\ta: \"Clock Face One Oclock\",\n\t\tb: \"1F550\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-singer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Singer\",\n\t\tb: \"1F469-200D-1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-artist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Artist\",\n\t\tb: \"1F468-200D-1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t26\n\t\t]\n\t},\n\tcrossed_swords: {\n\t\ta: \"Crossed Swords\",\n\t\tb: \"2694-FE0F\",\n\t\tc: \"2694\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weapon\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t13\n\t\t],\n\t\to: 4\n\t},\n\tnine: {\n\t\ta: \"Keycap 9\",\n\t\tb: \"0039-FE0F-20E3\",\n\t\tc: \"0039-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\",\n\t\t\t\"9\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t11\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-lk\": {\n\t\ta: \"Sri Lanka Flag\",\n\t\tb: \"1F1F1-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t10\n\t\t]\n\t},\n\tclock130: {\n\t\ta: \"Clock Face One-Thirty\",\n\t\tb: \"1F55C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t30\n\t\t]\n\t},\n\tclock2: {\n\t\ta: \"Clock Face Two Oclock\",\n\t\tb: \"1F551\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t19\n\t\t]\n\t},\n\tgun: {\n\t\ta: \"Pistol\",\n\t\tb: \"1F52B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"violence\",\n\t\t\t\"weapon\",\n\t\t\t\"pistol\",\n\t\t\t\"revolver\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t45\n\t\t]\n\t},\n\tkeycap_ten: {\n\t\ta: \"Keycap Ten\",\n\t\tb: \"1F51F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"10\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t33\n\t\t]\n\t},\n\t\"female-artist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Artist\",\n\t\tb: \"1F469-200D-1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-lr\": {\n\t\ta: \"Liberia Flag\",\n\t\tb: \"1F1F1-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t11\n\t\t]\n\t},\n\tclock230: {\n\t\ta: \"Clock Face Two-Thirty\",\n\t\tb: \"1F55D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t31\n\t\t]\n\t},\n\tbow_and_arrow: {\n\t\ta: \"Bow and Arrow\",\n\t\tb: \"1F3F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t23\n\t\t],\n\t\to: 8\n\t},\n\t\"male-pilot\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2708\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Pilot\",\n\t\tb: \"1F468-200D-2708-FE0F\",\n\t\tc: \"1F468-200D-2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-ls\": {\n\t\ta: \"Lesotho Flag\",\n\t\tb: \"1F1F1-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-lt\": {\n\t\ta: \"Lithuania Flag\",\n\t\tb: \"1F1F1-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t13\n\t\t]\n\t},\n\tcapital_abcd: {\n\t\ta: \"Input Symbol for Latin Capital Letters\",\n\t\tb: \"1F520\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t34\n\t\t]\n\t},\n\t\"female-pilot\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2708\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Pilot\",\n\t\tb: \"1F469-200D-2708-FE0F\",\n\t\tc: \"1F469-200D-2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t13\n\t\t]\n\t},\n\tclock3: {\n\t\ta: \"Clock Face Three Oclock\",\n\t\tb: \"1F552\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t20\n\t\t]\n\t},\n\tshield: {\n\t\ta: \"Shield\",\n\t\tb: \"1F6E1-FE0F\",\n\t\tc: \"1F6E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"protection\",\n\t\t\t\"security\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t9\n\t\t],\n\t\to: 7\n\t},\n\t\"male-astronaut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Astronaut\",\n\t\tb: \"1F468-200D-1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t31\n\t\t]\n\t},\n\tabcd: {\n\t\ta: \"Input Symbol for Latin Small Letters\",\n\t\tb: \"1F521\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t35\n\t\t]\n\t},\n\tclock330: {\n\t\ta: \"Clock Face Three-Thirty\",\n\t\tb: \"1F55E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t32\n\t\t]\n\t},\n\t\"flag-lu\": {\n\t\ta: \"Luxembourg Flag\",\n\t\tb: \"1F1F1-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t14\n\t\t]\n\t},\n\twrench: {\n\t\ta: \"Wrench\",\n\t\tb: \"1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"diy\",\n\t\t\t\"ikea\",\n\t\t\t\"fix\",\n\t\t\t\"maintainer\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t41\n\t\t]\n\t},\n\tnut_and_bolt: {\n\t\ta: \"Nut and Bolt\",\n\t\tb: \"1F529\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"handy\",\n\t\t\t\"tools\",\n\t\t\t\"fix\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t43\n\t\t]\n\t},\n\tclock4: {\n\t\ta: \"Clock Face Four Oclock\",\n\t\tb: \"1F553\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t21\n\t\t]\n\t},\n\t\"female-astronaut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Astronaut\",\n\t\tb: \"1F469-200D-1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-lv\": {\n\t\ta: \"Latvia Flag\",\n\t\tb: \"1F1F1-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t15\n\t\t]\n\t},\n\tgear: {\n\t\ta: \"Gear\",\n\t\tb: \"2699-FE0F\",\n\t\tc: \"2699\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"cog\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t17\n\t\t],\n\t\to: 4\n\t},\n\t\"male-firefighter\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Firefighter\",\n\t\tb: \"1F468-200D-1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-ly\": {\n\t\ta: \"Libya Flag\",\n\t\tb: \"1F1F1-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t16\n\t\t]\n\t},\n\tsymbols: {\n\t\ta: \"Input Symbol for Symbols\",\n\t\tb: \"1F523\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"music\",\n\t\t\t\"note\",\n\t\t\t\"ampersand\",\n\t\t\t\"percent\",\n\t\t\t\"glyphs\",\n\t\t\t\"characters\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t37\n\t\t]\n\t},\n\tclock430: {\n\t\ta: \"Clock Face Four-Thirty\",\n\t\tb: \"1F55F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t33\n\t\t]\n\t},\n\t\"flag-ma\": {\n\t\ta: \"Morocco Flag\",\n\t\tb: \"1F1F2-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t17\n\t\t]\n\t},\n\tcompression: {\n\t\ta: \"Compression\",\n\t\tb: \"1F5DC-FE0F\",\n\t\tc: \"1F5DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t10\n\t\t],\n\t\to: 7\n\t},\n\t\"female-firefighter\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f692.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Firefighter\",\n\t\tb: \"1F469-200D-1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t47\n\t\t]\n\t},\n\tabc: {\n\t\ta: \"Input Symbol for Latin Letters\",\n\t\tb: \"1F524\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t38\n\t\t]\n\t},\n\tclock5: {\n\t\ta: \"Clock Face Five Oclock\",\n\t\tb: \"1F554\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t22\n\t\t]\n\t},\n\tclock530: {\n\t\ta: \"Clock Face Five-Thirty\",\n\t\tb: \"1F560\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t34\n\t\t]\n\t},\n\ta: {\n\t\ta: \"Negative Squared Latin Capital Letter a\",\n\t\tb: \"1F170-FE0F\",\n\t\tc: \"1F170\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t16\n\t\t]\n\t},\n\talembic: {\n\t\ta: \"Alembic\",\n\t\tb: \"2697-FE0F\",\n\t\tc: \"2697\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"distilling\",\n\t\t\t\"science\",\n\t\t\t\"experiment\",\n\t\t\t\"chemistry\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t16\n\t\t],\n\t\to: 4\n\t},\n\t\"flag-mc\": {\n\t\ta: \"Monaco Flag\",\n\t\tb: \"1F1F2-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t18\n\t\t]\n\t},\n\tcop: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fb.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fc.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fd.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fe.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3ff.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F46E-200D-2642-FE0F\",\n\t\ta: \"Police Officer\",\n\t\tb: \"1F46E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t45\n\t\t]\n\t},\n\tscales: {\n\t\ta: \"Scales\",\n\t\tb: \"2696-FE0F\",\n\t\tc: \"2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t15\n\t\t],\n\t\to: 4\n\t},\n\tclock6: {\n\t\ta: \"Clock Face Six Oclock\",\n\t\tb: \"1F555\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\",\n\t\t\t\"dawn\",\n\t\t\t\"dusk\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-md\": {\n\t\ta: \"Moldova Flag\",\n\t\tb: \"1F1F2-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t19\n\t\t]\n\t},\n\tab: {\n\t\ta: \"Negative Squared Ab\",\n\t\tb: \"1F18E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t20\n\t\t]\n\t},\n\t\"male-police-officer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F46E\",\n\t\ta: \"Male Police Officer\",\n\t\tb: \"1F46E-200D-2642-FE0F\",\n\t\tc: \"1F46E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t39\n\t\t]\n\t},\n\tlink: {\n\t\ta: \"Link Symbol\",\n\t\tb: \"1F517\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rings\",\n\t\t\t\"url\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-me\": {\n\t\ta: \"Montenegro Flag\",\n\t\tb: \"1F1F2-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t20\n\t\t]\n\t},\n\tclock630: {\n\t\ta: \"Clock Face Six-Thirty\",\n\t\tb: \"1F561\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t35\n\t\t]\n\t},\n\tb: {\n\t\ta: \"Negative Squared Latin Capital Letter B\",\n\t\tb: \"1F171-FE0F\",\n\t\tc: \"1F171\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t17\n\t\t]\n\t},\n\t\"female-police-officer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Police Officer\",\n\t\tb: \"1F46E-200D-2640-FE0F\",\n\t\tc: \"1F46E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t33\n\t\t]\n\t},\n\tclock7: {\n\t\ta: \"Clock Face Seven Oclock\",\n\t\tb: \"1F556\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t24\n\t\t]\n\t},\n\tcl: {\n\t\ta: \"Squared Cl\",\n\t\tb: \"1F191\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"words\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t21\n\t\t]\n\t},\n\tsleuth_or_spy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F575-FE0F-200D-2642-FE0F\",\n\t\ta: \"Sleuth or Spy\",\n\t\tb: \"1F575-FE0F\",\n\t\tc: \"1F575\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-mf\": {\n\t\ta: \"St. Martin Flag\",\n\t\tb: \"1F1F2-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t21\n\t\t]\n\t},\n\tchains: {\n\t\ta: \"Chains\",\n\t\tb: \"26D3-FE0F\",\n\t\tc: \"26D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"arrest\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t34\n\t\t],\n\t\to: 5\n\t},\n\tsyringe: {\n\t\ta: \"Syringe\",\n\t\tb: \"1F489\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"hospital\",\n\t\t\t\"drugs\",\n\t\t\t\"blood\",\n\t\t\t\"medicine\",\n\t\t\t\"needle\",\n\t\t\t\"doctor\",\n\t\t\t\"nurse\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-detective\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f575-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F575-FE0F\",\n\t\ta: \"Male Detective\",\n\t\tb: \"1F575-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\tcool: {\n\t\ta: \"Squared Cool\",\n\t\tb: \"1F192\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t22\n\t\t]\n\t},\n\tclock730: {\n\t\ta: \"Clock Face Seven-Thirty\",\n\t\tb: \"1F562\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-mg\": {\n\t\ta: \"Madagascar Flag\",\n\t\tb: \"1F1F2-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t22\n\t\t]\n\t},\n\tfree: {\n\t\ta: \"Squared Free\",\n\t\tb: \"1F193\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-mh\": {\n\t\ta: \"Marshall Islands Flag\",\n\t\tb: \"1F1F2-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t23\n\t\t]\n\t},\n\tclock8: {\n\t\ta: \"Clock Face Eight Oclock\",\n\t\tb: \"1F557\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t25\n\t\t]\n\t},\n\tpill: {\n\t\ta: \"Pill\",\n\t\tb: \"1F48A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"medicine\",\n\t\t\t\"doctor\",\n\t\t\t\"pharmacy\",\n\t\t\t\"drug\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t36\n\t\t]\n\t},\n\t\"female-detective\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f575-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Detective\",\n\t\tb: \"1F575-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t51\n\t\t],\n\t\to: 7\n\t},\n\tclock830: {\n\t\ta: \"Clock Face Eight-Thirty\",\n\t\tb: \"1F563\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t37\n\t\t]\n\t},\n\tguardsman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F482-200D-2642-FE0F\",\n\t\ta: \"Guardsman\",\n\t\tb: \"1F482\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"uk\",\n\t\t\t\"gb\",\n\t\t\t\"british\",\n\t\t\t\"male\",\n\t\t\t\"guy\",\n\t\t\t\"royal\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t31\n\t\t]\n\t},\n\tinformation_source: {\n\t\ta: \"Information Source\",\n\t\tb: \"2139-FE0F\",\n\t\tc: \"2139\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t32\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-mk\": {\n\t\ta: \"Macedonia Flag\",\n\t\tb: \"1F1F2-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t24\n\t\t]\n\t},\n\tsmoking: {\n\t\ta: \"Smoking Symbol\",\n\t\tb: \"1F6AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kills\",\n\t\t\t\"tobacco\",\n\t\t\t\"cigarette\",\n\t\t\t\"joint\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t17\n\t\t]\n\t},\n\tid: {\n\t\ta: \"Squared Id\",\n\t\tb: \"1F194\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t24\n\t\t]\n\t},\n\tclock9: {\n\t\ta: \"Clock Face Nine Oclock\",\n\t\tb: \"1F558\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t26\n\t\t]\n\t},\n\t\"flag-ml\": {\n\t\ta: \"Mali Flag\",\n\t\tb: \"1F1F2-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t25\n\t\t]\n\t},\n\tcoffin: {\n\t\ta: \"Coffin\",\n\t\tb: \"26B0-FE0F\",\n\t\tc: \"26B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vampire\",\n\t\t\t\"dead\",\n\t\t\t\"die\",\n\t\t\t\"death\",\n\t\t\t\"rip\",\n\t\t\t\"graveyard\",\n\t\t\t\"cemetery\",\n\t\t\t\"casket\",\n\t\t\t\"funeral\",\n\t\t\t\"box\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t24\n\t\t],\n\t\to: 4\n\t},\n\t\"male-guard\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f482-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F482\",\n\t\ta: \"Male Guard\",\n\t\tb: \"1F482-200D-2642-FE0F\",\n\t\tc: \"1F482-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t25\n\t\t]\n\t},\n\tm: {\n\t\ta: \"Circled Latin Capital Letter M\",\n\t\tb: \"24C2-FE0F\",\n\t\tc: \"24C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"blue-circle\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tfuneral_urn: {\n\t\ta: \"Funeral Urn\",\n\t\tb: \"26B1-FE0F\",\n\t\tc: \"26B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dead\",\n\t\t\t\"die\",\n\t\t\t\"death\",\n\t\t\t\"rip\",\n\t\t\t\"ashes\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t25\n\t\t],\n\t\to: 4\n\t},\n\t\"female-guard\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f482-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Guard\",\n\t\tb: \"1F482-200D-2640-FE0F\",\n\t\tc: \"1F482-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-mm\": {\n\t\ta: \"Myanmar (burma) Flag\",\n\t\tb: \"1F1F2-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t26\n\t\t]\n\t},\n\tclock930: {\n\t\ta: \"Clock Face Nine-Thirty\",\n\t\tb: \"1F564\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t38\n\t\t]\n\t},\n\tmoyai: {\n\t\ta: \"Moyai\",\n\t\tb: \"1F5FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rock\",\n\t\t\t\"easter island\",\n\t\t\t\"moai\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t23\n\t\t]\n\t},\n\t\"new\": {\n\t\ta: \"Squared New\",\n\t\tb: \"1F195\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\",\n\t\t\t\"start\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-mn\": {\n\t\ta: \"Mongolia Flag\",\n\t\tb: \"1F1F2-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t27\n\t\t]\n\t},\n\tconstruction_worker: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F477-200D-2642-FE0F\",\n\t\ta: \"Construction Worker\",\n\t\tb: \"1F477\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t22,\n\t\t\t28\n\t\t]\n\t},\n\tclock10: {\n\t\ta: \"Clock Face Ten Oclock\",\n\t\tb: \"1F559\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t27\n\t\t]\n\t},\n\tclock1030: {\n\t\ta: \"Clock Face Ten-Thirty\",\n\t\tb: \"1F565\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t39\n\t\t]\n\t},\n\tng: {\n\t\ta: \"Squared Ng\",\n\t\tb: \"1F196\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\",\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t26\n\t\t]\n\t},\n\t\"male-construction-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f477-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F477\",\n\t\ta: \"Male Construction Worker\",\n\t\tb: \"1F477-200D-2642-FE0F\",\n\t\tc: \"1F477-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t22,\n\t\t\t22\n\t\t]\n\t},\n\t\"flag-mo\": {\n\t\ta: \"Macau Sar China Flag\",\n\t\tb: \"1F1F2-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t28\n\t\t]\n\t},\n\toil_drum: {\n\t\ta: \"Oil Drum\",\n\t\tb: \"1F6E2-FE0F\",\n\t\tc: \"1F6E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"barrell\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t10\n\t\t],\n\t\to: 7\n\t},\n\to2: {\n\t\ta: \"Negative Squared Latin Capital Letter O\",\n\t\tb: \"1F17E-FE0F\",\n\t\tc: \"1F17E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"red-square\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-construction-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f477-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Construction Worker\",\n\t\tb: \"1F477-200D-2640-FE0F\",\n\t\tc: \"1F477-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t22,\n\t\t\t16\n\t\t]\n\t},\n\tclock11: {\n\t\ta: \"Clock Face Eleven Oclock\",\n\t\tb: \"1F55A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t28\n\t\t]\n\t},\n\tcrystal_ball: {\n\t\ta: \"Crystal Ball\",\n\t\tb: \"1F52E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"disco\",\n\t\t\t\"party\",\n\t\t\t\"magic\",\n\t\t\t\"circus\",\n\t\t\t\"fortune_teller\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-mp\": {\n\t\ta: \"Northern Mariana Islands Flag\",\n\t\tb: \"1F1F2-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t29\n\t\t]\n\t},\n\t\"flag-mq\": {\n\t\ta: \"Martinique Flag\",\n\t\tb: \"1F1F2-1F1F6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t30\n\t\t]\n\t},\n\tprince: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F934-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F934-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F934-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F934-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F934-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Prince\",\n\t\tb: \"1F934\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boy\",\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"crown\",\n\t\t\t\"royal\",\n\t\t\t\"king\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t28\n\t\t],\n\t\to: 9\n\t},\n\tok: {\n\t\ta: \"Squared Ok\",\n\t\tb: \"1F197\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"agree\",\n\t\t\t\"yes\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t27\n\t\t]\n\t},\n\tclock1130: {\n\t\ta: \"Clock Face Eleven-Thirty\",\n\t\tb: \"1F566\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t40\n\t\t]\n\t},\n\tshopping_trolley: {\n\t\ta: \"Shopping Trolley\",\n\t\tb: \"1F6D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t7\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-mr\": {\n\t\ta: \"Mauritania Flag\",\n\t\tb: \"1F1F2-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t31\n\t\t]\n\t},\n\tprincess: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F478-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F478-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F478-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F478-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F478-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Princess\",\n\t\tb: \"1F478\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"girl\",\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"blond\",\n\t\t\t\"crown\",\n\t\t\t\"royal\",\n\t\t\t\"queen\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t34\n\t\t]\n\t},\n\tnew_moon: {\n\t\ta: \"New Moon Symbol\",\n\t\tb: \"1F311\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t9\n\t\t]\n\t},\n\tparking: {\n\t\ta: \"Negative Squared Latin Capital Letter P\",\n\t\tb: \"1F17F-FE0F\",\n\t\tc: \"1F17F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cars\",\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t19\n\t\t],\n\t\to: 5\n\t},\n\tsos: {\n\t\ta: \"Squared Sos\",\n\t\tb: \"1F198\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"help\",\n\t\t\t\"red-square\",\n\t\t\t\"words\",\n\t\t\t\"emergency\",\n\t\t\t\"911\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t28\n\t\t]\n\t},\n\tman_with_turban: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F473-200D-2642-FE0F\",\n\t\ta: \"Man with Turban\",\n\t\tb: \"1F473\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"indian\",\n\t\t\t\"hinduism\",\n\t\t\t\"arabs\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t44\n\t\t]\n\t},\n\t\"flag-ms\": {\n\t\ta: \"Montserrat Flag\",\n\t\tb: \"1F1F2-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t32\n\t\t]\n\t},\n\twaxing_crescent_moon: {\n\t\ta: \"Waxing Crescent Moon Symbol\",\n\t\tb: \"1F312\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t10\n\t\t]\n\t},\n\tup: {\n\t\ta: \"Squared Up with Exclamation Mark\",\n\t\tb: \"1F199\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"above\",\n\t\t\t\"high\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t29\n\t\t]\n\t},\n\tfirst_quarter_moon: {\n\t\ta: \"First Quarter Moon Symbol\",\n\t\tb: \"1F313\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-mt\": {\n\t\ta: \"Malta Flag\",\n\t\tb: \"1F1F2-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t33\n\t\t]\n\t},\n\t\"man-wearing-turban\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f473-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F473\",\n\t\ta: \"Man Wearing Turban\",\n\t\tb: \"1F473-200D-2642-FE0F\",\n\t\tc: \"1F473-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t38\n\t\t]\n\t},\n\tmoon: {\n\t\ta: \"Waxing Gibbous Moon Symbol\",\n\t\tb: \"1F314\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t6,\n\t\t\t12\n\t\t],\n\t\tn: [\n\t\t\t\"waxing_gibbous_moon\"\n\t\t]\n\t},\n\t\"woman-wearing-turban\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f473-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Wearing Turban\",\n\t\tb: \"1F473-200D-2640-FE0F\",\n\t\tc: \"1F473-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t32\n\t\t]\n\t},\n\tvs: {\n\t\ta: \"Squared Vs\",\n\t\tb: \"1F19A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-mu\": {\n\t\ta: \"Mauritius Flag\",\n\t\tb: \"1F1F2-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t34\n\t\t]\n\t},\n\tman_with_gua_pi_mao: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F472-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F472-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F472-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F472-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F472-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Man with Gua Pi Mao\",\n\t\tb: \"1F472\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"boy\",\n\t\t\t\"chinese\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t26\n\t\t]\n\t},\n\tkoko: {\n\t\ta: \"Squared Katakana Koko\",\n\t\tb: \"1F201\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"here\",\n\t\t\t\"katakana\",\n\t\t\t\"japanese\",\n\t\t\t\"destination\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t29\n\t\t]\n\t},\n\tfull_moon: {\n\t\ta: \"Full Moon Symbol\",\n\t\tb: \"1F315\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"yellow\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-mv\": {\n\t\ta: \"Maldives Flag\",\n\t\tb: \"1F1F2-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t35\n\t\t]\n\t},\n\tperson_with_headscarf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D5-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D5-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D5-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D5-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D5-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Person with Headscarf\",\n\t\tb: \"1F9D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\twaning_gibbous_moon: {\n\t\ta: \"Waning Gibbous Moon Symbol\",\n\t\tb: \"1F316\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\",\n\t\t\t\"waxing_gibbous_moon\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t14\n\t\t]\n\t},\n\tsa: {\n\t\ta: \"Squared Katakana Sa\",\n\t\tb: \"1F202-FE0F\",\n\t\tc: \"1F202\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"blue-square\",\n\t\t\t\"katakana\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-mw\": {\n\t\ta: \"Malawi Flag\",\n\t\tb: \"1F1F2-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t36\n\t\t]\n\t},\n\tlast_quarter_moon: {\n\t\ta: \"Last Quarter Moon Symbol\",\n\t\tb: \"1F317\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t15\n\t\t]\n\t},\n\tu6708: {\n\t\ta: \"Squared Cjk Unified Ideograph-6708\",\n\t\tb: \"1F237-FE0F\",\n\t\tc: \"1F237\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"month\",\n\t\t\t\"moon\",\n\t\t\t\"japanese\",\n\t\t\t\"orange-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t38\n\t\t]\n\t},\n\tbearded_person: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Bearded Person\",\n\t\tb: \"1F9D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-mx\": {\n\t\ta: \"Mexico Flag\",\n\t\tb: \"1F1F2-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t37\n\t\t]\n\t},\n\tu6709: {\n\t\ta: \"Squared Cjk Unified Ideograph-6709\",\n\t\tb: \"1F236\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"chinese\",\n\t\t\t\"have\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t37\n\t\t]\n\t},\n\tperson_with_blond_hair: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F471-200D-2642-FE0F\",\n\t\ta: \"Person with Blond Hair\",\n\t\tb: \"1F471\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t21,\n\t\t\t20\n\t\t]\n\t},\n\twaning_crescent_moon: {\n\t\ta: \"Waning Crescent Moon Symbol\",\n\t\tb: \"1F318\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-my\": {\n\t\ta: \"Malaysia Flag\",\n\t\tb: \"1F1F2-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t38\n\t\t]\n\t},\n\tu6307: {\n\t\ta: \"Squared Cjk Unified Ideograph-6307\",\n\t\tb: \"1F22F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"point\",\n\t\t\t\"green-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t32\n\t\t],\n\t\to: 5\n\t},\n\t\"blond-haired-man\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f471-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F471\",\n\t\ta: \"Blond Haired Man\",\n\t\tb: \"1F471-200D-2642-FE0F\",\n\t\tc: \"1F471-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t14\n\t\t]\n\t},\n\tcrescent_moon: {\n\t\ta: \"Crescent Moon\",\n\t\tb: \"1F319\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"sleep\",\n\t\t\t\"sky\",\n\t\t\t\"evening\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t17\n\t\t]\n\t},\n\t\"flag-mz\": {\n\t\ta: \"Mozambique Flag\",\n\t\tb: \"1F1F2-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t39\n\t\t]\n\t},\n\tnew_moon_with_face: {\n\t\ta: \"New Moon with Face\",\n\t\tb: \"1F31A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-na\": {\n\t\ta: \"Namibia Flag\",\n\t\tb: \"1F1F3-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t40\n\t\t]\n\t},\n\t\"blond-haired-woman\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f471-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Blond Haired Woman\",\n\t\tb: \"1F471-200D-2640-FE0F\",\n\t\tc: \"1F471-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t8\n\t\t]\n\t},\n\tideograph_advantage: {\n\t\ta: \"Circled Ideograph Advantage\",\n\t\tb: \"1F250\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"obtain\",\n\t\t\t\"get\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t42\n\t\t]\n\t},\n\tfirst_quarter_moon_with_face: {\n\t\ta: \"First Quarter Moon with Face\",\n\t\tb: \"1F31B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t19\n\t\t]\n\t},\n\tman_in_tuxedo: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F935-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F935-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F935-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F935-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F935-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Tuxedo\",\n\t\tb: \"1F935\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"wedding\",\n\t\t\t\"groom\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t34\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-nc\": {\n\t\ta: \"New Caledonia Flag\",\n\t\tb: \"1F1F3-1F1E8\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t41\n\t\t]\n\t},\n\tu5272: {\n\t\ta: \"Squared Cjk Unified Ideograph-5272\",\n\t\tb: \"1F239\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cut\",\n\t\t\t\"divide\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"pink-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-ne\": {\n\t\ta: \"Niger Flag\",\n\t\tb: \"1F1F3-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t42\n\t\t]\n\t},\n\tlast_quarter_moon_with_face: {\n\t\ta: \"Last Quarter Moon with Face\",\n\t\tb: \"1F31C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t20\n\t\t]\n\t},\n\tu7121: {\n\t\ta: \"Squared Cjk Unified Ideograph-7121\",\n\t\tb: \"1F21A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nothing\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t31\n\t\t],\n\t\to: 5\n\t},\n\tbride_with_veil: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F470-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F470-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F470-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F470-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F470-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Bride with Veil\",\n\t\tb: \"1F470\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"wedding\",\n\t\t\t\"woman\",\n\t\t\t\"bride\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t2\n\t\t]\n\t},\n\tu7981: {\n\t\ta: \"Squared Cjk Unified Ideograph-7981\",\n\t\tb: \"1F232\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"forbidden\",\n\t\t\t\"limit\",\n\t\t\t\"restricted\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t33\n\t\t]\n\t},\n\tpregnant_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F930-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F930-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F930-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F930-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F930-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Pregnant Woman\",\n\t\tb: \"1F930\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"baby\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\tthermometer: {\n\t\ta: \"Thermometer\",\n\t\tb: \"1F321-FE0F\",\n\t\tc: \"1F321\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"temperature\",\n\t\t\t\"hot\",\n\t\t\t\"cold\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t25\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-nf\": {\n\t\ta: \"Norfolk Island Flag\",\n\t\tb: \"1F1F3-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t43\n\t\t]\n\t},\n\tsunny: {\n\t\ta: \"Black Sun with Rays\",\n\t\tb: \"2600-FE0F\",\n\t\tc: \"2600\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"nature\",\n\t\t\t\"brightness\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t16\n\t\t],\n\t\to: 1\n\t},\n\taccept: {\n\t\ta: \"Circled Ideograph Accept\",\n\t\tb: \"1F251\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"good\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"agree\",\n\t\t\t\"yes\",\n\t\t\t\"orange-circle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t43\n\t\t]\n\t},\n\t\"flag-ng\": {\n\t\ta: \"Nigeria Flag\",\n\t\tb: \"1F1F3-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t44\n\t\t]\n\t},\n\t\"breast-feeding\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F931-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F931-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F931-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F931-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F931-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Breast-Feeding\",\n\t\tb: \"1F931\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tfull_moon_with_face: {\n\t\ta: \"Full Moon with Face\",\n\t\tb: \"1F31D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-ni\": {\n\t\ta: \"Nicaragua Flag\",\n\t\tb: \"1F1F3-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t45\n\t\t]\n\t},\n\tu7533: {\n\t\ta: \"Squared Cjk Unified Ideograph-7533\",\n\t\tb: \"1F238\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"japanese\",\n\t\t\t\"kanji\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t39\n\t\t]\n\t},\n\tangel: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F47C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F47C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F47C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F47C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F47C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Baby Angel\",\n\t\tb: \"1F47C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"heaven\",\n\t\t\t\"wings\",\n\t\t\t\"halo\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t43\n\t\t]\n\t},\n\tsun_with_face: {\n\t\ta: \"Sun with Face\",\n\t\tb: \"1F31E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"morning\",\n\t\t\t\"sky\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t22\n\t\t]\n\t},\n\tsanta: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F385-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fb.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F385-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fc.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F385-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fd.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F385-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fe.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F385-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3ff.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Father Christmas\",\n\t\tb: \"1F385\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"xmas\",\n\t\t\t\"father christmas\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t19\n\t\t]\n\t},\n\tu5408: {\n\t\ta: \"Squared Cjk Unified Ideograph-5408\",\n\t\tb: \"1F234\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"join\",\n\t\t\t\"kanji\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t35\n\t\t]\n\t},\n\t\"flag-nl\": {\n\t\ta: \"Netherlands Flag\",\n\t\tb: \"1F1F3-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t46\n\t\t]\n\t},\n\tmrs_claus: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F936-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F936-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F936-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F936-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F936-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Mother Christmas\",\n\t\tb: \"1F936\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"xmas\",\n\t\t\t\"mother christmas\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t40\n\t\t],\n\t\tn: [\n\t\t\t\"mother_christmas\"\n\t\t],\n\t\to: 9\n\t},\n\tu7a7a: {\n\t\ta: \"Squared Cjk Unified Ideograph-7a7a\",\n\t\tb: \"1F233\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"empty\",\n\t\t\t\"sky\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t34\n\t\t]\n\t},\n\tstar: {\n\t\ta: \"White Medium Star\",\n\t\tb: \"2B50\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"yellow\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t22\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-no\": {\n\t\ta: \"Norway Flag\",\n\t\tb: \"1F1F3-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t47\n\t\t]\n\t},\n\tmage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D9-200D-2640-FE0F\",\n\t\ta: \"Mage\",\n\t\tb: \"1F9D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t42\n\t\t],\n\t\to: 10\n\t},\n\tstar2: {\n\t\ta: \"Glowing Star\",\n\t\tb: \"1F31F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"sparkle\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-np\": {\n\t\ta: \"Nepal Flag\",\n\t\tb: \"1F1F3-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t48\n\t\t]\n\t},\n\tcongratulations: {\n\t\ta: \"Circled Ideograph Congratulation\",\n\t\tb: \"3297-FE0F\",\n\t\tc: \"3297\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"red-circle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t26\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nr\": {\n\t\ta: \"Nauru Flag\",\n\t\tb: \"1F1F3-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t49\n\t\t]\n\t},\n\tstars: {\n\t\ta: \"Shooting Star\",\n\t\tb: \"1F320\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t24\n\t\t]\n\t},\n\tfemale_mage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D9\",\n\t\ta: \"Female Mage\",\n\t\tb: \"1F9D9-200D-2640-FE0F\",\n\t\tc: \"1F9D9-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t30\n\t\t],\n\t\to: 10\n\t},\n\tsecret: {\n\t\ta: \"Circled Ideograph Secret\",\n\t\tb: \"3299-FE0F\",\n\t\tc: \"3299\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"privacy\",\n\t\t\t\"chinese\",\n\t\t\t\"sshh\",\n\t\t\t\"kanji\",\n\t\t\t\"red-circle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t27\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nu\": {\n\t\ta: \"Niue Flag\",\n\t\tb: \"1F1F3-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t50\n\t\t]\n\t},\n\tu55b6: {\n\t\ta: \"Squared Cjk Unified Ideograph-55b6\",\n\t\tb: \"1F23A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"opening hours\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t41\n\t\t]\n\t},\n\tmale_mage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Mage\",\n\t\tb: \"1F9D9-200D-2642-FE0F\",\n\t\tc: \"1F9D9-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t36\n\t\t],\n\t\to: 10\n\t},\n\tcloud: {\n\t\ta: \"Cloud\",\n\t\tb: \"2601-FE0F\",\n\t\tc: \"2601\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"sky\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t17\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nz\": {\n\t\ta: \"New Zealand Flag\",\n\t\tb: \"1F1F3-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t51\n\t\t]\n\t},\n\tpartly_sunny: {\n\t\ta: \"Sun Behind Cloud\",\n\t\tb: \"26C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"nature\",\n\t\t\t\"cloudy\",\n\t\t\t\"morning\",\n\t\t\t\"fall\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t29\n\t\t],\n\t\to: 5\n\t},\n\tfairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DA-200D-2640-FE0F\",\n\t\ta: \"Fairy\",\n\t\tb: \"1F9DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t8\n\t\t],\n\t\to: 10\n\t},\n\tu6e80: {\n\t\ta: \"Squared Cjk Unified Ideograph-6e80\",\n\t\tb: \"1F235\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"full\",\n\t\t\t\"chinese\",\n\t\t\t\"japanese\",\n\t\t\t\"red-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t36\n\t\t]\n\t},\n\tblack_small_square: {\n\t\ta: \"Black Small Square\",\n\t\tb: \"25AA-FE0F\",\n\t\tc: \"25AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t8\n\t\t],\n\t\to: 1\n\t},\n\tthunder_cloud_and_rain: {\n\t\ta: \"Thunder Cloud and Rain\",\n\t\tb: \"26C8-FE0F\",\n\t\tc: \"26C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t30\n\t\t],\n\t\to: 5\n\t},\n\tfemale_fairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DA\",\n\t\ta: \"Female Fairy\",\n\t\tb: \"1F9DA-200D-2640-FE0F\",\n\t\tc: \"1F9DA-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t48\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-om\": {\n\t\ta: \"Oman Flag\",\n\t\tb: \"1F1F4-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t0\n\t\t]\n\t},\n\twhite_small_square: {\n\t\ta: \"White Small Square\",\n\t\tb: \"25AB-FE0F\",\n\t\tc: \"25AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t9\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-pa\": {\n\t\ta: \"Panama Flag\",\n\t\tb: \"1F1F5-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t1\n\t\t]\n\t},\n\tmostly_sunny: {\n\t\ta: \"Mostly Sunny\",\n\t\tb: \"1F324-FE0F\",\n\t\tc: \"1F324\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t26\n\t\t],\n\t\tn: [\n\t\t\t\"sun_small_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\tmale_fairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Fairy\",\n\t\tb: \"1F9DA-200D-2642-FE0F\",\n\t\tc: \"1F9DA-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t2\n\t\t],\n\t\to: 10\n\t},\n\tbarely_sunny: {\n\t\ta: \"Barely Sunny\",\n\t\tb: \"1F325-FE0F\",\n\t\tc: \"1F325\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t27\n\t\t],\n\t\tn: [\n\t\t\t\"sun_behind_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\twhite_medium_square: {\n\t\ta: \"White Medium Square\",\n\t\tb: \"25FB-FE0F\",\n\t\tc: \"25FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"stone\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t12\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-pe\": {\n\t\ta: \"Peru Flag\",\n\t\tb: \"1F1F5-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t2\n\t\t]\n\t},\n\tvampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DB-200D-2640-FE0F\",\n\t\ta: \"Vampire\",\n\t\tb: \"1F9DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t26\n\t\t],\n\t\to: 10\n\t},\n\tfemale_vampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DB\",\n\t\ta: \"Female Vampire\",\n\t\tb: \"1F9DB-200D-2640-FE0F\",\n\t\tc: \"1F9DB-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t14\n\t\t],\n\t\to: 10\n\t},\n\tpartly_sunny_rain: {\n\t\ta: \"Partly Sunny Rain\",\n\t\tb: \"1F326-FE0F\",\n\t\tc: \"1F326\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t28\n\t\t],\n\t\tn: [\n\t\t\t\"sun_behind_rain_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pf\": {\n\t\ta: \"French Polynesia Flag\",\n\t\tb: \"1F1F5-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t3\n\t\t]\n\t},\n\tblack_medium_square: {\n\t\ta: \"Black Medium Square\",\n\t\tb: \"25FC-FE0F\",\n\t\tc: \"25FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"button\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t13\n\t\t],\n\t\to: 3\n\t},\n\twhite_medium_small_square: {\n\t\ta: \"White Medium Small Square\",\n\t\tb: \"25FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"stone\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t14\n\t\t],\n\t\to: 3\n\t},\n\train_cloud: {\n\t\ta: \"Rain Cloud\",\n\t\tb: \"1F327-FE0F\",\n\t\tc: \"1F327\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t29\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pg\": {\n\t\ta: \"Papua New Guinea Flag\",\n\t\tb: \"1F1F5-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t4\n\t\t]\n\t},\n\tmale_vampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Vampire\",\n\t\tb: \"1F9DB-200D-2642-FE0F\",\n\t\tc: \"1F9DB-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ph\": {\n\t\ta: \"Philippines Flag\",\n\t\tb: \"1F1F5-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t5\n\t\t]\n\t},\n\tmerperson: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DC-200D-2642-FE0F\",\n\t\ta: \"Merperson\",\n\t\tb: \"1F9DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t44\n\t\t],\n\t\to: 10\n\t},\n\tblack_medium_small_square: {\n\t\ta: \"Black Medium Small Square\",\n\t\tb: \"25FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"icon\",\n\t\t\t\"shape\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t15\n\t\t],\n\t\to: 3\n\t},\n\tsnow_cloud: {\n\t\ta: \"Snow Cloud\",\n\t\tb: \"1F328-FE0F\",\n\t\tc: \"1F328\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\tlightning: {\n\t\ta: \"Lightning\",\n\t\tb: \"1F329-FE0F\",\n\t\tc: \"1F329\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"lightning_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\tblack_large_square: {\n\t\ta: \"Black Large Square\",\n\t\tb: \"2B1B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t20\n\t\t],\n\t\to: 5\n\t},\n\tmermaid: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Mermaid\",\n\t\tb: \"1F9DC-200D-2640-FE0F\",\n\t\tc: \"1F9DC-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t32\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-pk\": {\n\t\ta: \"Pakistan Flag\",\n\t\tb: \"1F1F5-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t6\n\t\t]\n\t},\n\tmerman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DC\",\n\t\ta: \"Merman\",\n\t\tb: \"1F9DC-200D-2642-FE0F\",\n\t\tc: \"1F9DC-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t38\n\t\t],\n\t\to: 10\n\t},\n\twhite_large_square: {\n\t\ta: \"White Large Square\",\n\t\tb: \"2B1C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"stone\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t21\n\t\t],\n\t\to: 5\n\t},\n\ttornado: {\n\t\ta: \"Tornado\",\n\t\tb: \"1F32A-FE0F\",\n\t\tc: \"1F32A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"cyclone\",\n\t\t\t\"twister\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t32\n\t\t],\n\t\tn: [\n\t\t\t\"tornado_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pl\": {\n\t\ta: \"Poland Flag\",\n\t\tb: \"1F1F5-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t7\n\t\t]\n\t},\n\telf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fb.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fc.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fd.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fe.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3ff.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DD-200D-2642-FE0F\",\n\t\ta: \"Elf\",\n\t\tb: \"1F9DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tfog: {\n\t\ta: \"Fog\",\n\t\tb: \"1F32B-FE0F\",\n\t\tc: \"1F32B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t33\n\t\t],\n\t\to: 7\n\t},\n\tlarge_orange_diamond: {\n\t\ta: \"Large Orange Diamond\",\n\t\tb: \"1F536\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-pm\": {\n\t\ta: \"St. Pierre & Miquelon Flag\",\n\t\tb: \"1F1F5-1F1F2\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t8\n\t\t]\n\t},\n\t\"flag-pn\": {\n\t\ta: \"Pitcairn Islands Flag\",\n\t\tb: \"1F1F5-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t9\n\t\t]\n\t},\n\twind_blowing_face: {\n\t\ta: \"Wind Blowing Face\",\n\t\tb: \"1F32C-FE0F\",\n\t\tc: \"1F32C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t34\n\t\t],\n\t\to: 7\n\t},\n\tfemale_elf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Elf\",\n\t\tb: \"1F9DD-200D-2640-FE0F\",\n\t\tc: \"1F9DD-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t50\n\t\t],\n\t\to: 10\n\t},\n\tlarge_blue_diamond: {\n\t\ta: \"Large Blue Diamond\",\n\t\tb: \"1F537\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t5\n\t\t]\n\t},\n\tmale_elf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DD\",\n\t\ta: \"Male Elf\",\n\t\tb: \"1F9DD-200D-2642-FE0F\",\n\t\tc: \"1F9DD-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t4\n\t\t],\n\t\to: 10\n\t},\n\tsmall_orange_diamond: {\n\t\ta: \"Small Orange Diamond\",\n\t\tb: \"1F538\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-pr\": {\n\t\ta: \"Puerto Rico Flag\",\n\t\tb: \"1F1F5-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t10\n\t\t]\n\t},\n\tcyclone: {\n\t\ta: \"Cyclone\",\n\t\tb: \"1F300\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"swirl\",\n\t\t\t\"blue\",\n\t\t\t\"cloud\",\n\t\t\t\"vortex\",\n\t\t\t\"spiral\",\n\t\t\t\"whirlpool\",\n\t\t\t\"spin\",\n\t\t\t\"tornado\",\n\t\t\t\"hurricane\",\n\t\t\t\"typhoon\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t44\n\t\t]\n\t},\n\trainbow: {\n\t\ta: \"Rainbow\",\n\t\tb: \"1F308\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"happy\",\n\t\t\t\"unicorn_face\",\n\t\t\t\"photo\",\n\t\t\t\"sky\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t0\n\t\t]\n\t},\n\tsmall_blue_diamond: {\n\t\ta: \"Small Blue Diamond\",\n\t\tb: \"1F539\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t7\n\t\t]\n\t},\n\tgenie: {\n\t\tobsoleted_by: \"1F9DE-200D-2642-FE0F\",\n\t\ta: \"Genie\",\n\t\tb: \"1F9DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ps\": {\n\t\ta: \"Palestinian Territories Flag\",\n\t\tb: \"1F1F5-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t11\n\t\t]\n\t},\n\tsmall_red_triangle: {\n\t\ta: \"Up-Pointing Red Triangle\",\n\t\tb: \"1F53A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"up\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t8\n\t\t]\n\t},\n\tclosed_umbrella: {\n\t\ta: \"Closed Umbrella\",\n\t\tb: \"1F302\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"rain\",\n\t\t\t\"drizzle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t46\n\t\t]\n\t},\n\tfemale_genie: {\n\t\ta: \"Female Genie\",\n\t\tb: \"1F9DE-200D-2640-FE0F\",\n\t\tc: \"1F9DE-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-pt\": {\n\t\ta: \"Portugal Flag\",\n\t\tb: \"1F1F5-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-pw\": {\n\t\ta: \"Palau Flag\",\n\t\tb: \"1F1F5-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t13\n\t\t]\n\t},\n\tsmall_red_triangle_down: {\n\t\ta: \"Down-Pointing Red Triangle\",\n\t\tb: \"1F53B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t9\n\t\t]\n\t},\n\tumbrella: {\n\t\ta: \"Umbrella\",\n\t\tb: \"2602-FE0F\",\n\t\tc: \"2602\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"rainy\",\n\t\t\t\"weather\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t18\n\t\t],\n\t\to: 1\n\t},\n\tmale_genie: {\n\t\tobsoletes: \"1F9DE\",\n\t\ta: \"Male Genie\",\n\t\tb: \"1F9DE-200D-2642-FE0F\",\n\t\tc: \"1F9DE-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\tzombie: {\n\t\tobsoleted_by: \"1F9DF-200D-2642-FE0F\",\n\t\ta: \"Zombie\",\n\t\tb: \"1F9DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t21\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-py\": {\n\t\ta: \"Paraguay Flag\",\n\t\tb: \"1F1F5-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t14\n\t\t]\n\t},\n\tdiamond_shape_with_a_dot_inside: {\n\t\ta: \"Diamond Shape with a Dot Inside\",\n\t\tb: \"1F4A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"jewel\",\n\t\t\t\"blue\",\n\t\t\t\"gem\",\n\t\t\t\"crystal\",\n\t\t\t\"fancy\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t6\n\t\t]\n\t},\n\tumbrella_with_rain_drops: {\n\t\ta: \"Umbrella with Rain Drops\",\n\t\tb: \"2614\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t47,\n\t\t\t23\n\t\t],\n\t\to: 4\n\t},\n\tradio_button: {\n\t\ta: \"Radio Button\",\n\t\tb: \"1F518\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"input\",\n\t\t\t\"old\",\n\t\t\t\"music\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t26\n\t\t]\n\t},\n\tfemale_zombie: {\n\t\ta: \"Female Zombie\",\n\t\tb: \"1F9DF-200D-2640-FE0F\",\n\t\tc: \"1F9DF-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t19\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-qa\": {\n\t\ta: \"Qatar Flag\",\n\t\tb: \"1F1F6-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t15\n\t\t]\n\t},\n\tumbrella_on_ground: {\n\t\ta: \"Umbrella on Ground\",\n\t\tb: \"26F1-FE0F\",\n\t\tc: \"26F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t39\n\t\t],\n\t\to: 5\n\t},\n\tblack_square_button: {\n\t\ta: \"Black Square Button\",\n\t\tb: \"1F532\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"input\",\n\t\t\t\"frame\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t0\n\t\t]\n\t},\n\tzap: {\n\t\ta: \"High Voltage Sign\",\n\t\tb: \"26A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thunder\",\n\t\t\t\"weather\",\n\t\t\t\"lightning bolt\",\n\t\t\t\"fast\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t21\n\t\t],\n\t\to: 4\n\t},\n\tmale_zombie: {\n\t\tobsoletes: \"1F9DF\",\n\t\ta: \"Male Zombie\",\n\t\tb: \"1F9DF-200D-2642-FE0F\",\n\t\tc: \"1F9DF-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-re\": {\n\t\ta: \"Réunion Flag\",\n\t\tb: \"1F1F7-1F1EA\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-ro\": {\n\t\ta: \"Romania Flag\",\n\t\tb: \"1F1F7-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t17\n\t\t]\n\t},\n\tsnowflake: {\n\t\ta: \"Snowflake\",\n\t\tb: \"2744-FE0F\",\n\t\tc: \"2744\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"winter\",\n\t\t\t\"season\",\n\t\t\t\"cold\",\n\t\t\t\"weather\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t51\n\t\t],\n\t\to: 1\n\t},\n\twhite_square_button: {\n\t\ta: \"White Square Button\",\n\t\tb: \"1F533\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"input\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t1\n\t\t]\n\t},\n\tperson_frowning: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64D-200D-2640-FE0F\",\n\t\ta: \"Person Frowning\",\n\t\tb: \"1F64D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-rs\": {\n\t\ta: \"Serbia Flag\",\n\t\tb: \"1F1F7-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t18\n\t\t]\n\t},\n\t\"man-frowning\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Frowning\",\n\t\tb: \"1F64D-200D-2642-FE0F\",\n\t\tc: \"1F64D-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t24\n\t\t]\n\t},\n\twhite_circle: {\n\t\ta: \"Medium White Circle\",\n\t\tb: \"26AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t22\n\t\t],\n\t\to: 4\n\t},\n\tsnowman: {\n\t\ta: \"Snowman\",\n\t\tb: \"2603-FE0F\",\n\t\tc: \"2603\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"winter\",\n\t\t\t\"season\",\n\t\t\t\"cold\",\n\t\t\t\"weather\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\",\n\t\t\t\"frozen\",\n\t\t\t\"without_snow\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t19\n\t\t],\n\t\to: 1\n\t},\n\tsnowman_without_snow: {\n\t\ta: \"Snowman Without Snow\",\n\t\tb: \"26C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t48,\n\t\t\t28\n\t\t],\n\t\to: 5\n\t},\n\tru: {\n\t\ta: \"Russia Flag\",\n\t\tb: \"1F1F7-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"russian\",\n\t\t\t\"federation\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t4,\n\t\t\t19\n\t\t],\n\t\tn: [\n\t\t\t\"flag-ru\"\n\t\t]\n\t},\n\tblack_circle: {\n\t\ta: \"Medium Black Circle\",\n\t\tb: \"26AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"button\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t23\n\t\t],\n\t\to: 4\n\t},\n\t\"woman-frowning\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64D\",\n\t\ta: \"Woman Frowning\",\n\t\tb: \"1F64D-200D-2640-FE0F\",\n\t\tc: \"1F64D-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-rw\": {\n\t\ta: \"Rwanda Flag\",\n\t\tb: \"1F1F7-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t20\n\t\t]\n\t},\n\tcomet: {\n\t\ta: \"Comet\",\n\t\tb: \"2604-FE0F\",\n\t\tc: \"2604\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"space\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t20\n\t\t],\n\t\to: 1\n\t},\n\tperson_with_pouting_face: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fe.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3ff.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64E-200D-2640-FE0F\",\n\t\ta: \"Person with Pouting Face\",\n\t\tb: \"1F64E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t48\n\t\t]\n\t},\n\tred_circle: {\n\t\ta: \"Large Red Circle\",\n\t\tb: \"1F534\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"error\",\n\t\t\t\"danger\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t2\n\t\t]\n\t},\n\tlarge_blue_circle: {\n\t\ta: \"Large Blue Circle\",\n\t\tb: \"1F535\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-pouting\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Pouting\",\n\t\tb: \"1F64E-200D-2642-FE0F\",\n\t\tc: \"1F64E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t42\n\t\t]\n\t},\n\t\"flag-sa\": {\n\t\ta: \"Saudi Arabia Flag\",\n\t\tb: \"1F1F8-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t21\n\t\t]\n\t},\n\tfire: {\n\t\ta: \"Fire\",\n\t\tb: \"1F525\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hot\",\n\t\t\t\"cook\",\n\t\t\t\"flame\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t39\n\t\t]\n\t},\n\t\"woman-pouting\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64E\",\n\t\ta: \"Woman Pouting\",\n\t\tb: \"1F64E-200D-2640-FE0F\",\n\t\tc: \"1F64E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-sb\": {\n\t\ta: \"Solomon Islands Flag\",\n\t\tb: \"1F1F8-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t22\n\t\t]\n\t},\n\tdroplet: {\n\t\ta: \"Droplet\",\n\t\tb: \"1F4A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"water\",\n\t\t\t\"drip\",\n\t\t\t\"faucet\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t13\n\t\t]\n\t},\n\tno_good: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F645-200D-2640-FE0F\",\n\t\ta: \"Face with No Good Gesture\",\n\t\tb: \"1F645\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t32,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-sc\": {\n\t\ta: \"Seychelles Flag\",\n\t\tb: \"1F1F8-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t23\n\t\t]\n\t},\n\tocean: {\n\t\ta: \"Water Wave\",\n\t\tb: \"1F30A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sea\",\n\t\t\t\"water\",\n\t\t\t\"wave\",\n\t\t\t\"nature\",\n\t\t\t\"tsunami\",\n\t\t\t\"disaster\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t2\n\t\t]\n\t},\n\t\"man-gesturing-no\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f645-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Gesturing No\",\n\t\tb: \"1F645-200D-2642-FE0F\",\n\t\tc: \"1F645-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t47\n\t\t]\n\t},\n\t\"flag-sd\": {\n\t\ta: \"Sudan Flag\",\n\t\tb: \"1F1F8-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t24\n\t\t]\n\t},\n\t\"woman-gesturing-no\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f645-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F645\",\n\t\ta: \"Woman Gesturing No\",\n\t\tb: \"1F645-200D-2640-FE0F\",\n\t\tc: \"1F645-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-se\": {\n\t\ta: \"Sweden Flag\",\n\t\tb: \"1F1F8-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-sg\": {\n\t\ta: \"Singapore Flag\",\n\t\tb: \"1F1F8-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t26\n\t\t]\n\t},\n\tok_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F646-200D-2640-FE0F\",\n\t\ta: \"Face with Ok Gesture\",\n\t\tb: \"1F646\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"women\",\n\t\t\t\"girl\",\n\t\t\t\"female\",\n\t\t\t\"pink\",\n\t\t\t\"human\",\n\t\t\t\"woman\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-sh\": {\n\t\ta: \"St. Helena Flag\",\n\t\tb: \"1F1F8-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t27\n\t\t]\n\t},\n\t\"man-gesturing-ok\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f646-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Gesturing Ok\",\n\t\tb: \"1F646-200D-2642-FE0F\",\n\t\tc: \"1F646-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-si\": {\n\t\ta: \"Slovenia Flag\",\n\t\tb: \"1F1F8-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t28\n\t\t]\n\t},\n\t\"woman-gesturing-ok\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f646-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F646\",\n\t\ta: \"Woman Gesturing Ok\",\n\t\tb: \"1F646-200D-2640-FE0F\",\n\t\tc: \"1F646-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t7\n\t\t]\n\t},\n\tinformation_desk_person: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F481-200D-2640-FE0F\",\n\t\ta: \"Information Desk Person\",\n\t\tb: \"1F481\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t23,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-sj\": {\n\t\ta: \"Svalbard & Jan Mayen Flag\",\n\t\tb: \"1F1F8-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t29\n\t\t]\n\t},\n\t\"man-tipping-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f481-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Tipping Hand\",\n\t\tb: \"1F481-200D-2642-FE0F\",\n\t\tc: \"1F481-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-sk\": {\n\t\ta: \"Slovakia Flag\",\n\t\tb: \"1F1F8-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-sl\": {\n\t\ta: \"Sierra Leone Flag\",\n\t\tb: \"1F1F8-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t31\n\t\t]\n\t},\n\t\"woman-tipping-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f481-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F481\",\n\t\ta: \"Woman Tipping Hand\",\n\t\tb: \"1F481-200D-2640-FE0F\",\n\t\tc: \"1F481-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-sm\": {\n\t\ta: \"San Marino Flag\",\n\t\tb: \"1F1F8-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t32\n\t\t]\n\t},\n\traising_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64B-200D-2640-FE0F\",\n\t\ta: \"Happy Person Raising One Hand\",\n\t\tb: \"1F64B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-sn\": {\n\t\ta: \"Senegal Flag\",\n\t\tb: \"1F1F8-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t33\n\t\t]\n\t},\n\t\"man-raising-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Raising Hand\",\n\t\tb: \"1F64B-200D-2642-FE0F\",\n\t\tc: \"1F64B-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t0\n\t\t]\n\t},\n\t\"flag-so\": {\n\t\ta: \"Somalia Flag\",\n\t\tb: \"1F1F8-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t34\n\t\t]\n\t},\n\t\"woman-raising-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64B\",\n\t\ta: \"Woman Raising Hand\",\n\t\tb: \"1F64B-200D-2640-FE0F\",\n\t\tc: \"1F64B-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-sr\": {\n\t\ta: \"Suriname Flag\",\n\t\tb: \"1F1F8-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t35\n\t\t]\n\t},\n\tbow: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F647-200D-2642-FE0F\",\n\t\ta: \"Person Bowing Deeply\",\n\t\tb: \"1F647\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t32,\n\t\t\t37\n\t\t]\n\t},\n\t\"man-bowing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f647-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F647\",\n\t\ta: \"Man Bowing\",\n\t\tb: \"1F647-200D-2642-FE0F\",\n\t\tc: \"1F647-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-ss\": {\n\t\ta: \"South Sudan Flag\",\n\t\tb: \"1F1F8-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t36\n\t\t]\n\t},\n\t\"woman-bowing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f647-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Bowing\",\n\t\tb: \"1F647-200D-2640-FE0F\",\n\t\tc: \"1F647-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-st\": {\n\t\ta: \"São Tomé & Príncipe Flag\",\n\t\tb: \"1F1F8-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t37\n\t\t]\n\t},\n\tface_palm: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Face Palm\",\n\t\tb: \"1F926\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sv\": {\n\t\ta: \"El Salvador Flag\",\n\t\tb: \"1F1F8-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t38\n\t\t]\n\t},\n\t\"man-facepalming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f926-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Facepalming\",\n\t\tb: \"1F926-200D-2642-FE0F\",\n\t\tc: \"1F926-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t35\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sx\": {\n\t\ta: \"Sint Maarten Flag\",\n\t\tb: \"1F1F8-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t39\n\t\t]\n\t},\n\t\"flag-sy\": {\n\t\ta: \"Syria Flag\",\n\t\tb: \"1F1F8-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t40\n\t\t]\n\t},\n\t\"woman-facepalming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f926-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Facepalming\",\n\t\tb: \"1F926-200D-2640-FE0F\",\n\t\tc: \"1F926-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t29\n\t\t],\n\t\to: 9\n\t},\n\tshrug: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Shrug\",\n\t\tb: \"1F937\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sz\": {\n\t\ta: \"Swaziland Flag\",\n\t\tb: \"1F1F8-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-ta\": {\n\t\ta: \"Tristan Da Cunha Flag\",\n\t\tb: \"1F1F9-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t42\n\t\t]\n\t},\n\t\"man-shrugging\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f937-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Shrugging\",\n\t\tb: \"1F937-200D-2642-FE0F\",\n\t\tc: \"1F937-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-shrugging\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f937-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Shrugging\",\n\t\tb: \"1F937-200D-2640-FE0F\",\n\t\tc: \"1F937-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t46\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-tc\": {\n\t\ta: \"Turks & Caicos Islands Flag\",\n\t\tb: \"1F1F9-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t43\n\t\t]\n\t},\n\tmassage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fb.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fc.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fd.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fe.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3ff.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F486-200D-2640-FE0F\",\n\t\ta: \"Face Massage\",\n\t\tb: \"1F486\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-td\": {\n\t\ta: \"Chad Flag\",\n\t\tb: \"1F1F9-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t44\n\t\t]\n\t},\n\t\"man-getting-massage\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f486-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Getting Massage\",\n\t\tb: \"1F486-200D-2642-FE0F\",\n\t\tc: \"1F486-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-tf\": {\n\t\ta: \"French Southern Territories Flag\",\n\t\tb: \"1F1F9-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t45\n\t\t]\n\t},\n\t\"woman-getting-massage\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f486-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F486\",\n\t\ta: \"Woman Getting Massage\",\n\t\tb: \"1F486-200D-2640-FE0F\",\n\t\tc: \"1F486-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-tg\": {\n\t\ta: \"Togo Flag\",\n\t\tb: \"1F1F9-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t46\n\t\t]\n\t},\n\thaircut: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fb.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fc.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fd.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fe.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3ff.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F487-200D-2640-FE0F\",\n\t\ta: \"Haircut\",\n\t\tb: \"1F487\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-th\": {\n\t\ta: \"Thailand Flag\",\n\t\tb: \"1F1F9-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t47\n\t\t]\n\t},\n\t\"man-getting-haircut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f487-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Getting Haircut\",\n\t\tb: \"1F487-200D-2642-FE0F\",\n\t\tc: \"1F487-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t22\n\t\t]\n\t},\n\t\"flag-tj\": {\n\t\ta: \"Tajikistan Flag\",\n\t\tb: \"1F1F9-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-tk\": {\n\t\ta: \"Tokelau Flag\",\n\t\tb: \"1F1F9-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-getting-haircut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f487-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F487\",\n\t\ta: \"Woman Getting Haircut\",\n\t\tb: \"1F487-200D-2640-FE0F\",\n\t\tc: \"1F487-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t16\n\t\t]\n\t},\n\twalking: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B6-200D-2642-FE0F\",\n\t\ta: \"Pedestrian\",\n\t\tb: \"1F6B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t36,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-tl\": {\n\t\ta: \"Timor-Leste Flag\",\n\t\tb: \"1F1F9-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t50\n\t\t]\n\t},\n\t\"man-walking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B6\",\n\t\ta: \"Man Walking\",\n\t\tb: \"1F6B6-200D-2642-FE0F\",\n\t\tc: \"1F6B6-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-tm\": {\n\t\ta: \"Turkmenistan Flag\",\n\t\tb: \"1F1F9-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t51\n\t\t]\n\t},\n\t\"woman-walking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Walking\",\n\t\tb: \"1F6B6-200D-2640-FE0F\",\n\t\tc: \"1F6B6-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t9\n\t\t]\n\t},\n\t\"flag-tn\": {\n\t\ta: \"Tunisia Flag\",\n\t\tb: \"1F1F9-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t0\n\t\t]\n\t},\n\trunner: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fb.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fc.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fd.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fe.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3ff.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3C3-200D-2642-FE0F\",\n\t\ta: \"Runner\",\n\t\tb: \"1F3C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t9,\n\t\t\t46\n\t\t],\n\t\tn: [\n\t\t\t\"running\"\n\t\t]\n\t},\n\t\"flag-to\": {\n\t\ta: \"Tonga Flag\",\n\t\tb: \"1F1F9-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t1\n\t\t]\n\t},\n\t\"man-running\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3C3\",\n\t\ta: \"Man Running\",\n\t\tb: \"1F3C3-200D-2642-FE0F\",\n\t\tc: \"1F3C3-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t9,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-tr\": {\n\t\ta: \"Turkey Flag\",\n\t\tb: \"1F1F9-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-tt\": {\n\t\ta: \"Trinidad & Tobago Flag\",\n\t\tb: \"1F1F9-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t3\n\t\t]\n\t},\n\t\"woman-running\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Running\",\n\t\tb: \"1F3C3-200D-2640-FE0F\",\n\t\tc: \"1F3C3-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t9,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-tv\": {\n\t\ta: \"Tuvalu Flag\",\n\t\tb: \"1F1F9-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t4\n\t\t]\n\t},\n\tdancer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F483-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F483-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F483-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F483-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F483-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Dancer\",\n\t\tb: \"1F483\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girl\",\n\t\t\t\"woman\",\n\t\t\t\"fun\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-tw\": {\n\t\ta: \"Taiwan Flag\",\n\t\tb: \"1F1F9-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t5\n\t\t]\n\t},\n\tman_dancing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F57A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F57A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F57A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F57A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F57A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Dancing\",\n\t\tb: \"1F57A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"boy\",\n\t\t\t\"fun\",\n\t\t\t\"dancer\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t21\n\t\t],\n\t\to: 9\n\t},\n\tdancers: {\n\t\tobsoleted_by: \"1F46F-200D-2640-FE0F\",\n\t\ta: \"Woman with Bunny Ears\",\n\t\tb: \"1F46F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t21,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-tz\": {\n\t\ta: \"Tanzania Flag\",\n\t\tb: \"1F1F9-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-ua\": {\n\t\ta: \"Ukraine Flag\",\n\t\tb: \"1F1FA-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t7\n\t\t]\n\t},\n\t\"man-with-bunny-ears-partying\": {\n\t\ta: \"Man with Bunny Ears Partying\",\n\t\tb: \"1F46F-200D-2642-FE0F\",\n\t\tc: \"1F46F-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t0\n\t\t]\n\t},\n\t\"woman-with-bunny-ears-partying\": {\n\t\tobsoletes: \"1F46F\",\n\t\ta: \"Woman with Bunny Ears Partying\",\n\t\tb: \"1F46F-200D-2640-FE0F\",\n\t\tc: \"1F46F-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t51\n\t\t]\n\t},\n\t\"flag-ug\": {\n\t\ta: \"Uganda Flag\",\n\t\tb: \"1F1FA-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t8\n\t\t]\n\t},\n\t\"flag-um\": {\n\t\ta: \"U.s. Outlying Islands Flag\",\n\t\tb: \"1F1FA-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t9\n\t\t]\n\t},\n\tperson_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D6-200D-2642-FE0F\",\n\t\ta: \"Person in Steamy Room\",\n\t\tb: \"1F9D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t40\n\t\t],\n\t\to: 10\n\t},\n\twoman_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman in Steamy Room\",\n\t\tb: \"1F9D6-200D-2640-FE0F\",\n\t\tc: \"1F9D6-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t28\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-un\": {\n\t\ta: \"United Nations Flag\",\n\t\tb: \"1F1FA-1F1F3\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t5,\n\t\t\t10\n\t\t]\n\t},\n\tus: {\n\t\ta: \"United States Flag\",\n\t\tb: \"1F1FA-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"united\",\n\t\t\t\"states\",\n\t\t\t\"america\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"flag-us\"\n\t\t]\n\t},\n\tman_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D6\",\n\t\ta: \"Man in Steamy Room\",\n\t\tb: \"1F9D6-200D-2642-FE0F\",\n\t\tc: \"1F9D6-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t34\n\t\t],\n\t\to: 10\n\t},\n\tperson_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D7-200D-2640-FE0F\",\n\t\ta: \"Person Climbing\",\n\t\tb: \"1F9D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t6\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-uy\": {\n\t\ta: \"Uruguay Flag\",\n\t\tb: \"1F1FA-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t12\n\t\t]\n\t},\n\twoman_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D7\",\n\t\ta: \"Woman Climbing\",\n\t\tb: \"1F9D7-200D-2640-FE0F\",\n\t\tc: \"1F9D7-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t46\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-uz\": {\n\t\ta: \"Uzbekistan Flag\",\n\t\tb: \"1F1FA-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t13\n\t\t]\n\t},\n\tman_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Climbing\",\n\t\tb: \"1F9D7-200D-2642-FE0F\",\n\t\tc: \"1F9D7-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t0\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-va\": {\n\t\ta: \"Vatican City Flag\",\n\t\tb: \"1F1FB-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t14\n\t\t]\n\t},\n\tperson_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D8-200D-2640-FE0F\",\n\t\ta: \"Person in Lotus Position\",\n\t\tb: \"1F9D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t24\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-vc\": {\n\t\ta: \"St. Vincent & Grenadines Flag\",\n\t\tb: \"1F1FB-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-ve\": {\n\t\ta: \"Venezuela Flag\",\n\t\tb: \"1F1FB-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t16\n\t\t]\n\t},\n\twoman_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D8\",\n\t\ta: \"Woman in Lotus Position\",\n\t\tb: \"1F9D8-200D-2640-FE0F\",\n\t\tc: \"1F9D8-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t12\n\t\t],\n\t\to: 10\n\t},\n\tman_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Lotus Position\",\n\t\tb: \"1F9D8-200D-2642-FE0F\",\n\t\tc: \"1F9D8-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-vg\": {\n\t\ta: \"British Virgin Islands Flag\",\n\t\tb: \"1F1FB-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t17\n\t\t]\n\t},\n\t\"flag-vi\": {\n\t\ta: \"U.s. Virgin Islands Flag\",\n\t\tb: \"1F1FB-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t18\n\t\t]\n\t},\n\tbath: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6C0-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6C0-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6C0-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6C0-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6C0-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Bath\",\n\t\tb: \"1F6C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"shower\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t36\n\t\t]\n\t},\n\tsleeping_accommodation: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6CC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6CC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6CC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6CC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6CC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Sleeping Accommodation\",\n\t\tb: \"1F6CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t48\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-vn\": {\n\t\ta: \"Vietnam Flag\",\n\t\tb: \"1F1FB-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t19\n\t\t]\n\t},\n\tman_in_business_suit_levitating: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F574-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fb.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F574-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fc.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F574-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fd.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F574-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fe.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F574-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3ff.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Business Suit Levitating\",\n\t\tb: \"1F574-FE0F\",\n\t\tc: \"1F574\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-vu\": {\n\t\ta: \"Vanuatu Flag\",\n\t\tb: \"1F1FB-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-wf\": {\n\t\ta: \"Wallis & Futuna Flag\",\n\t\tb: \"1F1FC-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t21\n\t\t]\n\t},\n\tspeaking_head_in_silhouette: {\n\t\ta: \"Speaking Head in Silhouette\",\n\t\tb: \"1F5E3-FE0F\",\n\t\tc: \"1F5E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\tbust_in_silhouette: {\n\t\ta: \"Bust in Silhouette\",\n\t\tb: \"1F464\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"user\",\n\t\t\t\"person\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-ws\": {\n\t\ta: \"Samoa Flag\",\n\t\tb: \"1F1FC-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t22\n\t\t]\n\t},\n\tbusts_in_silhouette: {\n\t\ta: \"Busts in Silhouette\",\n\t\tb: \"1F465\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"user\",\n\t\t\t\"person\",\n\t\t\t\"human\",\n\t\t\t\"group\",\n\t\t\t\"team\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-xk\": {\n\t\ta: \"Kosovo Flag\",\n\t\tb: \"1F1FD-1F1F0\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t23\n\t\t]\n\t},\n\tfencer: {\n\t\ta: \"Fencer\",\n\t\tb: \"1F93A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t48\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-ye\": {\n\t\ta: \"Yemen Flag\",\n\t\tb: \"1F1FE-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-yt\": {\n\t\ta: \"Mayotte Flag\",\n\t\tb: \"1F1FE-1F1F9\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t25\n\t\t]\n\t},\n\thorse_racing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C7-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C7-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C7-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C7-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C7-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Horse Racing\",\n\t\tb: \"1F3C7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"betting\",\n\t\t\t\"competition\",\n\t\t\t\"gambling\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-za\": {\n\t\ta: \"South Africa Flag\",\n\t\tb: \"1F1FF-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t26\n\t\t]\n\t},\n\tskier: {\n\t\ta: \"Skier\",\n\t\tb: \"26F7-FE0F\",\n\t\tc: \"26F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\",\n\t\t\t\"snow\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t44\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-zm\": {\n\t\ta: \"Zambia Flag\",\n\t\tb: \"1F1FF-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t27\n\t\t]\n\t},\n\tsnowboarder: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C2-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fb.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C2-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fc.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C2-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fd.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C2-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fe.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C2-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3ff.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Snowboarder\",\n\t\tb: \"1F3C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t28\n\t\t]\n\t},\n\tgolfer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fb.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fc.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fd.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fe.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3ff.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CC-FE0F-200D-2642-FE0F\",\n\t\ta: \"Golfer\",\n\t\tb: \"1F3CC-FE0F\",\n\t\tc: \"1F3CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t24\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-zw\": {\n\t\ta: \"Zimbabwe Flag\",\n\t\tb: \"1F1FF-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t28\n\t\t]\n\t},\n\t\"man-golfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CC-FE0F\",\n\t\ta: \"Man Golfing\",\n\t\tb: \"1F3CC-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-england\": {\n\t\ta: \"England Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\t\"woman-golfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Golfing\",\n\t\tb: \"1F3CC-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-scotland\": {\n\t\ta: \"Scotland Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-wales\": {\n\t\ta: \"Wales Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tsurfer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3C4-200D-2642-FE0F\",\n\t\ta: \"Surfer\",\n\t\tb: \"1F3C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t10,\n\t\t\t12\n\t\t]\n\t},\n\t\"man-surfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3C4\",\n\t\ta: \"Man Surfing\",\n\t\tb: \"1F3C4-200D-2642-FE0F\",\n\t\tc: \"1F3C4-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t6\n\t\t]\n\t},\n\t\"woman-surfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Surfing\",\n\t\tb: \"1F3C4-200D-2640-FE0F\",\n\t\tc: \"1F3C4-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t0\n\t\t]\n\t},\n\trowboat: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fb.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fc.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fd.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fe.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3ff.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6A3-200D-2642-FE0F\",\n\t\ta: \"Rowboat\",\n\t\tb: \"1F6A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t35,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-rowing-boat\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6A3\",\n\t\ta: \"Man Rowing Boat\",\n\t\tb: \"1F6A3-200D-2642-FE0F\",\n\t\tc: \"1F6A3-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t34,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-rowing-boat\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Rowing Boat\",\n\t\tb: \"1F6A3-200D-2640-FE0F\",\n\t\tc: \"1F6A3-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t34,\n\t\t\t43\n\t\t]\n\t},\n\tswimmer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CA-200D-2642-FE0F\",\n\t\ta: \"Swimmer\",\n\t\tb: \"1F3CA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t10,\n\t\t\t40\n\t\t]\n\t},\n\t\"man-swimming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CA\",\n\t\ta: \"Man Swimming\",\n\t\tb: \"1F3CA-200D-2642-FE0F\",\n\t\tc: \"1F3CA-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t34\n\t\t]\n\t},\n\t\"woman-swimming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Swimming\",\n\t\tb: \"1F3CA-200D-2640-FE0F\",\n\t\tc: \"1F3CA-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t28\n\t\t]\n\t},\n\tperson_with_ball: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"26F9-FE0F-200D-2642-FE0F\",\n\t\ta: \"Person with Ball\",\n\t\tb: \"26F9-FE0F\",\n\t\tc: \"26F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t49,\n\t\t\t6\n\t\t],\n\t\to: 5\n\t},\n\t\"man-bouncing-ball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FB-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FC-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FD-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FE-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FF-200D-2642\",\n\t\t\t\timage: \"26f9-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"26F9-FE0F\",\n\t\ta: \"Man Bouncing Ball\",\n\t\tb: \"26F9-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t49,\n\t\t\t0\n\t\t],\n\t\to: 5\n\t},\n\t\"woman-bouncing-ball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FB-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FC-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FD-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FE-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FF-200D-2640\",\n\t\t\t\timage: \"26f9-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Bouncing Ball\",\n\t\tb: \"26F9-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t46\n\t\t],\n\t\to: 5\n\t},\n\tweight_lifter: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fb.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fc.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fd.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fe.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3ff.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CB-FE0F-200D-2642-FE0F\",\n\t\ta: \"Weight Lifter\",\n\t\tb: \"1F3CB-FE0F\",\n\t\tc: \"1F3CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\t\"man-lifting-weights\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CB-FE0F\",\n\t\ta: \"Man Lifting Weights\",\n\t\tb: \"1F3CB-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\t\"woman-lifting-weights\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Lifting Weights\",\n\t\tb: \"1F3CB-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t46\n\t\t],\n\t\to: 7\n\t},\n\tbicyclist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fb.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fc.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fd.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fe.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3ff.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B4-200D-2642-FE0F\",\n\t\ta: \"Bicyclist\",\n\t\tb: \"1F6B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t35,\n\t\t\t37\n\t\t]\n\t},\n\t\"man-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B4\",\n\t\ta: \"Man Biking\",\n\t\tb: \"1F6B4-200D-2642-FE0F\",\n\t\tc: \"1F6B4-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t31\n\t\t]\n\t},\n\t\"woman-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Biking\",\n\t\tb: \"1F6B4-200D-2640-FE0F\",\n\t\tc: \"1F6B4-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t25\n\t\t]\n\t},\n\tmountain_bicyclist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B5-200D-2642-FE0F\",\n\t\ta: \"Mountain Bicyclist\",\n\t\tb: \"1F6B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t36,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-mountain-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B5\",\n\t\ta: \"Man Mountain Biking\",\n\t\tb: \"1F6B5-200D-2642-FE0F\",\n\t\tc: \"1F6B5-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-mountain-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Mountain Biking\",\n\t\tb: \"1F6B5-200D-2640-FE0F\",\n\t\tc: \"1F6B5-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t43\n\t\t]\n\t},\n\tracing_car: {\n\t\ta: \"Racing Car\",\n\t\tb: \"1F3CE-FE0F\",\n\t\tc: \"1F3CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"race\",\n\t\t\t\"fast\",\n\t\t\t\"formula\",\n\t\t\t\"f1\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t31\n\t\t],\n\t\to: 7\n\t},\n\tracing_motorcycle: {\n\t\ta: \"Racing Motorcycle\",\n\t\tb: \"1F3CD-FE0F\",\n\t\tc: \"1F3CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\tperson_doing_cartwheel: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Person Doing Cartwheel\",\n\t\tb: \"1F938\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\t\"man-cartwheeling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f938-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Cartwheeling\",\n\t\tb: \"1F938-200D-2642-FE0F\",\n\t\tc: \"1F938-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t18\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-cartwheeling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f938-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Cartwheeling\",\n\t\tb: \"1F938-200D-2640-FE0F\",\n\t\tc: \"1F938-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t12\n\t\t],\n\t\to: 9\n\t},\n\twrestlers: {\n\t\ta: \"Wrestlers\",\n\t\tb: \"1F93C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t51\n\t\t],\n\t\to: 9\n\t},\n\t\"man-wrestling\": {\n\t\ta: \"Man Wrestling\",\n\t\tb: \"1F93C-200D-2642-FE0F\",\n\t\tc: \"1F93C-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-wrestling\": {\n\t\ta: \"Woman Wrestling\",\n\t\tb: \"1F93C-200D-2640-FE0F\",\n\t\tc: \"1F93C-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t49\n\t\t],\n\t\to: 9\n\t},\n\twater_polo: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fb.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fc.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fd.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fe.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3ff.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Water Polo\",\n\t\tb: \"1F93D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t12\n\t\t],\n\t\to: 9\n\t},\n\t\"man-playing-water-polo\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Playing Water Polo\",\n\t\tb: \"1F93D-200D-2642-FE0F\",\n\t\tc: \"1F93D-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-playing-water-polo\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Playing Water Polo\",\n\t\tb: \"1F93D-200D-2640-FE0F\",\n\t\tc: \"1F93D-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\thandball: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fb.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fc.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fd.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fe.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3ff.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Handball\",\n\t\tb: \"1F93E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\t\"man-playing-handball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Playing Handball\",\n\t\tb: \"1F93E-200D-2642-FE0F\",\n\t\tc: \"1F93E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-playing-handball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Playing Handball\",\n\t\tb: \"1F93E-200D-2640-FE0F\",\n\t\tc: \"1F93E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t18\n\t\t],\n\t\to: 9\n\t},\n\tjuggling: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Juggling\",\n\t\tb: \"1F939\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t42\n\t\t],\n\t\to: 9\n\t},\n\t\"man-juggling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f939-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Juggling\",\n\t\tb: \"1F939-200D-2642-FE0F\",\n\t\tc: \"1F939-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-juggling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f939-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Juggling\",\n\t\tb: \"1F939-200D-2640-FE0F\",\n\t\tc: \"1F939-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\tcouple: {\n\t\ta: \"Man and Woman Holding Hands\",\n\t\tb: \"1F46B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"people\",\n\t\t\t\"human\",\n\t\t\t\"love\",\n\t\t\t\"date\",\n\t\t\t\"dating\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"marriage\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t30\n\t\t],\n\t\tn: [\n\t\t\t\"man_and_woman_holding_hands\"\n\t\t]\n\t},\n\ttwo_men_holding_hands: {\n\t\ta: \"Two Men Holding Hands\",\n\t\tb: \"1F46C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"couple\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"bromance\",\n\t\t\t\"friendship\",\n\t\t\t\"people\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t31\n\t\t]\n\t},\n\ttwo_women_holding_hands: {\n\t\ta: \"Two Women Holding Hands\",\n\t\tb: \"1F46D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"friendship\",\n\t\t\t\"couple\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"female\",\n\t\t\t\"people\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t32\n\t\t]\n\t},\n\tcouplekiss: {\n\t\tobsoleted_by: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\ta: \"Kiss\",\n\t\tb: \"1F48F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t41\n\t\t]\n\t},\n\t\"woman-kiss-man\": {\n\t\tobsoletes: \"1F48F\",\n\t\ta: \"Woman Kiss Man\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\tc: \"1F469-200D-2764-200D-1F48B-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t21\n\t\t]\n\t},\n\t\"man-kiss-man\": {\n\t\ta: \"Man Kiss Man\",\n\t\tb: \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\tc: \"1F468-200D-2764-200D-1F48B-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t18,\n\t\t\t10\n\t\t]\n\t},\n\t\"woman-kiss-woman\": {\n\t\ta: \"Woman Kiss Woman\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n\t\tc: \"1F469-200D-2764-200D-1F48B-200D-1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t22\n\t\t]\n\t},\n\tcouple_with_heart: {\n\t\tobsoleted_by: \"1F469-200D-2764-FE0F-200D-1F468\",\n\t\ta: \"Couple with Heart\",\n\t\tb: \"1F491\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t43\n\t\t]\n\t},\n\t\"woman-heart-man\": {\n\t\tobsoletes: \"1F491\",\n\t\ta: \"Woman Heart Man\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F468\",\n\t\tc: \"1F469-200D-2764-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t19\n\t\t]\n\t},\n\t\"man-heart-man\": {\n\t\ta: \"Man Heart Man\",\n\t\tb: \"1F468-200D-2764-FE0F-200D-1F468\",\n\t\tc: \"1F468-200D-2764-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t18,\n\t\t\t9\n\t\t]\n\t},\n\t\"woman-heart-woman\": {\n\t\ta: \"Woman Heart Woman\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F469\",\n\t\tc: \"1F469-200D-2764-200D-1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t20\n\t\t]\n\t},\n\tfamily: {\n\t\tobsoleted_by: \"1F468-200D-1F469-200D-1F466\",\n\t\ta: \"Family\",\n\t\tb: \"1F46A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t29\n\t\t],\n\t\tn: [\n\t\t\t\"man-woman-boy\"\n\t\t]\n\t},\n\t\"man-woman-boy\": {\n\t\tobsoletes: \"1F46A\",\n\t\ta: \"Man Woman Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"family\"\n\t\t]\n\t},\n\t\"man-woman-girl\": {\n\t\ta: \"Man Woman Girl\",\n\t\tb: \"1F468-200D-1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t4\n\t\t]\n\t},\n\t\"man-woman-girl-boy\": {\n\t\ta: \"Man Woman Girl Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t5\n\t\t]\n\t},\n\t\"man-woman-boy-boy\": {\n\t\ta: \"Man Woman Boy Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-woman-girl-girl\": {\n\t\ta: \"Man Woman Girl Girl\",\n\t\tb: \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t6\n\t\t]\n\t},\n\t\"man-man-boy\": {\n\t\ta: \"Man Man Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t49\n\t\t]\n\t},\n\t\"man-man-girl\": {\n\t\ta: \"Man Man Girl\",\n\t\tb: \"1F468-200D-1F468-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t51\n\t\t]\n\t},\n\t\"man-man-girl-boy\": {\n\t\ta: \"Man Man Girl Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t0\n\t\t]\n\t},\n\t\"man-man-boy-boy\": {\n\t\ta: \"Man Man Boy Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t50\n\t\t]\n\t},\n\t\"man-man-girl-girl\": {\n\t\ta: \"Man Man Girl Girl\",\n\t\tb: \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t1\n\t\t]\n\t},\n\t\"woman-woman-boy\": {\n\t\ta: \"Woman Woman Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t12\n\t\t]\n\t},\n\t\"woman-woman-girl\": {\n\t\ta: \"Woman Woman Girl\",\n\t\tb: \"1F469-200D-1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t14\n\t\t]\n\t},\n\t\"woman-woman-girl-boy\": {\n\t\ta: \"Woman Woman Girl Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t15\n\t\t]\n\t},\n\t\"woman-woman-boy-boy\": {\n\t\ta: \"Woman Woman Boy Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t13\n\t\t]\n\t},\n\t\"woman-woman-girl-girl\": {\n\t\ta: \"Woman Woman Girl Girl\",\n\t\tb: \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t16\n\t\t]\n\t},\n\t\"man-boy\": {\n\t\ta: \"Man Boy\",\n\t\tb: \"1F468-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t45\n\t\t]\n\t},\n\t\"man-boy-boy\": {\n\t\ta: \"Man Boy Boy\",\n\t\tb: \"1F468-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t44\n\t\t]\n\t},\n\t\"man-girl\": {\n\t\ta: \"Man Girl\",\n\t\tb: \"1F468-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t48\n\t\t]\n\t},\n\t\"man-girl-boy\": {\n\t\ta: \"Man Girl Boy\",\n\t\tb: \"1F468-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t46\n\t\t]\n\t},\n\t\"man-girl-girl\": {\n\t\ta: \"Man Girl Girl\",\n\t\tb: \"1F468-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t47\n\t\t]\n\t},\n\t\"woman-boy\": {\n\t\ta: \"Woman Boy\",\n\t\tb: \"1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t8\n\t\t]\n\t},\n\t\"woman-boy-boy\": {\n\t\ta: \"Woman Boy Boy\",\n\t\tb: \"1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t7\n\t\t]\n\t},\n\t\"woman-girl\": {\n\t\ta: \"Woman Girl\",\n\t\tb: \"1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t11\n\t\t]\n\t},\n\t\"woman-girl-boy\": {\n\t\ta: \"Woman Girl Boy\",\n\t\tb: \"1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t9\n\t\t]\n\t},\n\t\"woman-girl-girl\": {\n\t\ta: \"Woman Girl Girl\",\n\t\tb: \"1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t10\n\t\t]\n\t},\n\tselfie: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F933-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F933-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F933-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F933-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F933-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Selfie\",\n\t\tb: \"1F933\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"camera\",\n\t\t\t\"phone\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t22\n\t\t],\n\t\to: 9\n\t},\n\tmuscle: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F4AA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fb.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F4AA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fc.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F4AA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fd.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F4AA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fe.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F4AA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3ff.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Flexed Biceps\",\n\t\tb: \"1F4AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arm\",\n\t\t\t\"flex\",\n\t\t\t\"hand\",\n\t\t\t\"summer\",\n\t\t\t\"strong\",\n\t\t\t\"biceps\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t16\n\t\t]\n\t},\n\tpoint_left: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F448-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F448-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F448-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F448-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F448-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Left Pointing Backhand Index\",\n\t\tb: \"1F448\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"direction\",\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"left\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t19\n\t\t]\n\t},\n\tpoint_right: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F449-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F449-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F449-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F449-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F449-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Right Pointing Backhand Index\",\n\t\tb: \"1F449\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"right\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t25\n\t\t]\n\t},\n\tpoint_up: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"261D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fb.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"261D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fc.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"261D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fd.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"261D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fe.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"261D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3ff.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Up Pointing Index\",\n\t\tb: \"261D-FE0F\",\n\t\tc: \"261D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hand\",\n\t\t\t\"fingers\",\n\t\t\t\"direction\",\n\t\t\t\"up\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t26\n\t\t],\n\t\to: 1\n\t},\n\tpoint_up_2: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F446-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F446-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F446-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F446-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F446-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Up Pointing Backhand Index\",\n\t\tb: \"1F446\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"up\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t7\n\t\t]\n\t},\n\tmiddle_finger: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F595-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F595-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F595-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F595-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F595-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Reversed Hand with Middle Finger Extended\",\n\t\tb: \"1F595\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t38\n\t\t],\n\t\tn: [\n\t\t\t\"reversed_hand_with_middle_finger_extended\"\n\t\t],\n\t\to: 7\n\t},\n\tpoint_down: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F447-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F447-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F447-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F447-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F447-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Down Pointing Backhand Index\",\n\t\tb: \"1F447\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"down\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t13\n\t\t]\n\t},\n\tv: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Victory Hand\",\n\t\tb: \"270C-FE0F\",\n\t\tc: \"270C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"ohyeah\",\n\t\t\t\"hand\",\n\t\t\t\"peace\",\n\t\t\t\"victory\",\n\t\t\t\"two\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t30\n\t\t],\n\t\to: 1\n\t},\n\tcrossed_fingers: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Hand with Index and Middle Fingers Crossed\",\n\t\tb: \"1F91E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"lucky\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"hand_with_index_and_middle_fingers_crossed\"\n\t\t],\n\t\to: 9\n\t},\n\t\"spock-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F596-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F596-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F596-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F596-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F596-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand with Part Between Middle and Ring Fingers\",\n\t\tb: \"1F596\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tthe_horns: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F918-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F918-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F918-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F918-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F918-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Sign of the Horns\",\n\t\tb: \"1F918\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t32\n\t\t],\n\t\tn: [\n\t\t\t\"sign_of_the_horns\"\n\t\t],\n\t\to: 8\n\t},\n\tcall_me_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F919-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F919-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F919-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F919-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F919-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Call Me Hand\",\n\t\tb: \"1F919\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"gesture\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\traised_hand_with_fingers_splayed: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F590-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F590-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F590-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F590-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F590-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand with Fingers Splayed\",\n\t\tb: \"1F590-FE0F\",\n\t\tc: \"1F590\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hand\",\n\t\t\t\"fingers\",\n\t\t\t\"palm\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t32\n\t\t],\n\t\to: 7\n\t},\n\thand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand\",\n\t\tb: \"270B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t49,\n\t\t\t24\n\t\t],\n\t\tn: [\n\t\t\t\"raised_hand\"\n\t\t]\n\t},\n\tok_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Ok Hand Sign\",\n\t\tb: \"1F44C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"limbs\",\n\t\t\t\"perfect\",\n\t\t\t\"ok\",\n\t\t\t\"okay\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t43\n\t\t]\n\t},\n\t\"+1\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Thumbs Up Sign\",\n\t\tb: \"1F44D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thumbsup\",\n\t\t\t\"yes\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"agree\",\n\t\t\t\"accept\",\n\t\t\t\"cool\",\n\t\t\t\"hand\",\n\t\t\t\"like\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t49\n\t\t],\n\t\tn: [\n\t\t\t\"thumbsup\"\n\t\t]\n\t},\n\t\"-1\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Thumbs Down Sign\",\n\t\tb: \"1F44E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thumbsdown\",\n\t\t\t\"no\",\n\t\t\t\"dislike\",\n\t\t\t\"hand\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t3\n\t\t],\n\t\tn: [\n\t\t\t\"thumbsdown\"\n\t\t]\n\t},\n\tfist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Fist\",\n\t\tb: \"270A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"grasp\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t18\n\t\t]\n\t},\n\tfacepunch: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Fisted Hand Sign\",\n\t\tb: \"1F44A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"violence\",\n\t\t\t\"fist\",\n\t\t\t\"hit\",\n\t\t\t\"attack\",\n\t\t\t\"hand\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"punch\"\n\t\t]\n\t},\n\t\"left-facing_fist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Left-Facing Fist\",\n\t\tb: \"1F91B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\t\"right-facing_fist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Right-Facing Fist\",\n\t\tb: \"1F91C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\traised_back_of_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Back of Hand\",\n\t\tb: \"1F91A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"raised\",\n\t\t\t\"backhand\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t44\n\t\t],\n\t\to: 9\n\t},\n\twave: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Waving Hand Sign\",\n\t\tb: \"1F44B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"gesture\",\n\t\t\t\"goodbye\",\n\t\t\t\"solong\",\n\t\t\t\"farewell\",\n\t\t\t\"hello\",\n\t\t\t\"hi\",\n\t\t\t\"palm\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t37\n\t\t]\n\t},\n\ti_love_you_hand_sign: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"I Love You Hand Sign\",\n\t\tb: \"1F91F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\twriting_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Writing Hand\",\n\t\tb: \"270D-FE0F\",\n\t\tc: \"270D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lower_left_ballpoint_pen\",\n\t\t\t\"stationery\",\n\t\t\t\"write\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\tclap: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Clapping Hands Sign\",\n\t\tb: \"1F44F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"praise\",\n\t\t\t\"applause\",\n\t\t\t\"congrats\",\n\t\t\t\"yay\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t9\n\t\t]\n\t},\n\topen_hands: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F450-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F450-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F450-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F450-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F450-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Open Hands Sign\",\n\t\tb: \"1F450\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"butterfly\",\n\t\t\t\"hands\",\n\t\t\t\"open\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t15\n\t\t]\n\t},\n\traised_hands: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Person Raising Both Hands in Celebration\",\n\t\tb: \"1F64C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gesture\",\n\t\t\t\"hooray\",\n\t\t\t\"yea\",\n\t\t\t\"celebration\",\n\t\t\t\"hands\"\n\t\t],\n\t\tk: [\n\t\t\t33,\n\t\t\t12\n\t\t]\n\t},\n\tpalms_up_together: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F932-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F932-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F932-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F932-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F932-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Palms Up Together\",\n\t\tb: \"1F932\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\tpray: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fb.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fc.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fd.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fe.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3ff.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Person with Folded Hands\",\n\t\tb: \"1F64F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"please\",\n\t\t\t\"hope\",\n\t\t\t\"wish\",\n\t\t\t\"namaste\",\n\t\t\t\"highfive\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t2\n\t\t]\n\t},\n\thandshake: {\n\t\ta: \"Handshake\",\n\t\tb: \"1F91D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"agreement\",\n\t\t\t\"shake\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t10\n\t\t],\n\t\to: 9\n\t},\n\tnail_care: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F485-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F485-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F485-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F485-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F485-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Nail Polish\",\n\t\tb: \"1F485\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beauty\",\n\t\t\t\"manicure\",\n\t\t\t\"finger\",\n\t\t\t\"fashion\",\n\t\t\t\"nail\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t44\n\t\t]\n\t},\n\tear: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F442-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fb.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F442-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fc.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F442-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fd.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F442-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fe.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F442-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3ff.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Ear\",\n\t\tb: \"1F442\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hear\",\n\t\t\t\"sound\",\n\t\t\t\"listen\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t45\n\t\t]\n\t},\n\tnose: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F443-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F443-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F443-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F443-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F443-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Nose\",\n\t\tb: \"1F443\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"smell\",\n\t\t\t\"sniff\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t51\n\t\t]\n\t},\n\tfootprints: {\n\t\ta: \"Footprints\",\n\t\tb: \"1F463\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"feet\",\n\t\t\t\"tracking\",\n\t\t\t\"walking\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t39\n\t\t]\n\t},\n\teyes: {\n\t\ta: \"Eyes\",\n\t\tb: \"1F440\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"look\",\n\t\t\t\"watch\",\n\t\t\t\"stalk\",\n\t\t\t\"peek\",\n\t\t\t\"see\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t42\n\t\t]\n\t},\n\teye: {\n\t\ta: \"Eye\",\n\t\tb: \"1F441-FE0F\",\n\t\tc: \"1F441\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"look\",\n\t\t\t\"see\",\n\t\t\t\"watch\",\n\t\t\t\"stare\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\t\"eye-in-speech-bubble\": {\n\t\ta: \"Eye in Speech Bubble\",\n\t\tb: \"1F441-FE0F-200D-1F5E8-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t13,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tbrain: {\n\t\ta: \"Brain\",\n\t\tb: \"1F9E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\ttongue: {\n\t\ta: \"Tongue\",\n\t\tb: \"1F445\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mouth\",\n\t\t\t\"playful\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t6\n\t\t]\n\t},\n\tlips: {\n\t\ta: \"Mouth\",\n\t\tb: \"1F444\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mouth\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t5\n\t\t]\n\t},\n\tkiss: {\n\t\ta: \"Kiss Mark\",\n\t\tb: \"1F48B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"lips\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t37\n\t\t]\n\t},\n\tcupid: {\n\t\ta: \"Heart with Arrow\",\n\t\tb: \"1F498\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"heart\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t50\n\t\t]\n\t},\n\theart: {\n\t\ta: \"Heavy Black Heart\",\n\t\tb: \"2764-FE0F\",\n\t\tc: \"2764\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t8\n\t\t],\n\t\tl: [\n\t\t\t\"<3\"\n\t\t],\n\t\tm: \"<3\",\n\t\to: 1\n\t},\n\theartbeat: {\n\t\ta: \"Beating Heart\",\n\t\tb: \"1F493\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"pink\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t45\n\t\t]\n\t},\n\tbroken_heart: {\n\t\ta: \"Broken Heart\",\n\t\tb: \"1F494\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sad\",\n\t\t\t\"sorry\",\n\t\t\t\"break\",\n\t\t\t\"heart\",\n\t\t\t\"heartbreak\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t46\n\t\t],\n\t\tl: [\n\t\t\t\"</3\"\n\t\t],\n\t\tm: \"</3\"\n\t},\n\ttwo_hearts: {\n\t\ta: \"Two Hearts\",\n\t\tb: \"1F495\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t47\n\t\t]\n\t},\n\tsparkling_heart: {\n\t\ta: \"Sparkling Heart\",\n\t\tb: \"1F496\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t48\n\t\t]\n\t},\n\theartpulse: {\n\t\ta: \"Growing Heart\",\n\t\tb: \"1F497\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"like\",\n\t\t\t\"love\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"pink\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t49\n\t\t]\n\t},\n\tblue_heart: {\n\t\ta: \"Blue Heart\",\n\t\tb: \"1F499\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t51\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tgreen_heart: {\n\t\ta: \"Green Heart\",\n\t\tb: \"1F49A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t0\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tyellow_heart: {\n\t\ta: \"Yellow Heart\",\n\t\tb: \"1F49B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t1\n\t\t],\n\t\tm: \"<3\"\n\t},\n\torange_heart: {\n\t\ta: \"Orange Heart\",\n\t\tb: \"1F9E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\tpurple_heart: {\n\t\ta: \"Purple Heart\",\n\t\tb: \"1F49C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t2\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tblack_heart: {\n\t\ta: \"Black Heart\",\n\t\tb: \"1F5A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"evil\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\tgift_heart: {\n\t\ta: \"Heart with Ribbon\",\n\t\tb: \"1F49D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t3\n\t\t]\n\t},\n\trevolving_hearts: {\n\t\ta: \"Revolving Hearts\",\n\t\tb: \"1F49E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t4\n\t\t]\n\t},\n\theart_decoration: {\n\t\ta: \"Heart Decoration\",\n\t\tb: \"1F49F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"love\",\n\t\t\t\"like\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t5\n\t\t]\n\t},\n\theavy_heart_exclamation_mark_ornament: {\n\t\ta: \"Heavy Heart Exclamation Mark Ornament\",\n\t\tb: \"2763-FE0F\",\n\t\tc: \"2763\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t50,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tlove_letter: {\n\t\ta: \"Love Letter\",\n\t\tb: \"1F48C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"envelope\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t38\n\t\t]\n\t},\n\tzzz: {\n\t\ta: \"Sleeping Symbol\",\n\t\tb: \"1F4A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sleepy\",\n\t\t\t\"tired\",\n\t\t\t\"dream\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t10\n\t\t]\n\t},\n\tanger: {\n\t\ta: \"Anger Symbol\",\n\t\tb: \"1F4A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"mad\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t8\n\t\t]\n\t},\n\tbomb: {\n\t\ta: \"Bomb\",\n\t\tb: \"1F4A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"boom\",\n\t\t\t\"explode\",\n\t\t\t\"explosion\",\n\t\t\t\"terrorism\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t9\n\t\t]\n\t},\n\tboom: {\n\t\ta: \"Collision Symbol\",\n\t\tb: \"1F4A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bomb\",\n\t\t\t\"explode\",\n\t\t\t\"explosion\",\n\t\t\t\"collision\",\n\t\t\t\"blown\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"collision\"\n\t\t]\n\t},\n\tsweat_drops: {\n\t\ta: \"Splashing Sweat Symbol\",\n\t\tb: \"1F4A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"water\",\n\t\t\t\"drip\",\n\t\t\t\"oops\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t12\n\t\t]\n\t},\n\tdash: {\n\t\ta: \"Dash Symbol\",\n\t\tb: \"1F4A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wind\",\n\t\t\t\"air\",\n\t\t\t\"fast\",\n\t\t\t\"shoo\",\n\t\t\t\"fart\",\n\t\t\t\"smoke\",\n\t\t\t\"puff\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t14\n\t\t]\n\t},\n\tdizzy: {\n\t\ta: \"Dizzy Symbol\",\n\t\tb: \"1F4AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"star\",\n\t\t\t\"sparkle\",\n\t\t\t\"shoot\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t22\n\t\t]\n\t},\n\tspeech_balloon: {\n\t\ta: \"Speech Balloon\",\n\t\tb: \"1F4AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bubble\",\n\t\t\t\"words\",\n\t\t\t\"message\",\n\t\t\t\"talk\",\n\t\t\t\"chatting\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t23\n\t\t]\n\t},\n\tleft_speech_bubble: {\n\t\ta: \"Left Speech Bubble\",\n\t\tb: \"1F5E8-FE0F\",\n\t\tc: \"1F5E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"message\",\n\t\t\t\"talk\",\n\t\t\t\"chatting\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tright_anger_bubble: {\n\t\ta: \"Right Anger Bubble\",\n\t\tb: \"1F5EF-FE0F\",\n\t\tc: \"1F5EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"caption\",\n\t\t\t\"speech\",\n\t\t\t\"thinking\",\n\t\t\t\"mad\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\tthought_balloon: {\n\t\ta: \"Thought Balloon\",\n\t\tb: \"1F4AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bubble\",\n\t\t\t\"cloud\",\n\t\t\t\"speech\",\n\t\t\t\"thinking\",\n\t\t\t\"dream\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t24\n\t\t]\n\t},\n\thole: {\n\t\ta: \"Hole\",\n\t\tb: \"1F573-FE0F\",\n\t\tc: \"1F573\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"embarrassing\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\teyeglasses: {\n\t\ta: \"Eyeglasses\",\n\t\tb: \"1F453\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"eyesight\",\n\t\t\t\"nerdy\",\n\t\t\t\"dork\",\n\t\t\t\"geek\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t23\n\t\t]\n\t},\n\tdark_sunglasses: {\n\t\ta: \"Dark Sunglasses\",\n\t\tb: \"1F576-FE0F\",\n\t\tc: \"1F576\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cool\",\n\t\t\t\"accessories\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\tnecktie: {\n\t\ta: \"Necktie\",\n\t\tb: \"1F454\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shirt\",\n\t\t\t\"suitup\",\n\t\t\t\"formal\",\n\t\t\t\"fashion\",\n\t\t\t\"cloth\",\n\t\t\t\"business\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t24\n\t\t]\n\t},\n\tshirt: {\n\t\ta: \"T-Shirt\",\n\t\tb: \"1F455\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t15,\n\t\t\t25\n\t\t],\n\t\tn: [\n\t\t\t\"tshirt\"\n\t\t]\n\t},\n\tjeans: {\n\t\ta: \"Jeans\",\n\t\tb: \"1F456\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t26\n\t\t]\n\t},\n\tscarf: {\n\t\ta: \"Scarf\",\n\t\tb: \"1F9E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t25\n\t\t],\n\t\to: 10\n\t},\n\tgloves: {\n\t\ta: \"Gloves\",\n\t\tb: \"1F9E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t26\n\t\t],\n\t\to: 10\n\t},\n\tcoat: {\n\t\ta: \"Coat\",\n\t\tb: \"1F9E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t27\n\t\t],\n\t\to: 10\n\t},\n\tsocks: {\n\t\ta: \"Socks\",\n\t\tb: \"1F9E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t28\n\t\t],\n\t\to: 10\n\t},\n\tdress: {\n\t\ta: \"Dress\",\n\t\tb: \"1F457\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clothes\",\n\t\t\t\"fashion\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t27\n\t\t]\n\t},\n\tkimono: {\n\t\ta: \"Kimono\",\n\t\tb: \"1F458\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dress\",\n\t\t\t\"fashion\",\n\t\t\t\"women\",\n\t\t\t\"female\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t28\n\t\t]\n\t},\n\tbikini: {\n\t\ta: \"Bikini\",\n\t\tb: \"1F459\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"swimming\",\n\t\t\t\"female\",\n\t\t\t\"woman\",\n\t\t\t\"girl\",\n\t\t\t\"fashion\",\n\t\t\t\"beach\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t29\n\t\t]\n\t},\n\twomans_clothes: {\n\t\ta: \"Womans Clothes\",\n\t\tb: \"1F45A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shopping_bags\",\n\t\t\t\"female\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t30\n\t\t]\n\t},\n\tpurse: {\n\t\ta: \"Purse\",\n\t\tb: \"1F45B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t31\n\t\t]\n\t},\n\thandbag: {\n\t\ta: \"Handbag\",\n\t\tb: \"1F45C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessory\",\n\t\t\t\"accessories\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t32\n\t\t]\n\t},\n\tpouch: {\n\t\ta: \"Pouch\",\n\t\tb: \"1F45D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bag\",\n\t\t\t\"accessories\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t33\n\t\t]\n\t},\n\tshopping_bags: {\n\t\ta: \"Shopping Bags\",\n\t\tb: \"1F6CD-FE0F\",\n\t\tc: \"1F6CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t2\n\t\t],\n\t\to: 7\n\t},\n\tschool_satchel: {\n\t\ta: \"School Satchel\",\n\t\tb: \"1F392\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"student\",\n\t\t\t\"education\",\n\t\t\t\"bag\",\n\t\t\t\"backpack\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t37\n\t\t]\n\t},\n\tmans_shoe: {\n\t\ta: \"Mans Shoe\",\n\t\tb: \"1F45E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"male\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t34\n\t\t],\n\t\tn: [\n\t\t\t\"shoe\"\n\t\t]\n\t},\n\tathletic_shoe: {\n\t\ta: \"Athletic Shoe\",\n\t\tb: \"1F45F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"sports\",\n\t\t\t\"sneakers\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t35\n\t\t]\n\t},\n\thigh_heel: {\n\t\ta: \"High-Heeled Shoe\",\n\t\tb: \"1F460\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shoes\",\n\t\t\t\"female\",\n\t\t\t\"pumps\",\n\t\t\t\"stiletto\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t36\n\t\t]\n\t},\n\tsandal: {\n\t\ta: \"Womans Sandal\",\n\t\tb: \"1F461\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"fashion\",\n\t\t\t\"flip flops\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t37\n\t\t]\n\t},\n\tboot: {\n\t\ta: \"Womans Boots\",\n\t\tb: \"1F462\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"fashion\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t38\n\t\t]\n\t},\n\tcrown: {\n\t\ta: \"Crown\",\n\t\tb: \"1F451\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"king\",\n\t\t\t\"kod\",\n\t\t\t\"leader\",\n\t\t\t\"royalty\",\n\t\t\t\"lord\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t21\n\t\t]\n\t},\n\twomans_hat: {\n\t\ta: \"Womans Hat\",\n\t\tb: \"1F452\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"female\",\n\t\t\t\"lady\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t22\n\t\t]\n\t},\n\ttophat: {\n\t\ta: \"Top Hat\",\n\t\tb: \"1F3A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"magic\",\n\t\t\t\"gentleman\",\n\t\t\t\"classy\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t3\n\t\t]\n\t},\n\tmortar_board: {\n\t\ta: \"Graduation Cap\",\n\t\tb: \"1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"school\",\n\t\t\t\"college\",\n\t\t\t\"degree\",\n\t\t\t\"university\",\n\t\t\t\"graduation\",\n\t\t\t\"cap\",\n\t\t\t\"hat\",\n\t\t\t\"legal\",\n\t\t\t\"learn\",\n\t\t\t\"education\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t38\n\t\t]\n\t},\n\tbilled_cap: {\n\t\ta: \"Billed Cap\",\n\t\tb: \"1F9E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t24\n\t\t],\n\t\to: 10\n\t},\n\thelmet_with_white_cross: {\n\t\ta: \"Helmet with White Cross\",\n\t\tb: \"26D1-FE0F\",\n\t\tc: \"26D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t33\n\t\t],\n\t\to: 5\n\t},\n\tprayer_beads: {\n\t\ta: \"Prayer Beads\",\n\t\tb: \"1F4FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dhikr\",\n\t\t\t\"religious\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t1\n\t\t],\n\t\to: 8\n\t},\n\tlipstick: {\n\t\ta: \"Lipstick\",\n\t\tb: \"1F484\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girl\",\n\t\t\t\"fashion\",\n\t\t\t\"woman\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t43\n\t\t]\n\t},\n\tring: {\n\t\ta: \"Ring\",\n\t\tb: \"1F48D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wedding\",\n\t\t\t\"propose\",\n\t\t\t\"marriage\",\n\t\t\t\"valentines\",\n\t\t\t\"diamond\",\n\t\t\t\"fashion\",\n\t\t\t\"jewelry\",\n\t\t\t\"gem\",\n\t\t\t\"engagement\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t39\n\t\t]\n\t},\n\tgem: {\n\t\ta: \"Gem Stone\",\n\t\tb: \"1F48E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue\",\n\t\t\t\"ruby\",\n\t\t\t\"diamond\",\n\t\t\t\"jewelry\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t40\n\t\t]\n\t}\n};\nvar aliases = {\n\tsatisfied: \"laughing\",\n\tgrinning_face_with_star_eyes: \"star-struck\",\n\tface_with_one_eyebrow_raised: \"face_with_raised_eyebrow\",\n\ttelephone: \"phone\",\n\tcooking: \"fried_egg\",\n\tpaw_prints: \"feet\",\n\t\"flag-cn\": \"cn\",\n\tlantern: \"izakaya_lantern\",\n\tshocked_face_with_exploding_head: \"exploding_head\",\n\topen_book: \"book\",\n\t\"flag-de\": \"de\",\n\tgrinning_face_with_one_large_and_one_small_eye: \"zany_face\",\n\tserious_face_with_symbols_covering_mouth: \"face_with_symbols_on_mouth\",\n\tflipper: \"dolphin\",\n\tface_with_open_mouth_vomiting: \"face_vomiting\",\n\t\"flag-es\": \"es\",\n\tface_with_finger_covering_closed_lips: \"shushing_face\",\n\tsmiling_face_with_smiling_eyes_and_hand_covering_mouth: \"face_with_hand_over_mouth\",\n\t\"flag-fr\": \"fr\",\n\thoneybee: \"bee\",\n\tred_car: \"car\",\n\tenvelope: \"email\",\n\tuk: \"gb\",\n\t\"flag-gb\": \"gb\",\n\tpoop: \"hankey\",\n\tshit: \"hankey\",\n\tstaff_of_aesculapius: \"medical_symbol\",\n\tknife: \"hocho\",\n\tsailboat: \"boat\",\n\tpencil: \"memo\",\n\t\"flag-it\": \"it\",\n\t\"flag-jp\": \"jp\",\n\theavy_exclamation_mark: \"exclamation\",\n\t\"flag-kr\": \"kr\",\n\twaxing_gibbous_moon: \"moon\",\n\tmother_christmas: \"mrs_claus\",\n\tsun_small_cloud: \"mostly_sunny\",\n\tsun_behind_cloud: \"barely_sunny\",\n\tsun_behind_rain_cloud: \"partly_sunny_rain\",\n\tlightning_cloud: \"lightning\",\n\ttornado_cloud: \"tornado\",\n\t\"flag-ru\": \"ru\",\n\trunning: \"runner\",\n\t\"flag-us\": \"us\",\n\tman_and_woman_holding_hands: \"couple\",\n\t\"man-woman-boy\": \"family\",\n\tfamily: \"man-woman-boy\",\n\treversed_hand_with_middle_finger_extended: \"middle_finger\",\n\thand_with_index_and_middle_fingers_crossed: \"crossed_fingers\",\n\tsign_of_the_horns: \"the_horns\",\n\traised_hand: \"hand\",\n\tthumbsup: \"+1\",\n\tthumbsdown: \"-1\",\n\tpunch: \"facepunch\",\n\tcollision: \"boom\",\n\ttshirt: \"shirt\",\n\tshoe: \"mans_shoe\"\n};\nvar data = {\n\tcompressed: compressed,\n\tcategories: categories,\n\temojis: emojis,\n\taliases: aliases\n};\n\nfunction _classCallCheck (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError('Cannot call a class as a function');\n  }\n}\n\nvar _Object = Object;\n\nvar _createClass = (function createClass() {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if ('value' in descriptor) descriptor.writable = true;\n      _Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n})();\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n    hasDontEnumBug = !{ toString: null }.propertyIsEnumerable('toString'),\n    dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],\n    dontEnumsLength = dontEnums.length;\n\nfunction _Object$keys (obj) {\n  if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {\n    throw new TypeError('Object.keys called on non-object');\n  }\n\n  var result = [],\n      prop,\n      i;\n\n  for (prop in obj) {\n    if (hasOwnProperty.call(obj, prop)) {\n      result.push(prop);\n    }\n  }\n\n  if (hasDontEnumBug) {\n    for (i = 0; i < dontEnumsLength; i++) {\n      if (hasOwnProperty.call(obj, dontEnums[i])) {\n        result.push(dontEnums[i]);\n      }\n    }\n  }\n  return result;\n}\n\nvar mapping = {\n  name: 'a',\n  unified: 'b',\n  non_qualified: 'c',\n  has_img_apple: 'd',\n  has_img_google: 'e',\n  has_img_twitter: 'f',\n  has_img_emojione: 'g',\n  has_img_facebook: 'h',\n  has_img_messenger: 'i',\n  keywords: 'j',\n  sheet: 'k',\n  emoticons: 'l',\n  text: 'm',\n  short_names: 'n',\n  added_in: 'o'\n};\n\nvar buildSearch = function buildSearch(emoji) {\n  var search = [];\n\n  var addToSearch = function addToSearch(strings, split) {\n    if (!strings) {\n      return;\n    }\n(Array.isArray(strings) ? strings : [strings]).forEach(function (string) {\n(split ? string.split(/[-|_|\\s]+/) : [string]).forEach(function (s) {\n        s = s.toLowerCase();\n\n        if (search.indexOf(s) == -1) {\n          search.push(s);\n        }\n      });\n    });\n  };\n\n  addToSearch(emoji.short_names, true);\n  addToSearch(emoji.name, true);\n  addToSearch(emoji.keywords, false);\n  addToSearch(emoji.emoticons, false);\n\n  return search.join(',');\n};\n\nvar uncompress = function uncompress(data) {\n  data.compressed = false;\n\n  for (var id in data.emojis) {\n    var emoji = data.emojis[id];\n\n    for (var key in mapping) {\n      emoji[key] = emoji[mapping[key]];\n      delete emoji[mapping[key]];\n    }\n\n    if (!emoji.short_names) emoji.short_names = [];\n    emoji.short_names.unshift(id);\n\n    emoji.sheet_x = emoji.sheet[0];\n    emoji.sheet_y = emoji.sheet[1];\n    delete emoji.sheet;\n\n    if (!emoji.text) emoji.text = '';\n\n    if (!emoji.added_in) emoji.added_in = 6;\n    emoji.added_in = emoji.added_in.toFixed(1);\n\n    emoji.search = buildSearch(emoji);\n  }\n};\n\nvar _String = String;\n\nvar stringFromCodePoint = _String.fromCodePoint || function stringFromCodePoint() {\n  var MAX_SIZE = 0x4000;\n  var codeUnits = [];\n  var highSurrogate;\n  var lowSurrogate;\n  var index = -1;\n  var length = arguments.length;\n  if (!length) {\n    return '';\n  }\n  var result = '';\n  while (++index < length) {\n    var codePoint = Number(arguments[index]);\n    if (!isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n    codePoint < 0 || // not a valid Unicode code point\n    codePoint > 0x10ffff || // not a valid Unicode code point\n    Math.floor(codePoint) != codePoint // not an integer\n    ) {\n        throw RangeError('Invalid code point: ' + codePoint);\n      }\n    if (codePoint <= 0xffff) {\n      // BMP code point\n      codeUnits.push(codePoint);\n    } else {\n      // Astral code point; split in surrogate halves\n      // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n      codePoint -= 0x10000;\n      highSurrogate = (codePoint >> 10) + 0xd800;\n      lowSurrogate = codePoint % 0x400 + 0xdc00;\n      codeUnits.push(highSurrogate, lowSurrogate);\n    }\n    if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n      result += String.fromCharCode.apply(null, codeUnits);\n      codeUnits.length = 0;\n    }\n  }\n  return result;\n};\n\nvar _JSON = JSON;\n\nvar COLONS_REGEX = /^(?:\\:([^\\:]+)\\:)(?:\\:skin-tone-(\\d)\\:)?$/;\nvar SKINS = ['1F3FA', '1F3FB', '1F3FC', '1F3FD', '1F3FE', '1F3FF'];\n\nfunction unifiedToNative(unified) {\n  var unicodes = unified.split('-'),\n      codePoints = unicodes.map(function (u) {\n    return '0x' + u;\n  });\n\n  return stringFromCodePoint.apply(null, codePoints);\n}\n\nfunction sanitize(emoji) {\n  var name = emoji.name;\n  var short_names = emoji.short_names;\n  var skin_tone = emoji.skin_tone;\n  var skin_variations = emoji.skin_variations;\n  var emoticons = emoji.emoticons;\n  var unified = emoji.unified;\n  var custom = emoji.custom;\n  var imageUrl = emoji.imageUrl;\n  var id = emoji.id || short_names[0];\n  var colons = ':' + id + ':';\n\n  if (custom) {\n    return {\n      id: id,\n      name: name,\n      short_names: short_names,\n      colons: colons,\n      emoticons: emoticons,\n      custom: custom,\n      imageUrl: imageUrl\n    };\n  }\n\n  if (skin_tone) {\n    colons += ':skin-tone-' + skin_tone + ':';\n  }\n\n  return {\n    id: id,\n    name: name,\n    short_names: short_names,\n    colons: colons,\n    emoticons: emoticons,\n    unified: unified.toLowerCase(),\n    skin: skin_tone || (skin_variations ? 1 : null),\n    native: unifiedToNative(unified)\n  };\n}\n\nfunction getSanitizedData() {\n  return sanitize(getData.apply(undefined, arguments));\n}\n\nfunction getData(emoji, skin, set, data) {\n  var emojiData = {};\n\n  if (typeof emoji == 'string') {\n    var matches = emoji.match(COLONS_REGEX);\n\n    if (matches) {\n      emoji = matches[1];\n\n      if (matches[2]) {\n        skin = parseInt(matches[2], 10);\n      }\n    }\n\n    if (data.aliases.hasOwnProperty(emoji)) {\n      emoji = data.aliases[emoji];\n    }\n\n    if (data.emojis.hasOwnProperty(emoji)) {\n      emojiData = data.emojis[emoji];\n    } else {\n      return null;\n    }\n  } else if (emoji.id) {\n    if (data.aliases.hasOwnProperty(emoji.id)) {\n      emoji.id = data.aliases[emoji.id];\n    }\n\n    if (data.emojis.hasOwnProperty(emoji.id)) {\n      emojiData = data.emojis[emoji.id];\n      skin || (skin = emoji.skin);\n    }\n  }\n\n  if (!_Object$keys(emojiData).length) {\n    emojiData = emoji;\n    emojiData.custom = true;\n\n    if (!emojiData.search) {\n      emojiData.search = buildSearch(emoji);\n    }\n  }\n\n  emojiData.emoticons || (emojiData.emoticons = []);\n  emojiData.variations || (emojiData.variations = []);\n\n  if (emojiData.skin_variations && skin > 1) {\n    emojiData = JSON.parse(_JSON.stringify(emojiData));\n\n    var skinKey = SKINS[skin - 1],\n        variationData = emojiData.skin_variations[skinKey];\n\n    if (!variationData.variations && emojiData.variations) {\n      delete emojiData.variations;\n    }\n\n    if (set && (variationData['has_img_' + set] == undefined || variationData['has_img_' + set]) || !set) {\n      emojiData.skin_tone = skin;\n\n      for (var k in variationData) {\n        var v = variationData[k];\n        emojiData[k] = v;\n      }\n    }\n  }\n\n  if (emojiData.variations && emojiData.variations.length) {\n    emojiData = JSON.parse(_JSON.stringify(emojiData));\n    emojiData.unified = emojiData.variations.shift();\n  }\n\n  return emojiData;\n}\n\nfunction uniq(arr) {\n  return arr.reduce(function (acc, item) {\n    if (acc.indexOf(item) === -1) {\n      acc.push(item);\n    }\n    return acc;\n  }, []);\n}\n\nfunction intersect(a, b) {\n  var uniqA = uniq(a);\n  var uniqB = uniq(b);\n\n  return uniqA.filter(function (item) {\n    return uniqB.indexOf(item) >= 0;\n  });\n}\n\nfunction deepMerge(a, b) {\n  var o = {};\n\n  for (var key in a) {\n    var originalValue = a[key],\n        value = originalValue;\n\n    if (b.hasOwnProperty(key)) {\n      value = b[key];\n    }\n\n    if (typeof value === 'object') {\n      value = deepMerge(originalValue, value);\n    }\n\n    o[key] = value;\n  }\n\n  return o;\n}\n\n// https://github.com/sonicdoe/measure-scrollbar\nfunction measureScrollbar() {\n  if (typeof document == 'undefined') return 0;\n  var div = document.createElement('div');\n\n  div.style.width = '100px';\n  div.style.height = '100px';\n  div.style.overflow = 'scroll';\n  div.style.position = 'absolute';\n  div.style.top = '-9999px';\n\n  document.body.appendChild(div);\n  var scrollbarWidth = div.offsetWidth - div.clientWidth;\n  document.body.removeChild(div);\n\n  return scrollbarWidth;\n}\n\n// Use requestIdleCallback() if available, else fall back to setTimeout().\n// Throttle so as not to run too frequently.\nfunction throttleIdleTask(func) {\n  var doIdleTask = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n  var running = false;\n\n  return function throttled() {\n    if (running) {\n      return;\n    }\n    running = true;\n    doIdleTask(function () {\n      running = false;\n      func();\n    });\n  };\n}\n\nvar NAMESPACE = 'emoji-mart';\n\nvar _JSON$1 = JSON;\n\nvar isLocalStorageSupported = typeof window !== 'undefined' && 'localStorage' in window;\n\nvar getter = void 0;\nvar setter = void 0;\n\nfunction setHandlers(handlers) {\n  handlers || (handlers = {});\n\n  getter = handlers.getter;\n  setter = handlers.setter;\n}\n\nfunction setNamespace(namespace) {\n  NAMESPACE = namespace;\n}\n\nfunction update(state) {\n  for (var key in state) {\n    var value = state[key];\n    set(key, value);\n  }\n}\n\nfunction set(key, value) {\n  if (setter) {\n    setter(key, value);\n  } else {\n    if (!isLocalStorageSupported) return;\n    try {\n      window.localStorage[NAMESPACE + '.' + key] = _JSON$1.stringify(value);\n    } catch (e) {}\n  }\n}\n\nfunction get(key) {\n  if (getter) {\n    return getter(key);\n  } else {\n    if (!isLocalStorageSupported) return;\n    try {\n      var value = window.localStorage[NAMESPACE + '.' + key];\n    } catch (e) {\n      return;\n    }\n\n    if (value) {\n      return JSON.parse(value);\n    }\n  }\n}\n\nvar store = { update: update, set: set, get: get, setNamespace: setNamespace, setHandlers: setHandlers };\n\nvar NimbleEmojiIndex = function () {\n  function NimbleEmojiIndex(data, set) {\n    _classCallCheck(this, NimbleEmojiIndex);\n\n    if (data.compressed) {\n      uncompress(data);\n    }\n\n    this.data = data || {};\n    this.set = set || null;\n    this.originalPool = {};\n    this.index = {};\n    this.emojis = {};\n    this.emoticons = {};\n    this.customEmojisList = [];\n\n    this.buildIndex();\n  }\n\n  _createClass(NimbleEmojiIndex, [{\n    key: 'buildIndex',\n    value: function buildIndex() {\n      var _this = this;\n\n      var _loop = function _loop(emoji) {\n        var emojiData = _this.data.emojis[emoji];\n        var short_names = emojiData.short_names;\n        var emoticons = emojiData.emoticons;\n        var skin_variations = emojiData.skin_variations;\n        var id = short_names[0];\n\n        if (emoticons) {\n          emoticons.forEach(function (emoticon) {\n            if (_this.emoticons[emoticon]) {\n              return;\n            }\n\n            _this.emoticons[emoticon] = id;\n          });\n        }\n\n        // If skin variations include them\n        if (skin_variations) {\n          _this.emojis[id] = {};\n          for (var skinTone = 1; skinTone <= 6; skinTone++) {\n            _this.emojis[id][skinTone] = getSanitizedData({ id: id, skin: skinTone }, skinTone, _this.set, _this.data);\n          }\n        } else {\n          _this.emojis[id] = getSanitizedData(id, null, _this.set, _this.data);\n        }\n\n        _this.originalPool[id] = emojiData;\n      };\n\n      for (var emoji in this.data.emojis) {\n        _loop(emoji);\n      }\n    }\n  }, {\n    key: 'clearCustomEmojis',\n    value: function clearCustomEmojis(pool) {\n      var _this2 = this;\n\n      this.customEmojisList.forEach(function (emoji) {\n        var emojiId = emoji.id || emoji.short_names[0];\n\n        delete pool[emojiId];\n        delete _this2.emojis[emojiId];\n      });\n    }\n  }, {\n    key: 'addCustomToPool',\n    value: function addCustomToPool(custom, pool) {\n      var _this3 = this;\n\n      if (this.customEmojisList.length) this.clearCustomEmojis(pool);\n\n      custom.forEach(function (emoji) {\n        var emojiId = emoji.id || emoji.short_names[0];\n\n        if (emojiId && !pool[emojiId]) {\n          pool[emojiId] = getData(emoji, null, null, _this3.data);\n          _this3.emojis[emojiId] = getSanitizedData(emoji, null, null, _this3.data);\n        }\n      });\n\n      this.customEmojisList = custom;\n      this.index = {};\n    }\n  }, {\n    key: 'search',\n    value: function search(value) {\n      var _this4 = this;\n\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var emojisToShowFilter = _ref.emojisToShowFilter;\n      var maxResults = _ref.maxResults;\n      var include = _ref.include;\n      var exclude = _ref.exclude;\n      var _ref$custom = _ref.custom;\n      var custom = _ref$custom === undefined ? [] : _ref$custom;\n\n      if (this.customEmojisList != custom) this.addCustomToPool(custom, this.originalPool);\n\n      var skinTone = store.get('skin') || 1;\n\n      maxResults || (maxResults = 75);\n      include || (include = []);\n      exclude || (exclude = []);\n\n      var results = null,\n          pool = this.originalPool;\n\n      if (value.length) {\n        if (value == '-' || value == '-1') {\n          return [this.emojis['-1'][skinTone]];\n        }\n\n        var values = value.toLowerCase().split(/[\\s|,|\\-|_]+/),\n            allResults = [];\n\n        if (values.length > 2) {\n          values = [values[0], values[1]];\n        }\n\n        if (include.length || exclude.length) {\n          pool = {};\n\n          this.data.categories.forEach(function (category) {\n            var isIncluded = include && include.length ? include.indexOf(category.id) > -1 : true;\n            var isExcluded = exclude && exclude.length ? exclude.indexOf(category.id) > -1 : false;\n            if (!isIncluded || isExcluded) {\n              return;\n            }\n\n            category.emojis.forEach(function (emojiId) {\n              return pool[emojiId] = _this4.data.emojis[emojiId];\n            });\n          });\n\n          if (custom.length) {\n            var customIsIncluded = include && include.length ? include.indexOf('custom') > -1 : true;\n            var customIsExcluded = exclude && exclude.length ? exclude.indexOf('custom') > -1 : false;\n            if (customIsIncluded && !customIsExcluded) {\n              this.addCustomToPool(custom, pool);\n            }\n          }\n        }\n\n        allResults = values.map(function (value) {\n          var aPool = pool,\n              aIndex = _this4.index,\n              length = 0;\n\n          for (var charIndex = 0; charIndex < value.length; charIndex++) {\n            var char = value[charIndex];\n            length++;\n\n            aIndex[char] || (aIndex[char] = {});\n            aIndex = aIndex[char];\n\n            if (!aIndex.results) {\n              (function () {\n                var scores = {};\n\n                aIndex.results = [];\n                aIndex.pool = {};\n\n                for (var _id in aPool) {\n                  var emoji = aPool[_id];\n                  var search = emoji.search;\n                  var sub = value.substr(0, length);\n                  var subIndex = search.indexOf(sub);\n\n                  if (subIndex != -1) {\n                    var score = subIndex + 1;\n                    if (sub == _id) score = 0;\n\n                    if (_this4.emojis[_id] && _this4.emojis[_id][skinTone]) {\n                      aIndex.results.push(_this4.emojis[_id][skinTone]);\n                    } else {\n                      aIndex.results.push(_this4.emojis[_id]);\n                    }\n                    aIndex.pool[_id] = emoji;\n\n                    scores[_id] = score;\n                  }\n                }\n\n                aIndex.results.sort(function (a, b) {\n                  var aScore = scores[a.id],\n                      bScore = scores[b.id];\n\n                  return aScore - bScore;\n                });\n              })();\n            }\n\n            aPool = aIndex.pool;\n          }\n\n          return aIndex.results;\n        }).filter(function (a) {\n          return a;\n        });\n\n        if (allResults.length > 1) {\n          results = intersect.apply(null, allResults);\n        } else if (allResults.length) {\n          results = allResults[0];\n        } else {\n          results = [];\n        }\n      }\n\n      if (results) {\n        if (emojisToShowFilter) {\n          results = results.filter(function (result) {\n            return emojisToShowFilter(pool[result.id]);\n          });\n        }\n\n        if (results && results.length > maxResults) {\n          results = results.slice(0, maxResults);\n        }\n      }\n\n      return results;\n    }\n  }]);\n\n  return NimbleEmojiIndex;\n}();\n\nvar emojiIndex = new NimbleEmojiIndex(data);\n\nvar DEFAULTS = ['+1', 'grinning', 'kissing_heart', 'heart_eyes', 'laughing', 'stuck_out_tongue_winking_eye', 'sweat_smile', 'joy', 'scream', 'disappointed', 'unamused', 'weary', 'sob', 'sunglasses', 'heart', 'poop'];\n\nvar frequently = void 0,\n    initialized = void 0;\nvar defaults = {};\n\nfunction init() {\n  initialized = true;\n  frequently = store.get('frequently');\n}\n\nfunction add(emoji) {\n  if (!initialized) init();\n  var id = emoji.id;\n\n\n  frequently || (frequently = defaults);\n  frequently[id] || (frequently[id] = 0);\n  frequently[id] += 1;\n\n  store.set('last', id);\n  store.set('frequently', frequently);\n}\n\nfunction get$1(perLine) {\n  if (!initialized) init();\n  if (!frequently) {\n    defaults = {};\n\n    var result = [];\n\n    for (var i = 0; i < perLine; i++) {\n      defaults[DEFAULTS[i]] = perLine - i;\n      result.push(DEFAULTS[i]);\n    }\n\n    return result;\n  }\n\n  var quantity = perLine * 4;\n  var frequentlyKeys = [];\n\n  for (var key in frequently) {\n    if (frequently.hasOwnProperty(key)) {\n      frequentlyKeys.push(key);\n    }\n  }\n\n  var sorted = frequentlyKeys.sort(function (a, b) {\n    return frequently[a] - frequently[b];\n  }).reverse();\n  var sliced = sorted.slice(0, quantity);\n\n  var last = store.get('last');\n\n  if (last && sliced.indexOf(last) == -1) {\n    sliced.pop();\n    sliced.push(last);\n  }\n\n  return sliced;\n}\n\nvar frequently$1 = { add: add, get: get$1 };\n\nvar _Object$1 = Object;\n\nvar _extends = _Object$1.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\nvar _Object$2 = Object;\n\nvar _Object$getPrototypeOf = _Object$2.getPrototypeOf || function (O) {\n  O = Object(O);\n\n  if (typeof O.constructor === 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  }\n\n  return O instanceof Object ? Object.prototype : null;\n};\n\nfunction possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n}\n\nvar _Object$3 = Object;\n\nfunction inherits(subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n  }\n\n  subClass.prototype = _Object$3.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) {\n    _Object$3.setPrototypeOf ? _Object$3.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n  }\n}\n\n// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel\n\n// MIT license\n\nvar isWindowAvailable = typeof window !== 'undefined';\n\nisWindowAvailable && function () {\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n\n    lastTime = currTime + timeToCall;\n    return id;\n  };\n\n  if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {\n    clearTimeout(id);\n  };\n}();\n\nvar categories$1 = {\n  activity: function activity() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113\" })\n    );\n  },\n\n  custom: function custom() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        \"g\",\n        { transform: \"translate(2.000000, 1.000000)\" },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", { id: \"Rectangle\", x: \"8\", y: \"0\", width: \"3\", height: \"21\", rx: \"1.5\" }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", {\n          id: \"Rectangle\",\n          transform: \"translate(9.843, 10.549) rotate(60) translate(-9.843, -10.549) \",\n          x: \"8.343\",\n          y: \"0.049\",\n          width: \"3\",\n          height: \"21\",\n          rx: \"1.5\"\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", {\n          id: \"Rectangle\",\n          transform: \"translate(9.843, 10.549) rotate(-60) translate(-9.843, -10.549) \",\n          x: \"8.343\",\n          y: \"0.049\",\n          width: \"3\",\n          height: \"21\",\n          rx: \"1.5\"\n        })\n      )\n    );\n  },\n\n  flags: function flags() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z\" })\n    );\n  },\n\n  foods: function foods() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9\" })\n    );\n  },\n\n  nature: function nature() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235\" })\n    );\n  },\n\n  objects: function objects() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789\" })\n    );\n  },\n\n  people: function people() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0\" })\n    );\n  },\n\n  places: function places() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z\" })\n    );\n  },\n\n  recent: function recent() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\" })\n    );\n  },\n\n  symbols: function symbols() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76\" })\n    );\n  }\n};\n\nvar search$1 = {\n  search: function search() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"13\",\n        height: \"13\",\n        viewBox: \"0 0 20 20\",\n        opacity: \"0.5\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" })\n    );\n  },\n\n  delete: function _delete() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"13\",\n        height: \"13\",\n        viewBox: \"0 0 20 20\",\n        opacity: \"0.5\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z\" })\n    );\n  }\n};\n\nvar icons = /*#__PURE__*/Object.freeze({\n  categories: categories$1,\n  search: search$1\n});\n\nvar EmojiPropTypes = {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  onOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  fallback: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  backgroundImageFn: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  forceSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  tooltip: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([1, 2, 3, 4, 5, 6]),\n  sheetSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([16, 20, 32, 64]),\n  sheetColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  sheetRows: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  set: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['apple', 'google', 'twitter', 'emojione', 'messenger', 'facebook']),\n  size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object]).isRequired\n};\n\nvar PickerPropTypes = {\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onSelect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onSkinChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  perLine: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  emojiSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n  style: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n  title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  color: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  set: EmojiPropTypes.set,\n  skin: EmojiPropTypes.skin,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  backgroundImageFn: EmojiPropTypes.backgroundImageFn,\n  sheetSize: EmojiPropTypes.sheetSize,\n  emojisToShowFilter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  showPreview: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  showSkinTones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  emojiTooltip: EmojiPropTypes.tooltip,\n  include: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  exclude: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  recent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  custom: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n    name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n    short_names: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string).isRequired,\n    emoticons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n    keywords: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n    imageUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n    spriteUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n    sheet_x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheet_y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheetColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheetRows: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n  })),\n  skinEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  notFoundEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nvar Anchors = function (_React$PureComponent) {\n  inherits(Anchors, _React$PureComponent);\n\n  function Anchors(props) {\n    _classCallCheck(this, Anchors);\n\n    var _this = possibleConstructorReturn(this, (Anchors.__proto__ || _Object$getPrototypeOf(Anchors)).call(this, props));\n\n    var defaultCategory = props.categories.filter(function (category) {\n      return category.first;\n    })[0];\n\n    _this.state = {\n      selected: defaultCategory.name\n    };\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    return _this;\n  }\n\n  _createClass(Anchors, [{\n    key: 'handleClick',\n    value: function handleClick(e) {\n      var index = e.currentTarget.getAttribute('data-index');\n      var _props = this.props;\n      var categories = _props.categories;\n      var onAnchorClick = _props.onAnchorClick;\n\n\n      onAnchorClick(categories[index], index);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props2 = this.props;\n      var categories = _props2.categories;\n      var color = _props2.color;\n      var i18n = _props2.i18n;\n      var icons = _props2.icons;\n      var selected = this.state.selected;\n\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'nav',\n        { className: 'emoji-mart-anchors', 'aria-label': i18n.categorieslabel },\n        categories.map(function (category, i) {\n          var id = category.id;\n          var name = category.name;\n          var anchor = category.anchor;\n          var isSelected = name == selected;\n\n          if (anchor === false) {\n            return null;\n          }\n\n          return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'button',\n            {\n              key: id,\n              'aria-label': i18n.categories[id],\n              title: i18n.categories[id],\n              'data-index': i,\n              type: 'button',\n              onClick: _this2.handleClick,\n              className: 'emoji-mart-anchor ' + (isSelected ? 'emoji-mart-anchor-selected' : ''),\n              style: { color: isSelected ? color : null }\n            },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-anchor-icon' },\n              icons.categories[id]()\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', {\n              className: 'emoji-mart-anchor-bar',\n              style: { backgroundColor: color }\n            })\n          );\n        })\n      );\n    }\n  }]);\n\n  return Anchors;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nAnchors.propTypes /* remove-proptypes */ = {\n  categories: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n  onAnchorClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nAnchors.defaultProps = {\n  categories: [],\n  onAnchorClick: function onAnchorClick() {},\n  icons: {}\n};\n\nvar EmojiDefaultProps = {\n  skin: 1,\n  set: 'apple',\n  sheetSize: 64,\n  sheetColumns: 52,\n  sheetRows: 52,\n  native: false,\n  forceSize: false,\n  tooltip: false,\n  backgroundImageFn: function backgroundImageFn(set, sheetSize) {\n    return 'https://unpkg.com/emoji-datasource-' + set + '@' + '4.0.4' + '/img/' + set + '/sheets-256/' + sheetSize + '.png';\n  }\n};\n\nvar PickerDefaultProps = {\n  onClick: function onClick() {},\n  onSelect: function onSelect() {},\n  onSkinChange: function onSkinChange() {},\n  emojiSize: 24,\n  perLine: 9,\n  i18n: {},\n  style: {},\n  title: 'Emoji Mart™',\n  emoji: 'department_store',\n  color: '#ae65c5',\n  set: EmojiDefaultProps.set,\n  skin: null,\n  defaultSkin: EmojiDefaultProps.skin,\n  native: EmojiDefaultProps.native,\n  sheetSize: EmojiDefaultProps.sheetSize,\n  backgroundImageFn: EmojiDefaultProps.backgroundImageFn,\n  emojisToShowFilter: null,\n  showPreview: true,\n  showSkinTones: true,\n  emojiTooltip: EmojiDefaultProps.tooltip,\n  autoFocus: false,\n  custom: [],\n  skinEmoji: '',\n  notFound: function notFound() {},\n  notFoundEmoji: 'sleuth_or_spy',\n  icons: {}\n};\n\nvar _getData = function _getData(props) {\n  var emoji = props.emoji;\n  var skin = props.skin;\n  var set = props.set;\n  var data = props.data;\n\n  return getData(emoji, skin, set, data);\n};\n\nvar _getPosition = function _getPosition(props) {\n  var _getData2 = _getData(props);\n\n  var sheet_x = _getData2.sheet_x;\n  var sheet_y = _getData2.sheet_y;\n  var multiplyX = 100 / (props.sheetColumns - 1);\n  var multiplyY = 100 / (props.sheetRows - 1);\n\n  return multiplyX * sheet_x + '% ' + multiplyY * sheet_y + '%';\n};\n\nvar _getSanitizedData = function _getSanitizedData(props) {\n  var emoji = props.emoji;\n  var skin = props.skin;\n  var set = props.set;\n  var data = props.data;\n\n  return getSanitizedData(emoji, skin, set, data);\n};\n\nvar _handleClick = function _handleClick(e, props) {\n  if (!props.onClick) {\n    return;\n  }\n  var onClick = props.onClick;\n  var emoji = _getSanitizedData(props);\n\n  onClick(emoji, e);\n};\n\nvar _handleOver = function _handleOver(e, props) {\n  if (!props.onOver) {\n    return;\n  }\n  var onOver = props.onOver;\n  var emoji = _getSanitizedData(props);\n\n  onOver(emoji, e);\n};\n\nvar _handleLeave = function _handleLeave(e, props) {\n  if (!props.onLeave) {\n    return;\n  }\n  var onLeave = props.onLeave;\n  var emoji = _getSanitizedData(props);\n\n  onLeave(emoji, e);\n};\n\nvar _isNumeric = function _isNumeric(value) {\n  return !isNaN(value - parseFloat(value));\n};\n\nvar _convertStyleToCSS = function _convertStyleToCSS(style) {\n  var div = document.createElement('div');\n\n  for (var key in style) {\n    var value = style[key];\n\n    if (_isNumeric(value)) {\n      value += 'px';\n    }\n\n    div.style[key] = value;\n  }\n\n  return div.getAttribute('style');\n};\n\nvar NimbleEmoji = function NimbleEmoji(props) {\n  if (props.data.compressed) {\n    uncompress(props.data);\n  }\n\n  for (var k in NimbleEmoji.defaultProps) {\n    if (props[k] == undefined && NimbleEmoji.defaultProps[k] != undefined) {\n      props[k] = NimbleEmoji.defaultProps[k];\n    }\n  }\n\n  var data = _getData(props);\n  if (!data) {\n    if (props.fallback) {\n      return props.fallback(null, props);\n    } else {\n      return null;\n    }\n  }\n\n  var unified = data.unified;\n  var custom = data.custom;\n  var short_names = data.short_names;\n  var imageUrl = data.imageUrl;\n  var style = {};\n  var children = props.children;\n  var className = 'emoji-mart-emoji';\n  var nativeEmoji = unified && unifiedToNative(unified);\n  // combine the emoji itself and all shortcodes into an accessible label\n  var label = [nativeEmoji].concat(short_names).filter(Boolean).join(', ');\n  var title = null;\n\n  if (!unified && !custom) {\n    if (props.fallback) {\n      return props.fallback(data, props);\n    } else {\n      return null;\n    }\n  }\n\n  if (props.tooltip) {\n    title = short_names[0];\n  }\n\n  if (props.native && unified) {\n    className += ' emoji-mart-emoji-native';\n    style = { fontSize: props.size };\n    children = nativeEmoji;\n\n    if (props.forceSize) {\n      style.display = 'inline-block';\n      style.width = props.size;\n      style.height = props.size;\n      style.wordBreak = 'keep-all';\n    }\n  } else if (custom) {\n    className += ' emoji-mart-emoji-custom';\n    style = {\n      width: props.size,\n      height: props.size,\n      display: 'inline-block'\n    };\n    if (data.spriteUrl) {\n      style = _extends({}, style, {\n        backgroundImage: 'url(' + data.spriteUrl + ')',\n        backgroundSize: 100 * props.sheetColumns + '% ' + 100 * props.sheetRows + '%',\n        backgroundPosition: _getPosition(props)\n      });\n    } else {\n      style = _extends({}, style, {\n        backgroundImage: 'url(' + imageUrl + ')',\n        backgroundSize: 'contain'\n      });\n    }\n  } else {\n    var setHasEmoji = data['has_img_' + props.set] == undefined || data['has_img_' + props.set];\n\n    if (!setHasEmoji) {\n      if (props.fallback) {\n        return props.fallback(data, props);\n      } else {\n        return null;\n      }\n    } else {\n      style = {\n        width: props.size,\n        height: props.size,\n        display: 'inline-block',\n        backgroundImage: 'url(' + props.backgroundImageFn(props.set, props.sheetSize) + ')',\n        backgroundSize: 100 * props.sheetColumns + '% ' + 100 * props.sheetRows + '%',\n        backgroundPosition: _getPosition(props)\n      };\n    }\n  }\n\n  var Tag = {\n    name: 'span',\n    props: {}\n  };\n\n  if (props.onClick) {\n    Tag.name = 'button';\n    Tag.props = {\n      type: 'button'\n    };\n  }\n\n  if (props.html) {\n    style = _convertStyleToCSS(style);\n    return '<' + Tag.name + ' style=\\'' + style + '\\' aria-label=\\'' + label + '\\' ' + (title ? 'title=\\'' + title + '\\'' : '') + ' class=\\'' + className + '\\'>' + (children || '') + '</' + Tag.name + '>';\n  } else {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      Tag.name,\n      _extends({\n        onClick: function onClick(e) {\n          return _handleClick(e, props);\n        },\n        onMouseEnter: function onMouseEnter(e) {\n          return _handleOver(e, props);\n        },\n        onMouseLeave: function onMouseLeave(e) {\n          return _handleLeave(e, props);\n        },\n        'aria-label': label,\n        title: title,\n        className: className\n      }, Tag.props),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'span',\n        { style: style },\n        children\n      )\n    );\n  }\n};\n\nNimbleEmoji.propTypes /* remove-proptypes */ = _extends({}, EmojiPropTypes, {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n});\nNimbleEmoji.defaultProps = EmojiDefaultProps;\n\nvar NotFound = function (_React$PureComponent) {\n  inherits(NotFound, _React$PureComponent);\n\n  function NotFound() {\n    _classCallCheck(this, NotFound);\n\n    return possibleConstructorReturn(this, (NotFound.__proto__ || _Object$getPrototypeOf(NotFound)).apply(this, arguments));\n  }\n\n  _createClass(NotFound, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var data = _props.data;\n      var emojiProps = _props.emojiProps;\n      var i18n = _props.i18n;\n      var notFound = _props.notFound;\n      var notFoundEmoji = _props.notFoundEmoji;\n\n\n      var component = notFound && notFound() || react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        { className: 'emoji-mart-no-results' },\n        NimbleEmoji(_extends({\n          data: data\n        }, emojiProps, {\n          size: 38,\n          emoji: notFoundEmoji,\n          onOver: null,\n          onLeave: null,\n          onClick: null\n        })),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-no-results-label' },\n          i18n.notfound\n        )\n      );\n\n      return component;\n    }\n  }]);\n\n  return NotFound;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nNotFound.propTypes /* remove-proptypes */ = {\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n};\n\nvar Category = function (_React$Component) {\n  inherits(Category, _React$Component);\n\n  function Category(props) {\n    _classCallCheck(this, Category);\n\n    var _this = possibleConstructorReturn(this, (Category.__proto__ || _Object$getPrototypeOf(Category)).call(this, props));\n\n    _this.data = props.data;\n    _this.setContainerRef = _this.setContainerRef.bind(_this);\n    _this.setLabelRef = _this.setLabelRef.bind(_this);\n    return _this;\n  }\n\n  _createClass(Category, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.margin = 0;\n      this.minMargin = 0;\n\n      this.memoizeSize();\n    }\n  }, {\n    key: 'shouldComponentUpdate',\n    value: function shouldComponentUpdate(nextProps, nextState) {\n      var _props = this.props;\n      var name = _props.name;\n      var perLine = _props.perLine;\n      var native = _props.native;\n      var hasStickyPosition = _props.hasStickyPosition;\n      var emojis = _props.emojis;\n      var emojiProps = _props.emojiProps;\n      var skin = emojiProps.skin;\n      var size = emojiProps.size;\n      var set = emojiProps.set;\n      var nextPerLine = nextProps.perLine;\n      var nextNative = nextProps.native;\n      var nextHasStickyPosition = nextProps.hasStickyPosition;\n      var nextEmojis = nextProps.emojis;\n      var nextEmojiProps = nextProps.emojiProps;\n      var nextSkin = nextEmojiProps.skin;\n      var nextSize = nextEmojiProps.size;\n      var nextSet = nextEmojiProps.set;\n      var shouldUpdate = false;\n\n      if (name == 'Recent' && perLine != nextPerLine) {\n        shouldUpdate = true;\n      }\n\n      if (name == 'Search') {\n        shouldUpdate = !(emojis == nextEmojis);\n      }\n\n      if (skin != nextSkin || size != nextSize || native != nextNative || set != nextSet || hasStickyPosition != nextHasStickyPosition) {\n        shouldUpdate = true;\n      }\n\n      return shouldUpdate;\n    }\n  }, {\n    key: 'memoizeSize',\n    value: function memoizeSize() {\n      if (!this.container) {\n        // probably this is a test environment, e.g. jest\n        this.top = 0;\n        this.maxMargin = 0;\n        return;\n      }\n      var parent = this.container.parentElement;\n\n      var _container$getBoundin = this.container.getBoundingClientRect();\n\n      var top = _container$getBoundin.top;\n      var height = _container$getBoundin.height;\n\n      var _parent$getBoundingCl = parent.getBoundingClientRect();\n\n      var parentTop = _parent$getBoundingCl.top;\n\n      var _label$getBoundingCli = this.label.getBoundingClientRect();\n\n      var labelHeight = _label$getBoundingCli.height;\n\n\n      this.top = top - parentTop + parent.scrollTop;\n\n      if (height == 0) {\n        this.maxMargin = 0;\n      } else {\n        this.maxMargin = height - labelHeight;\n      }\n    }\n  }, {\n    key: 'handleScroll',\n    value: function handleScroll(scrollTop) {\n      var margin = scrollTop - this.top;\n      margin = margin < this.minMargin ? this.minMargin : margin;\n      margin = margin > this.maxMargin ? this.maxMargin : margin;\n\n      if (margin == this.margin) return;\n\n      if (!this.props.hasStickyPosition) {\n        this.label.style.top = margin + 'px';\n      }\n\n      this.margin = margin;\n      return true;\n    }\n  }, {\n    key: 'getEmojis',\n    value: function getEmojis() {\n      var _this2 = this;\n\n      var _props2 = this.props;\n      var name = _props2.name;\n      var emojis = _props2.emojis;\n      var recent = _props2.recent;\n      var perLine = _props2.perLine;\n\n\n      if (name == 'Recent') {\n        var custom = this.props.custom;\n\n        var frequentlyUsed = recent || frequently$1.get(perLine);\n\n        if (frequentlyUsed.length) {\n          emojis = frequentlyUsed.map(function (id) {\n            var emoji = custom.filter(function (e) {\n              return e.id === id;\n            })[0];\n            if (emoji) {\n              return emoji;\n            }\n\n            return id;\n          }).filter(function (id) {\n            return !!getData(id, null, null, _this2.data);\n          });\n        }\n\n        if (emojis.length === 0 && frequentlyUsed.length > 0) {\n          return null;\n        }\n      }\n\n      if (emojis) {\n        emojis = emojis.slice(0);\n      }\n\n      return emojis;\n    }\n  }, {\n    key: 'updateDisplay',\n    value: function updateDisplay(display) {\n      var emojis = this.getEmojis();\n\n      if (!emojis || !this.container) {\n        return;\n      }\n\n      this.container.style.display = display;\n    }\n  }, {\n    key: 'setContainerRef',\n    value: function setContainerRef(c) {\n      this.container = c;\n    }\n  }, {\n    key: 'setLabelRef',\n    value: function setLabelRef(c) {\n      this.label = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this3 = this;\n\n      var _props3 = this.props;\n      var id = _props3.id;\n      var name = _props3.name;\n      var hasStickyPosition = _props3.hasStickyPosition;\n      var emojiProps = _props3.emojiProps;\n      var i18n = _props3.i18n;\n      var notFound = _props3.notFound;\n      var notFoundEmoji = _props3.notFoundEmoji;\n      var emojis = this.getEmojis();\n      var labelStyles = {};\n      var labelSpanStyles = {};\n      var containerStyles = {};\n\n      if (!emojis) {\n        containerStyles = {\n          display: 'none'\n        };\n      }\n\n      if (!hasStickyPosition) {\n        labelStyles = {\n          height: 28\n        };\n\n        labelSpanStyles = {\n          position: 'absolute'\n        };\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          ref: this.setContainerRef,\n          className: 'emoji-mart-category',\n          'aria-label': i18n.categories[id],\n          style: containerStyles\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            style: labelStyles,\n            'data-name': name,\n            className: 'emoji-mart-category-label'\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'span',\n            {\n              style: labelSpanStyles,\n              ref: this.setLabelRef,\n              'aria-hidden': true /* already labeled by the section aria-label */\n            },\n            i18n.categories[id]\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'ul',\n          { className: 'emoji-mart-category-list' },\n          emojis && emojis.map(function (emoji) {\n            return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'li',\n              { key: emoji.id || emoji },\n              NimbleEmoji(_extends({ emoji: emoji, data: _this3.data }, emojiProps))\n            );\n          })\n        ),\n        emojis && !emojis.length && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(NotFound, {\n          i18n: i18n,\n          notFound: notFound,\n          notFoundEmoji: notFoundEmoji,\n          data: this.data,\n          emojiProps: emojiProps\n        })\n      );\n    }\n  }]);\n\n  return Category;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\nCategory.propTypes /* remove-proptypes */ = {\n  emojis: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n  hasStickyPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,\n  perLine: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  recent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  notFoundEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired\n};\n\nCategory.defaultProps = {\n  emojis: [],\n  hasStickyPosition: true\n};\n\nvar Skins = function (_React$PureComponent) {\n  inherits(Skins, _React$PureComponent);\n\n  function Skins(props) {\n    _classCallCheck(this, Skins);\n\n    var _this = possibleConstructorReturn(this, (Skins.__proto__ || _Object$getPrototypeOf(Skins)).call(this, props));\n\n    _this.state = {\n      opened: false\n    };\n    return _this;\n  }\n\n  _createClass(Skins, [{\n    key: 'handleClick',\n    value: function handleClick(e) {\n      var skin = parseInt(e.currentTarget.getAttribute('data-skin'));\n      var onChange = this.props.onChange;\n\n\n      if (!this.state.opened) {\n        this.setState({ opened: true });\n      } else {\n        this.setState({ opened: false });\n        if (skin != this.props.skin) {\n          onChange(skin);\n        }\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Skins;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nSkins.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired\n};\n\nSkins.defaultProps = {\n  onChange: function onChange() {}\n};\n\nvar SkinsEmoji = function (_Skins) {\n  inherits(SkinsEmoji, _Skins);\n\n  function SkinsEmoji(props) {\n    _classCallCheck(this, SkinsEmoji);\n\n    var _this = possibleConstructorReturn(this, (SkinsEmoji.__proto__ || _Object$getPrototypeOf(SkinsEmoji)).call(this, props));\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    return _this;\n  }\n\n  _createClass(SkinsEmoji, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var skin = _props.skin;\n      var emojiProps = _props.emojiProps;\n      var data = _props.data;\n      var skinEmoji = _props.skinEmoji;\n      var i18n = _props.i18n;\n      var opened = this.state.opened;\n\n      var skinToneNodes = [];\n\n      for (var skinTone = 1; skinTone <= 6; skinTone++) {\n        var selected = skinTone === skin;\n        skinToneNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'span',\n          {\n            key: 'skin-tone-' + skinTone,\n            className: 'emoji-mart-skin-swatch custom' + (selected ? ' selected' : '')\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'span',\n            {\n              onClick: this.handleClick,\n              'data-skin': skinTone,\n              className: 'emoji-mart-skin-tone-' + skinTone\n            },\n            NimbleEmoji({\n              emoji: skinEmoji,\n              data: data,\n              skin: skinTone,\n              backgroundImageFn: emojiProps.backgroundImageFn,\n              native: emojiProps.native,\n              set: emojiProps.set,\n              sheetSize: emojiProps.sheetSize,\n              size: 23\n            })\n          )\n        ));\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        {\n          className: 'emoji-mart-skin-swatches custom' + (opened ? ' opened' : '')\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-skin-text' + (opened ? ' opened' : '') },\n          i18n.skintext\n        ),\n        skinToneNodes\n      );\n    }\n  }]);\n\n  return SkinsEmoji;\n}(Skins);\n\n\nSkinsEmoji.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  skinTone: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  skinEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nSkinsEmoji.defaultProps = {\n  onChange: function onChange() {},\n  skinTone: null\n};\n\nvar SkinsDot = function (_Skins) {\n  inherits(SkinsDot, _Skins);\n\n  function SkinsDot(props) {\n    _classCallCheck(this, SkinsDot);\n\n    var _this = possibleConstructorReturn(this, (SkinsDot.__proto__ || _Object$getPrototypeOf(SkinsDot)).call(this, props));\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    _this.handleKeyDown = _this.handleKeyDown.bind(_this);\n    return _this;\n  }\n\n  _createClass(SkinsDot, [{\n    key: 'handleKeyDown',\n    value: function handleKeyDown(event) {\n      // if either enter or space is pressed, then execute\n      if (event.keyCode === 13 || event.keyCode === 32) {\n        this.handleClick(event);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var skin = _props.skin;\n      var i18n = _props.i18n;\n      var opened = this.state.opened;\n\n      var skinToneNodes = [];\n\n      for (var skinTone = 1; skinTone <= 6; skinTone++) {\n        var selected = skinTone === skin;\n        var visible = opened || selected;\n        skinToneNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'span',\n          _extends({\n            key: 'skin-tone-' + skinTone,\n            className: 'emoji-mart-skin-swatch' + (selected ? ' selected' : ''),\n            'aria-label': i18n.skintones[skinTone],\n            'aria-hidden': !visible\n          }, opened ? { role: 'menuitem' } : {}),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', _extends({\n            onClick: this.handleClick,\n            onKeyDown: this.handleKeyDown,\n            role: 'button'\n          }, selected ? {\n            'aria-haspopup': true,\n            'aria-expanded': !!opened\n          } : {}, opened ? { 'aria-pressed': !!selected } : {}, {\n            tabIndex: visible ? '0' : '',\n            'aria-label': i18n.skintones[skinTone],\n            title: i18n.skintones[skinTone],\n            'data-skin': skinTone,\n            className: 'emoji-mart-skin emoji-mart-skin-tone-' + skinTone\n          }))\n        ));\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          className: 'emoji-mart-skin-swatches' + (opened ? ' opened' : ''),\n          'aria-label': i18n.skintext\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          opened ? { role: 'menubar' } : {},\n          skinToneNodes\n        )\n      );\n    }\n  }]);\n\n  return SkinsDot;\n}(Skins);\n\n\nSkinsDot.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nSkinsDot.defaultProps = {\n  onChange: function onChange() {}\n};\n\nvar Preview = function (_React$PureComponent) {\n  inherits(Preview, _React$PureComponent);\n\n  function Preview(props) {\n    _classCallCheck(this, Preview);\n\n    var _this = possibleConstructorReturn(this, (Preview.__proto__ || _Object$getPrototypeOf(Preview)).call(this, props));\n\n    _this.data = props.data;\n    _this.state = { emoji: null };\n    return _this;\n  }\n\n  _createClass(Preview, [{\n    key: 'render',\n    value: function render() {\n      var emoji = this.state.emoji;\n      var _props = this.props;\n      var emojiProps = _props.emojiProps;\n      var skinsProps = _props.skinsProps;\n      var showSkinTones = _props.showSkinTones;\n      var title = _props.title;\n      var idleEmoji = _props.emoji;\n      var i18n = _props.i18n;\n      var showPreview = _props.showPreview;\n\n\n      if (emoji && showPreview) {\n        var emojiData = getData(emoji, null, null, this.data);\n        var _emojiData$emoticons = emojiData.emoticons;\n        var emoticons = _emojiData$emoticons === undefined ? [] : _emojiData$emoticons;\n        var knownEmoticons = [];\n        var listedEmoticons = [];\n\n        emoticons.forEach(function (emoticon) {\n          if (knownEmoticons.indexOf(emoticon.toLowerCase()) >= 0) {\n            return;\n          }\n\n          knownEmoticons.push(emoticon.toLowerCase());\n          listedEmoticons.push(emoticon);\n        });\n\n        return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-preview' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-emoji', 'aria-hidden': 'true' },\n            NimbleEmoji(_extends({\n              key: emoji.id,\n              emoji: emoji,\n              data: this.data\n            }, emojiProps))\n          ),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-data', 'aria-hidden': 'true' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-name' },\n              emoji.name\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-shortnames' },\n              emojiData.short_names.map(function (short_name) {\n                return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n                  'span',\n                  { key: short_name, className: 'emoji-mart-preview-shortname' },\n                  ':',\n                  short_name,\n                  ':'\n                );\n              })\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-emoticons' },\n              listedEmoticons.map(function (emoticon) {\n                return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n                  'span',\n                  { key: emoticon, className: 'emoji-mart-preview-emoticon' },\n                  emoticon\n                );\n              })\n            )\n          )\n        );\n      } else {\n        return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-preview' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-emoji', 'aria-hidden': 'true' },\n            idleEmoji && idleEmoji.length && NimbleEmoji(_extends({ emoji: idleEmoji, data: this.data }, emojiProps))\n          ),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-data', 'aria-hidden': 'true' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'span',\n              { className: 'emoji-mart-title-label' },\n              title\n            )\n          ),\n          showSkinTones && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            {\n              className: 'emoji-mart-preview-skins' + (skinsProps.skinEmoji ? ' custom' : '')\n            },\n            skinsProps.skinEmoji ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(SkinsEmoji, {\n              skin: skinsProps.skin,\n              emojiProps: emojiProps,\n              data: this.data,\n              skinEmoji: skinsProps.skinEmoji,\n              i18n: i18n,\n              onChange: skinsProps.onChange\n            }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(SkinsDot, {\n              skin: skinsProps.skin,\n              i18n: i18n,\n              onChange: skinsProps.onChange\n            })\n          )\n        );\n      }\n    }\n  }]);\n\n  return Preview;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nPreview.propTypes /* remove-proptypes */ = {\n  showSkinTones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  skinsProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n};\n\nPreview.defaultProps = {\n  showSkinTones: true,\n  onChange: function onChange() {}\n};\n\nvar id = 0;\n\nvar Search = function (_React$PureComponent) {\n  inherits(Search, _React$PureComponent);\n\n  function Search(props) {\n    _classCallCheck(this, Search);\n\n    var _this = possibleConstructorReturn(this, (Search.__proto__ || _Object$getPrototypeOf(Search)).call(this, props));\n\n    _this.state = {\n      icon: search$1.search,\n      isSearching: false,\n      id: ++id\n    };\n\n    _this.data = props.data;\n    _this.emojiIndex = new NimbleEmojiIndex(_this.data);\n    _this.setRef = _this.setRef.bind(_this);\n    _this.clear = _this.clear.bind(_this);\n    _this.handleKeyUp = _this.handleKeyUp.bind(_this);\n\n    // throttle keyboard input so that typing isn't delayed\n    _this.handleChange = throttleIdleTask(_this.handleChange.bind(_this));\n    return _this;\n  }\n\n  _createClass(Search, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      // in some cases (e.g. preact) the input may already be pre-populated\n      // this.input is undefined in Jest tests\n      if (this.input && this.input.value) {\n        this.search(this.input.value);\n      }\n    }\n  }, {\n    key: 'search',\n    value: function search$$1(value) {\n      if (value == '') this.setState({\n        icon: search$1.search,\n        isSearching: false\n      });else this.setState({\n        icon: search$1.delete,\n        isSearching: true\n      });\n\n      this.props.onSearch(this.emojiIndex.search(value, {\n        emojisToShowFilter: this.props.emojisToShowFilter,\n        maxResults: this.props.maxResults,\n        include: this.props.include,\n        exclude: this.props.exclude,\n        custom: this.props.custom\n      }));\n    }\n  }, {\n    key: 'clear',\n    value: function clear() {\n      if (this.input.value == '') return;\n      this.input.value = '';\n      this.input.focus();\n      this.search('');\n    }\n  }, {\n    key: 'handleChange',\n    value: function handleChange() {\n      this.search(this.input.value);\n    }\n  }, {\n    key: 'handleKeyUp',\n    value: function handleKeyUp(e) {\n      if (e.keyCode === 13) {\n        this.clear();\n      }\n    }\n  }, {\n    key: 'setRef',\n    value: function setRef(c) {\n      this.input = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var i18n = _props.i18n;\n      var autoFocus = _props.autoFocus;\n      var _state = this.state;\n      var icon = _state.icon;\n      var isSearching = _state.isSearching;\n      var id = _state.id;\n\n      var inputId = 'emoji-mart-search-' + id;\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        { className: 'emoji-mart-search', 'aria-label': i18n.search },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('input', {\n          id: inputId,\n          ref: this.setRef,\n          type: 'search',\n          onChange: this.handleChange,\n          placeholder: i18n.search,\n          autoFocus: autoFocus\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'label',\n          { className: 'emoji-mart-sr-only', htmlFor: inputId },\n          i18n.search\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'button',\n          {\n            className: 'emoji-mart-search-icon',\n            onClick: this.clear,\n            onKeyUp: this.handleKeyUp,\n            'aria-label': i18n.clear,\n            disabled: !isSearching\n          },\n          icon()\n        )\n      );\n    }\n  }]);\n\n  return Search;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nSearch.propTypes /* remove-proptypes */ = {\n  onSearch: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  maxResults: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  emojisToShowFilter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n};\n\nSearch.defaultProps = {\n  onSearch: function onSearch() {},\n  maxResults: 75,\n  emojisToShowFilter: null,\n  autoFocus: false\n};\n\nvar I18N = {\n  search: 'Search',\n  clear: 'Clear', // Accessible label on \"clear\" button\n  notfound: 'No Emoji Found',\n  skintext: 'Choose your default skin tone',\n  categories: {\n    search: 'Search Results',\n    recent: 'Frequently Used',\n    people: 'Smileys & People',\n    nature: 'Animals & Nature',\n    foods: 'Food & Drink',\n    activity: 'Activity',\n    places: 'Travel & Places',\n    objects: 'Objects',\n    symbols: 'Symbols',\n    flags: 'Flags',\n    custom: 'Custom'\n  },\n  categorieslabel: 'Emoji categories', // Accessible title for the list of categories\n  skintones: {\n    1: 'Default Skin Tone',\n    2: 'Light Skin Tone',\n    3: 'Medium-Light Skin Tone',\n    4: 'Medium Skin Tone',\n    5: 'Medium-Dark Skin Tone',\n    6: 'Dark Skin Tone'\n  }\n};\n\nvar NimblePicker = function (_React$PureComponent) {\n  inherits(NimblePicker, _React$PureComponent);\n\n  function NimblePicker(props) {\n    _classCallCheck(this, NimblePicker);\n\n    var _this = possibleConstructorReturn(this, (NimblePicker.__proto__ || _Object$getPrototypeOf(NimblePicker)).call(this, props));\n\n    _this.RECENT_CATEGORY = { id: 'recent', name: 'Recent', emojis: null };\n    _this.CUSTOM_CATEGORY = { id: 'custom', name: 'Custom', emojis: [] };\n    _this.SEARCH_CATEGORY = {\n      id: 'search',\n      name: 'Search',\n      emojis: null,\n      anchor: false\n    };\n\n    if (props.data.compressed) {\n      uncompress(props.data);\n    }\n\n    _this.data = props.data;\n    _this.i18n = deepMerge(I18N, props.i18n);\n    _this.icons = deepMerge(icons, props.icons);\n    _this.state = {\n      skin: props.skin || store.get('skin') || props.defaultSkin,\n      firstRender: true\n    };\n\n    _this.categories = [];\n    var allCategories = [].concat(_this.data.categories);\n\n    if (props.custom.length > 0) {\n      _this.CUSTOM_CATEGORY.emojis = props.custom.map(function (emoji) {\n        return _extends({}, emoji, {\n          // `<Category />` expects emoji to have an `id`.\n          id: emoji.short_names[0],\n          custom: true\n        });\n      });\n\n      allCategories.push(_this.CUSTOM_CATEGORY);\n    }\n\n    _this.hideRecent = true;\n\n    if (props.include != undefined) {\n      allCategories.sort(function (a, b) {\n        if (props.include.indexOf(a.id) > props.include.indexOf(b.id)) {\n          return 1;\n        }\n\n        return -1;\n      });\n    }\n\n    for (var categoryIndex = 0; categoryIndex < allCategories.length; categoryIndex++) {\n      var category = allCategories[categoryIndex];\n      var isIncluded = props.include && props.include.length ? props.include.indexOf(category.id) > -1 : true;\n      var isExcluded = props.exclude && props.exclude.length ? props.exclude.indexOf(category.id) > -1 : false;\n      if (!isIncluded || isExcluded) {\n        continue;\n      }\n\n      if (props.emojisToShowFilter) {\n        var newEmojis = [];\n\n        var emojis = category.emojis;\n\n        for (var emojiIndex = 0; emojiIndex < emojis.length; emojiIndex++) {\n          var emoji = emojis[emojiIndex];\n          if (props.emojisToShowFilter(_this.data.emojis[emoji] || emoji)) {\n            newEmojis.push(emoji);\n          }\n        }\n\n        if (newEmojis.length) {\n          var newCategory = {\n            emojis: newEmojis,\n            name: category.name,\n            id: category.id\n          };\n\n          _this.categories.push(newCategory);\n        }\n      } else {\n        _this.categories.push(category);\n      }\n    }\n\n    var includeRecent = props.include && props.include.length ? props.include.indexOf(_this.RECENT_CATEGORY.id) > -1 : true;\n    var excludeRecent = props.exclude && props.exclude.length ? props.exclude.indexOf(_this.RECENT_CATEGORY.id) > -1 : false;\n    if (includeRecent && !excludeRecent) {\n      _this.hideRecent = false;\n      _this.categories.unshift(_this.RECENT_CATEGORY);\n    }\n\n    if (_this.categories[0]) {\n      _this.categories[0].first = true;\n    }\n\n    _this.categories.unshift(_this.SEARCH_CATEGORY);\n\n    _this.setAnchorsRef = _this.setAnchorsRef.bind(_this);\n    _this.handleAnchorClick = _this.handleAnchorClick.bind(_this);\n    _this.setSearchRef = _this.setSearchRef.bind(_this);\n    _this.handleSearch = _this.handleSearch.bind(_this);\n    _this.setScrollRef = _this.setScrollRef.bind(_this);\n    _this.handleScroll = _this.handleScroll.bind(_this);\n    _this.handleScrollPaint = _this.handleScrollPaint.bind(_this);\n    _this.handleEmojiOver = _this.handleEmojiOver.bind(_this);\n    _this.handleEmojiLeave = _this.handleEmojiLeave.bind(_this);\n    _this.handleEmojiClick = _this.handleEmojiClick.bind(_this);\n    _this.handleEmojiSelect = _this.handleEmojiSelect.bind(_this);\n    _this.setPreviewRef = _this.setPreviewRef.bind(_this);\n    _this.handleSkinChange = _this.handleSkinChange.bind(_this);\n    _this.handleKeyDown = _this.handleKeyDown.bind(_this);\n    return _this;\n  }\n\n  _createClass(NimblePicker, [{\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(props) {\n      if (props.skin) {\n        this.setState({ skin: props.skin });\n      } else if (props.defaultSkin && !store.get('skin')) {\n        this.setState({ skin: props.defaultSkin });\n      }\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      if (this.state.firstRender) {\n        this.testStickyPosition();\n        this.firstRenderTimeout = setTimeout(function () {\n          _this2.setState({ firstRender: false });\n        }, 60);\n      }\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this.updateCategoriesSize();\n      this.handleScroll();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.SEARCH_CATEGORY.emojis = null;\n\n      clearTimeout(this.leaveTimeout);\n      clearTimeout(this.firstRenderTimeout);\n    }\n  }, {\n    key: 'testStickyPosition',\n    value: function testStickyPosition() {\n      var stickyTestElement = document.createElement('div');\n\n      var prefixes = ['', '-webkit-', '-ms-', '-moz-', '-o-'];\n\n      prefixes.forEach(function (prefix) {\n        return stickyTestElement.style.position = prefix + 'sticky';\n      });\n\n      this.hasStickyPosition = !!stickyTestElement.style.position.length;\n    }\n  }, {\n    key: 'handleEmojiOver',\n    value: function handleEmojiOver(emoji) {\n      var preview = this.preview;\n\n      if (!preview) {\n        return;\n      }\n\n      // Use Array.prototype.find() when it is more widely supported.\n      var emojiData = this.CUSTOM_CATEGORY.emojis.filter(function (customEmoji) {\n        return customEmoji.id === emoji.id;\n      })[0];\n      for (var key in emojiData) {\n        if (emojiData.hasOwnProperty(key)) {\n          emoji[key] = emojiData[key];\n        }\n      }\n\n      preview.setState({ emoji: emoji });\n      clearTimeout(this.leaveTimeout);\n    }\n  }, {\n    key: 'handleEmojiLeave',\n    value: function handleEmojiLeave(emoji) {\n      var preview = this.preview;\n\n      if (!preview) {\n        return;\n      }\n\n      this.leaveTimeout = setTimeout(function () {\n        preview.setState({ emoji: null });\n      }, 16);\n    }\n  }, {\n    key: 'handleEmojiClick',\n    value: function handleEmojiClick(emoji, e) {\n      this.props.onClick(emoji, e);\n      this.handleEmojiSelect(emoji);\n    }\n  }, {\n    key: 'handleEmojiSelect',\n    value: function handleEmojiSelect(emoji) {\n      var _this3 = this;\n\n      this.props.onSelect(emoji);\n      if (!this.hideRecent && !this.props.recent) frequently$1.add(emoji);\n\n      var component = this.categoryRefs['category-1'];\n      if (component) {\n        var maxMargin = component.maxMargin;\n        component.forceUpdate();\n\n        window.requestAnimationFrame(function () {\n          if (!_this3.scroll) return;\n          component.memoizeSize();\n          if (maxMargin == component.maxMargin) return;\n\n          _this3.updateCategoriesSize();\n          _this3.handleScrollPaint();\n\n          if (_this3.SEARCH_CATEGORY.emojis) {\n            component.updateDisplay('none');\n          }\n        });\n      }\n    }\n  }, {\n    key: 'handleScroll',\n    value: function handleScroll() {\n      if (!this.waitingForPaint) {\n        this.waitingForPaint = true;\n        window.requestAnimationFrame(this.handleScrollPaint);\n      }\n    }\n  }, {\n    key: 'handleScrollPaint',\n    value: function handleScrollPaint() {\n      this.waitingForPaint = false;\n\n      if (!this.scroll) {\n        return;\n      }\n\n      var activeCategory = null;\n\n      if (this.SEARCH_CATEGORY.emojis) {\n        activeCategory = this.SEARCH_CATEGORY;\n      } else {\n        var target = this.scroll,\n            scrollTop = target.scrollTop,\n            scrollingDown = scrollTop > (this.scrollTop || 0),\n            minTop = 0;\n\n        for (var i = 0, l = this.categories.length; i < l; i++) {\n          var ii = scrollingDown ? this.categories.length - 1 - i : i,\n              category = this.categories[ii],\n              component = this.categoryRefs['category-' + ii];\n\n          if (component) {\n            var active = component.handleScroll(scrollTop);\n\n            if (!minTop || component.top < minTop) {\n              if (component.top > 0) {\n                minTop = component.top;\n              }\n            }\n\n            if (active && !activeCategory) {\n              activeCategory = category;\n            }\n          }\n        }\n\n        if (scrollTop < minTop) {\n          activeCategory = this.categories.filter(function (category) {\n            return !(category.anchor === false);\n          })[0];\n        } else if (scrollTop + this.clientHeight >= this.scrollHeight) {\n          activeCategory = this.categories[this.categories.length - 1];\n        }\n      }\n\n      if (activeCategory) {\n        var anchors = this.anchors;\n        var _activeCategory = activeCategory;\n        var categoryName = _activeCategory.name;\n\n\n        if (anchors.state.selected != categoryName) {\n          anchors.setState({ selected: categoryName });\n        }\n      }\n\n      this.scrollTop = scrollTop;\n    }\n  }, {\n    key: 'handleSearch',\n    value: function handleSearch(emojis) {\n      this.SEARCH_CATEGORY.emojis = emojis;\n\n      for (var i = 0, l = this.categories.length; i < l; i++) {\n        var component = this.categoryRefs['category-' + i];\n\n        if (component && component.props.name != 'Search') {\n          var display = emojis ? 'none' : 'inherit';\n          component.updateDisplay(display);\n        }\n      }\n\n      this.forceUpdate();\n      if (this.scroll) {\n        this.scroll.scrollTop = 0;\n      }\n      this.handleScroll();\n    }\n  }, {\n    key: 'handleAnchorClick',\n    value: function handleAnchorClick(category, i) {\n      var component = this.categoryRefs['category-' + i];\n      var scroll = this.scroll;\n      var anchors = this.anchors;\n      var scrollToComponent = null;\n\n      scrollToComponent = function scrollToComponent() {\n        if (component) {\n          var top = component.top;\n\n\n          if (category.first) {\n            top = 0;\n          } else {\n            top += 1;\n          }\n\n          scroll.scrollTop = top;\n        }\n      };\n\n      if (this.SEARCH_CATEGORY.emojis) {\n        this.handleSearch(null);\n        this.search.clear();\n\n        window.requestAnimationFrame(scrollToComponent);\n      } else {\n        scrollToComponent();\n      }\n    }\n  }, {\n    key: 'handleSkinChange',\n    value: function handleSkinChange(skin) {\n      var newState = { skin: skin };\n      var onSkinChange = this.props.onSkinChange;\n\n\n      this.setState(newState);\n      store.update(newState);\n\n      onSkinChange(skin);\n    }\n  }, {\n    key: 'handleKeyDown',\n    value: function handleKeyDown(e) {\n      var handled = false;\n\n      switch (e.keyCode) {\n        case 13:\n          var emoji = void 0;\n\n          if (this.SEARCH_CATEGORY.emojis && this.SEARCH_CATEGORY.emojis.length && (emoji = getSanitizedData(this.SEARCH_CATEGORY.emojis[0], this.state.skin, this.props.set, this.props.data))) {\n            this.handleEmojiSelect(emoji);\n          }\n\n          handled = true;\n          break;\n      }\n\n      if (handled) {\n        e.preventDefault();\n      }\n    }\n  }, {\n    key: 'updateCategoriesSize',\n    value: function updateCategoriesSize() {\n      for (var i = 0, l = this.categories.length; i < l; i++) {\n        var component = this.categoryRefs['category-' + i];\n        if (component) component.memoizeSize();\n      }\n\n      if (this.scroll) {\n        var target = this.scroll;\n        this.scrollHeight = target.scrollHeight;\n        this.clientHeight = target.clientHeight;\n      }\n    }\n  }, {\n    key: 'getCategories',\n    value: function getCategories() {\n      return this.state.firstRender ? this.categories.slice(0, 3) : this.categories;\n    }\n  }, {\n    key: 'setAnchorsRef',\n    value: function setAnchorsRef(c) {\n      this.anchors = c;\n    }\n  }, {\n    key: 'setSearchRef',\n    value: function setSearchRef(c) {\n      this.search = c;\n    }\n  }, {\n    key: 'setPreviewRef',\n    value: function setPreviewRef(c) {\n      this.preview = c;\n    }\n  }, {\n    key: 'setScrollRef',\n    value: function setScrollRef(c) {\n      this.scroll = c;\n    }\n  }, {\n    key: 'setCategoryRef',\n    value: function setCategoryRef(name, c) {\n      if (!this.categoryRefs) {\n        this.categoryRefs = {};\n      }\n\n      this.categoryRefs[name] = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var _props = this.props;\n      var perLine = _props.perLine;\n      var emojiSize = _props.emojiSize;\n      var set = _props.set;\n      var sheetSize = _props.sheetSize;\n      var sheetColumns = _props.sheetColumns;\n      var sheetRows = _props.sheetRows;\n      var style = _props.style;\n      var title = _props.title;\n      var emoji = _props.emoji;\n      var color = _props.color;\n      var native = _props.native;\n      var backgroundImageFn = _props.backgroundImageFn;\n      var emojisToShowFilter = _props.emojisToShowFilter;\n      var showPreview = _props.showPreview;\n      var showSkinTones = _props.showSkinTones;\n      var emojiTooltip = _props.emojiTooltip;\n      var include = _props.include;\n      var exclude = _props.exclude;\n      var recent = _props.recent;\n      var autoFocus = _props.autoFocus;\n      var skinEmoji = _props.skinEmoji;\n      var notFound = _props.notFound;\n      var notFoundEmoji = _props.notFoundEmoji;\n      var skin = this.state.skin;\n      var width = perLine * (emojiSize + 12) + 12 + 2 + measureScrollbar();\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          style: _extends({ width: width }, style),\n          className: 'emoji-mart',\n          'aria-label': title,\n          onKeyDown: this.handleKeyDown\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-bar' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Anchors, {\n            ref: this.setAnchorsRef,\n            data: this.data,\n            i18n: this.i18n,\n            color: color,\n            categories: this.categories,\n            onAnchorClick: this.handleAnchorClick,\n            icons: this.icons\n          })\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Search, {\n          ref: this.setSearchRef,\n          onSearch: this.handleSearch,\n          data: this.data,\n          i18n: this.i18n,\n          emojisToShowFilter: emojisToShowFilter,\n          include: include,\n          exclude: exclude,\n          custom: this.CUSTOM_CATEGORY.emojis,\n          autoFocus: autoFocus\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            ref: this.setScrollRef,\n            className: 'emoji-mart-scroll',\n            onScroll: this.handleScroll\n          },\n          this.getCategories().map(function (category, i) {\n            return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Category, {\n              ref: _this4.setCategoryRef.bind(_this4, 'category-' + i),\n              key: category.name,\n              id: category.id,\n              name: category.name,\n              emojis: category.emojis,\n              perLine: perLine,\n              native: native,\n              hasStickyPosition: _this4.hasStickyPosition,\n              data: _this4.data,\n              i18n: _this4.i18n,\n              recent: category.id == _this4.RECENT_CATEGORY.id ? recent : undefined,\n              custom: category.id == _this4.RECENT_CATEGORY.id ? _this4.CUSTOM_CATEGORY.emojis : undefined,\n              emojiProps: {\n                native: native,\n                skin: skin,\n                size: emojiSize,\n                set: set,\n                sheetSize: sheetSize,\n                sheetColumns: sheetColumns,\n                sheetRows: sheetRows,\n                forceSize: native,\n                tooltip: emojiTooltip,\n                backgroundImageFn: backgroundImageFn,\n                onOver: _this4.handleEmojiOver,\n                onLeave: _this4.handleEmojiLeave,\n                onClick: _this4.handleEmojiClick\n              },\n              notFound: notFound,\n              notFoundEmoji: notFoundEmoji\n            });\n          })\n        ),\n        (showPreview || showSkinTones) && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-bar' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Preview, {\n            ref: this.setPreviewRef,\n            data: this.data,\n            title: title,\n            emoji: emoji,\n            showSkinTones: showSkinTones,\n            showPreview: showPreview,\n            emojiProps: {\n              native: native,\n              size: 38,\n              skin: skin,\n              set: set,\n              sheetSize: sheetSize,\n              sheetColumns: sheetColumns,\n              sheetRows: sheetRows,\n              backgroundImageFn: backgroundImageFn\n            },\n            skinsProps: {\n              skin: skin,\n              onChange: this.handleSkinChange,\n              skinEmoji: skinEmoji\n            },\n            i18n: this.i18n\n          })\n        )\n      );\n    }\n  }]);\n\n  return NimblePicker;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nNimblePicker.propTypes /* remove-proptypes */ = _extends({}, PickerPropTypes, {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n});\nNimblePicker.defaultProps = _extends({}, PickerDefaultProps);\n\nvar Picker = function (_React$PureComponent) {\n  inherits(Picker, _React$PureComponent);\n\n  function Picker() {\n    _classCallCheck(this, Picker);\n\n    return possibleConstructorReturn(this, (Picker.__proto__ || _Object$getPrototypeOf(Picker)).apply(this, arguments));\n  }\n\n  _createClass(Picker, [{\n    key: 'render',\n    value: function render() {\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(NimblePicker, _extends({}, this.props, this.state));\n    }\n  }]);\n\n  return Picker;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nPicker.propTypes /* remove-proptypes */ = PickerPropTypes;\nPicker.defaultProps = _extends({}, PickerDefaultProps, { data: data });\n\nvar Emoji = function Emoji(props) {\n  for (var k in Emoji.defaultProps) {\n    if (props[k] == undefined && Emoji.defaultProps[k] != undefined) {\n      props[k] = Emoji.defaultProps[k];\n    }\n  }\n\n  return NimbleEmoji(_extends({}, props));\n};\n\nEmoji.propTypes /* remove-proptypes */ = EmojiPropTypes;\nEmoji.defaultProps = _extends({}, EmojiDefaultProps, { data: data });\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nvar isObject_1 = isObject;\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\nvar _freeGlobal = freeGlobal;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = _freeGlobal || freeSelf || Function('return this')();\n\nvar _root = root;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return _root.Date.now();\n};\n\nvar now_1 = now;\n\n/** Built-in value references. */\nvar Symbol$1 = _root.Symbol;\n\nvar _Symbol = Symbol$1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$1 = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty$1.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nvar _getRawTag = getRawTag;\n\n/** Used for built-in method references. */\nvar objectProto$1 = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString$1 = objectProto$1.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString$1.call(value);\n}\n\nvar _objectToString = objectToString;\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag$1 && symToStringTag$1 in Object(value))\n    ? _getRawTag(value)\n    : _objectToString(value);\n}\n\nvar _baseGetTag = baseGetTag;\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nvar isObjectLike_1 = isObjectLike;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike_1(value) && _baseGetTag(value) == symbolTag);\n}\n\nvar isSymbol_1 = isSymbol;\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol_1(value)) {\n    return NAN;\n  }\n  if (isObject_1(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject_1(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nvar toNumber_1 = toNumber;\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber_1(wait) || 0;\n  if (isObject_1(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now_1();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now_1());\n  }\n\n  function debounced() {\n    var time = now_1(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nvar debounce_1 = debounce;\n\nvar css$1 = \".react-input-emoji--container {\\n  color: #4b4b4b;\\n  text-rendering: optimizeLegibility;\\n  background-color: #fff;\\n  border: 1px solid #fff;\\n  border-radius: 21px;\\n  margin: 5px 10px;\\n  box-sizing: border-box;\\n  flex: 1 1 auto;\\n  font-size: 15px;\\n  font-family: sans-serif;\\n  font-weight: 400;\\n  line-height: 20px;\\n  min-height: 20px;\\n  min-width: 0;\\n  outline: none;\\n  width: inherit;\\n  will-change: width;\\n  vertical-align: baseline;\\n  border: 1px solid #eaeaea;\\n  margin-right: 0;\\n}\\n\\n.react-input-emoji--wrapper {\\n  display: flex;\\n  overflow: hidden;\\n  flex: 1;\\n  position: relative;\\n  padding-right: 0;\\n  vertical-align: baseline;\\n  outline: none;\\n  margin: 0;\\n  padding: 0;\\n  border: 0;\\n}\\n\\n.react-input-emoji--input {\\n  font-weight: 400;\\n  max-height: 100px;\\n  min-height: 20px;\\n  outline: none;\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n  position: relative;\\n  white-space: pre-wrap;\\n  word-wrap: break-word;\\n  z-index: 1;\\n  width: 100%;\\n  user-select: text;\\n  padding: 9px 12px 11px;\\n  text-align: left;\\n}\\n\\n.react-input-emoji--input img {\\n  vertical-align: middle;\\n  width: 18px !important;\\n  height: 18px !important;\\n  display: inline !important;\\n  margin-left: 1px;\\n  margin-right: 1px;\\n}\\n\\n.react-input-emoji--overlay {\\n  position: fixed;\\n  width: 100%;\\n  height: 100%;\\n  top: 0;\\n  left: 0;\\n  z-index: 9;\\n}\\n\\n.react-input-emoji--placeholder {\\n  color: #a0a0a0;\\n  pointer-events: none;\\n  position: absolute;\\n  transition: opacity 0.08s linear;\\n  user-select: none;\\n  z-index: 2;\\n  left: 12px;\\n  top: 0;\\n  bottom: 0;\\n  display: flex;\\n  align-items: center;\\n  width: calc(100% - 22px);\\n}\\n\\n.react-input-emoji--button {\\n  position: relative;\\n  display: block;\\n  text-align: center;\\n  padding: 0 10px;\\n  overflow: hidden;\\n  transition: color 0.1s ease-out;\\n  margin: 0;\\n  box-shadow: none;\\n  background: none;\\n  border: none;\\n  outline: none;\\n  cursor: pointer;\\n  flex-shrink: 0;\\n  margin-bottom: 12px;\\n}\\n\\n.react-input-emoji--button svg {\\n  fill: #858585;\\n}\\n\\n.react-input-emoji--button__show svg {\\n  fill: #128b7e;\\n}\\n\\n.react-emoji {\\n  display: flex;\\n  align-items: flex-end;\\n  position: relative;\\n  width: 100%;\\n}\\n\\n.react-emoji-picker--container {\\n  position: absolute;\\n  top: 0;\\n  width: 100%;\\n}\\n\\n.react-emoji-picker--wrapper.react-emoji-picker--wrapper__show {\\n  height: 357px;\\n}\\n\\n.react-emoji-picker--wrapper {\\n  position: absolute;\\n  bottom: 0;\\n  right: 0;\\n  height: 0;\\n  width: 338px;\\n  overflow: hidden;\\n  z-index: 10;\\n}\\n\\n.react-emoji-picker {\\n  position: absolute;\\n  top: 357px;\\n  left: 0;\\n  transition: top 0.1s ease-in-out;\\n}\\n\\n.react-emoji-picker__show {\\n  top: 0;\\n}\\n\";\nstyleInject(css$1);\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar inherits$1 = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn$1 = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar slicedToArray = function () {\n  function sliceIterator(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"]) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  return function (arr, i) {\n    if (Array.isArray(arr)) {\n      return arr;\n    } else if (Symbol.iterator in Object(arr)) {\n      return sliceIterator(arr, i);\n    } else {\n      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n    }\n  };\n}();\n\nvar toConsumableArray = function (arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n    return arr2;\n  } else {\n    return Array.from(arr);\n  }\n};\n\n// vendors\n\nvar InputEmoji = function (_Component) {\n  inherits$1(InputEmoji, _Component);\n\n  function InputEmoji(props) {\n    classCallCheck(this, InputEmoji);\n\n    var _this = possibleConstructorReturn$1(this, (InputEmoji.__proto__ || Object.getPrototypeOf(InputEmoji)).call(this, props));\n\n    _this.state = {\n      html: '',\n      showPicker: false,\n      allEmojiStyle: {},\n      currentSize: null\n    };\n\n    _this.setCurrentSize = function () {\n      if (!_this.textInput.current) {\n        return;\n      }\n\n      _this.setState({\n        currentSize: {\n          width: _this.textInput.current.offsetWidth,\n          height: _this.textInput.current.offsetHeight\n        }\n      });\n    };\n\n    _this.checkAndEmitResize = function () {\n      var onResize = _this.props.onResize;\n      var currentSize = _this.state.currentSize;\n\n\n      var nextSize = {\n        width: _this.textInput.current.offsetWidth,\n        height: _this.textInput.current.offsetHeight\n      };\n\n      if (!_this.state.currentSize || currentSize.width !== nextSize.width || currentSize.height !== nextSize.height) {\n        onResize(nextSize);\n        _this.setState({ currentSize: nextSize });\n      }\n    };\n\n    _this.listenKeydown = function () {\n      var _this$props = _this.props,\n          cleanOnEnter = _this$props.cleanOnEnter,\n          onChange = _this$props.onChange,\n          onEnter = _this$props.onEnter;\n\n\n      if (cleanOnEnter) {\n        _this.textInput.current.addEventListener('keydown', function (event) {\n          if (event.keyCode === 13) {\n            event.preventDefault();\n            return false;\n          }\n        });\n        _this.textInput.current.addEventListener('keyup', function (event) {\n          if (event.keyCode === 13) {\n            var cleanedText = _this.replaceAllTextEmojiToString();\n            if (typeof onEnter === 'function') {\n              onEnter(cleanedText);\n            }\n\n            if (typeof onChange === 'function') {\n              onChange(cleanedText);\n            }\n\n            _this.updateHTML('');\n          }\n        });\n      }\n    };\n\n    _this.setValue = function (value) {\n      _this.updateHTML(value);\n      _this.textInput.current.blur();\n    };\n\n    _this.updateHTML = function () {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.value;\n\n      _this.setState({ html: value });\n      _this.textInput.current.innerHTML = _this.replaceAllTextEmojis(value || '');\n    };\n\n    _this.emitOnChange = function () {\n      _this.props.onChange(_this.replaceAllTextEmojiToString());\n    };\n\n    _this.getAllEmojiStyle = function () {\n      var allEmojiButton = document.querySelectorAll('.emoji-mart-category-list > li > button');\n\n      var allEmojiStyle = {};\n\n      allEmojiButton.forEach(function (emojiButton) {\n        var label = emojiButton.getAttribute('aria-label');\n\n        var _label$split = label.split(','),\n            _label$split2 = slicedToArray(_label$split, 1),\n            emoji = _label$split2[0];\n\n        var emojiSpanEl = emojiButton.querySelector('span');\n\n        var style = _this.replaceAll(emojiSpanEl.style.cssText, '\"', \"'\");\n\n        allEmojiStyle[emoji] = style;\n      });\n\n      _this.setState({ allEmojiStyle: allEmojiStyle });\n    };\n\n    _this.toggleShowPicker = function () {\n      _this.setState({ showPicker: !_this.state.showPicker });\n    };\n\n    _this.emitChange = function () {\n      var _this$props2 = _this.props,\n          onChange = _this$props2.onChange,\n          onResize = _this$props2.onResize,\n          maxLength = _this$props2.maxLength;\n\n\n      if (typeof maxLength !== 'undefined' && Number.isInteger(maxLength)) {\n        var totalCharacters = [].concat(toConsumableArray(_this.replaceAllTextEmojiToString())).length;\n\n        if (totalCharacters > maxLength) {\n          _this.textInput.current.innerHTML = '';\n          _this.pasteHtmlAtCaret(_this.state.html);\n          return;\n        }\n      }\n\n      var html = _this.textInput.current.innerHTML;\n\n      _this.setState({ html: html });\n\n      if (typeof onChange === 'function') {\n        _this.onChangeDebounced(html);\n      }\n\n      if (typeof onResize === 'function') {\n        _this.checkAndEmitResize();\n      }\n    };\n\n    _this.replaceAllTextEmojiToString = function () {\n      if (!_this.textInput.current) {\n        return '';\n      }\n\n      var container = document.createElement('div');\n      container.innerHTML = _this.textInput.current.innerHTML;\n\n      var images = container.querySelectorAll('img');\n\n      images.forEach(function (image) {\n        image.outerHTML = image.dataset.emoji;\n      });\n\n      var text = container.innerText;\n\n      // remove all ↵ for safari\n      text = text.replace(/\\n/ig, '');\n\n      return text;\n    };\n\n    _this.pasteHtmlAtCaret = function (html) {\n      var sel = void 0,\n          range = void 0;\n      if (window.getSelection) {\n        // IE9 and non-IE\n        sel = window.getSelection();\n        if (sel.getRangeAt && sel.rangeCount) {\n          range = sel.getRangeAt(0);\n          range.deleteContents();\n\n          // Range.createContextualFragment() would be useful here but is\n          // non-standard and not supported in all browsers (IE9, for one)\n          var el = document.createElement('div');\n          el.innerHTML = html;\n          var frag = document.createDocumentFragment();var node;var lastNode;\n          while (node = el.firstChild) {\n            lastNode = frag.appendChild(node);\n          }\n          range.insertNode(frag);\n\n          // Preserve the selection\n          if (lastNode) {\n            range = range.cloneRange();\n            range.setStartAfter(lastNode);\n            range.collapse(true);\n            sel.removeAllRanges();\n            sel.addRange(range);\n          }\n        }\n      } else if (document.selection && document.selection.type !== 'Control') {\n        // IE < 9\n        document.selection.createRange().pasteHTML(html);\n      }\n    };\n\n    _this.replaceAll = function (str, find, replace) {\n      return str.replace(new RegExp(find, 'g'), replace);\n    };\n\n    _this.getImage = function (emoji) {\n      var shortNames = '' + emoji.short_names;\n\n      shortNames = _this.replaceAll(shortNames, ',', ', ');\n\n      var emojiSpanEl = document.querySelector('[aria-label=\"' + emoji.native + ', ' + shortNames + '\"] > span');\n\n      if (!emojiSpanEl) return '';\n\n      var style = _this.replaceAll(emojiSpanEl.style.cssText, '\"', \"'\");\n\n      return '<img style=\"' + style + '\" data-emoji=\"' + emoji.native + '\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif\" />';\n    };\n\n    _this.replaceAllTextEmojis = function (text) {\n      var allEmojis = _this.getAllEmojisFromText(text);\n\n      if (allEmojis) {\n        allEmojis = [].concat(toConsumableArray(new Set(allEmojis))); // remove duplicates\n        var allEmojiStyle = _this.state.allEmojiStyle;\n\n        allEmojis.forEach(function (emoji) {\n          var style = allEmojiStyle[emoji];\n\n          if (!style) return;\n\n          text = _this.replaceAll(text, emoji, '<img style=\"' + style + '\" data-emoji=\"' + emoji + '\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif\" />');\n        });\n      }\n\n      return text;\n    };\n\n    _this.handleSelectEmoji = function (emoji) {\n      var keepOpenend = _this.props.keepOpenend;\n\n\n      _this.textInput.current.focus();\n\n      _this.pasteHtmlAtCaret(_this.getImage(emoji));\n\n      _this.textInput.current.focus();\n\n      _this.emitChange();\n\n      if (!keepOpenend) {\n        _this.toggleShowPicker();\n      }\n    };\n\n    _this.getAllEmojisFromText = function (text) {\n      return text.match(/(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*/g);\n    };\n\n    _this.handleContentEditableInputCopyAndPaste = function () {\n      var self = _this;\n      _this.textInput.current.addEventListener('copy', function (e) {\n        var selectedText = window.getSelection();\n\n        var container = document.createElement('div');\n\n        for (var i = 0, len = selectedText.rangeCount; i < len; ++i) {\n          container.appendChild(selectedText.getRangeAt(i).cloneContents());\n        }\n\n        container = replaceEmojiToString(container);\n\n        e.clipboardData.setData('text', container.innerText);\n        e.preventDefault();\n\n        function replaceEmojiToString(container) {\n          var images = container.querySelectorAll('img');\n\n          images.forEach(function (image) {\n            image.outerHTML = image.dataset.emoji;\n          });\n\n          return container;\n        }\n      });\n\n      // Paste fix for contenteditable\n      _this.textInput.current.addEventListener('paste', function (e) {\n        e.preventDefault();\n        var content = void 0;\n        if (window.clipboardData) {\n          content = window.clipboardData.getData('Text');\n          content = self.replaceAllTextEmojis(content);\n          if (window.getSelection) {\n            var selObj = window.getSelection();\n            var selRange = selObj.getRangeAt(0);\n            selRange.deleteContents();\n            selRange.insertNode(document.createTextNode(content));\n          }\n        } else if (e.clipboardData) {\n          content = e.clipboardData.getData('text/plain');\n          content = self.replaceAllTextEmojis(content);\n          document.execCommand('insertHTML', false, content);\n        }\n      });\n    };\n\n    _this.checkIsEmpty = function () {\n      var text = _this.replaceAllTextEmojiToString();\n\n      return text === '';\n    };\n\n    _this.handleClick = function () {\n      var onClick = _this.props.onClick;\n\n\n      if (typeof onClick === 'function') {\n        onClick();\n      }\n    };\n\n    _this.listenFocus = function () {\n      _this.textInput.current.addEventListener('focus', function () {\n        var onFocus = _this.props.onFocus;\n\n\n        if (typeof onFocus === 'function') {\n          onFocus();\n        }\n      });\n    };\n\n    _this.handleKeyDown = function (event) {\n      var onKeyDown = _this.props.onKeyDown;\n\n\n      if (typeof onKeyDown === 'function') {\n        onKeyDown(event);\n      }\n    };\n\n    _this.getExcludePicker = function () {\n      var disableRecent = _this.props.disableRecent;\n\n\n      var exclude = [];\n\n      if (disableRecent) {\n        exclude.push('recent');\n      }\n\n      return exclude;\n    };\n\n    _this.textInput = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef();\n\n    if (typeof props.onChange === 'function') {\n      _this.onChangeDebounced = debounce_1(_this.emitOnChange, 100);\n    }\n    return _this;\n  }\n\n  createClass(InputEmoji, [{\n    key: 'focus',\n    value: function focus() {\n      this.textInput.current.focus();\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.handleContentEditableInputCopyAndPaste();\n\n      this.getAllEmojiStyle();\n\n      this.updateHTML();\n\n      this.listenKeydown();\n\n      this.listenFocus();\n\n      this.setCurrentSize();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          _props$height = _props.height,\n          height = _props$height === undefined ? 40 : _props$height,\n          _props$placeholder = _props.placeholder,\n          placeholder = _props$placeholder === undefined ? 'Type a message' : _props$placeholder,\n          _props$borderRadius = _props.borderRadius,\n          borderRadius = _props$borderRadius === undefined ? 21 : _props$borderRadius,\n          _props$borderColor = _props.borderColor,\n          borderColor = _props$borderColor === undefined ? '#EAEAEA' : _props$borderColor,\n          _props$fontSize = _props.fontSize,\n          fontSize = _props$fontSize === undefined ? 15 : _props$fontSize,\n          _props$fontFamily = _props.fontFamily,\n          fontFamily = _props$fontFamily === undefined ? 'sans-serif' : _props$fontFamily,\n          inputClass = _props.inputClass,\n          _props$tabIndex = _props.tabIndex,\n          tabIndex = _props$tabIndex === undefined ? 0 : _props$tabIndex;\n      var showPicker = this.state.showPicker;\n\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        { className: 'react-emoji' },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            className: 'react-emoji-picker--container',\n            onClick: this.handleContainerClick\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'react-emoji-picker--wrapper' + (showPicker ? ' react-emoji-picker--wrapper__show' : '') },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              {\n                className: 'react-emoji-picker' + (showPicker ? ' react-emoji-picker__show' : '')\n              },\n              react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Picker, {\n                showPreview: false,\n                showSkinTones: false,\n                set: 'apple',\n                onSelect: this.handleSelectEmoji,\n                exclude: this.getExcludePicker()\n              })\n            )\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            className: 'react-input-emoji--container',\n            style: {\n              borderRadius: borderRadius,\n              borderColor: borderColor,\n              fontSize: fontSize,\n              fontFamily: fontFamily\n            }\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'react-input-emoji--wrapper', onClick: this.handleClick },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              {\n                className: 'react-input-emoji--placeholder',\n                style: {\n                  visibility: !this.checkIsEmpty() ? 'hidden' : 'visible'\n                }\n              },\n              placeholder\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('div', {\n              ref: this.textInput,\n              tabIndex: tabIndex,\n              contentEditable: true,\n              className: 'react-input-emoji--input' + (inputClass ? ' ' + inputClass : ''),\n              onInput: this.emitChange,\n              onBlur: this.emitChange,\n              onKeyDown: this.handleKeyDown,\n              style: {\n                paddingTop: (height - 20) / 2 + 'px',\n                paddingBottom: (height - 20) / 2 + 'px',\n                minHeight: height + 'px'\n              }\n            })\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'button',\n          {\n            className: 'react-input-emoji--button' + (showPicker ? ' react-input-emoji--button__show' : ''),\n            onClick: this.toggleShowPicker },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'svg',\n            { xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24', width: '24', height: '24' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('path', { d: 'M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10' }),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('path', { d: 'M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0' })\n          )\n        ),\n        showPicker && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('div', {\n          className: 'react-input-emoji--overlay',\n          onClick: this.toggleShowPicker\n        })\n      );\n    }\n  }, {\n    key: 'value',\n    get: function get() {\n      return this.replaceAllTextEmojiToString();\n    },\n    set: function set(value) {\n      this.setValue(value);\n    }\n  }]);\n  return InputEmoji;\n}(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n\nInputEmoji.propTypes = {\n  value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  cleanOnEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  onResize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  maxLength: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  keepOpenend: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  inputClass: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  disableRecent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  // style\n  height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  borderRadius: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  borderColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  fontSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  fontFamily: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (InputEmoji);\n//# sourceMappingURL=index.es.js.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-input-emoji/dist/index.es.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-is/cjs/react-is.development.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-is/cjs/react-is.development.js ***!
-  \***********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n  if (typeof object === 'object' && object !== null) {\n    var $$typeof = object.$$typeof;\n\n    switch ($$typeof) {\n      case REACT_ELEMENT_TYPE:\n        var type = object.type;\n\n        switch (type) {\n          case REACT_ASYNC_MODE_TYPE:\n          case REACT_CONCURRENT_MODE_TYPE:\n          case REACT_FRAGMENT_TYPE:\n          case REACT_PROFILER_TYPE:\n          case REACT_STRICT_MODE_TYPE:\n          case REACT_SUSPENSE_TYPE:\n            return type;\n\n          default:\n            var $$typeofType = type && type.$$typeof;\n\n            switch ($$typeofType) {\n              case REACT_CONTEXT_TYPE:\n              case REACT_FORWARD_REF_TYPE:\n              case REACT_LAZY_TYPE:\n              case REACT_MEMO_TYPE:\n              case REACT_PROVIDER_TYPE:\n                return $$typeofType;\n\n              default:\n                return $$typeof;\n            }\n\n        }\n\n      case REACT_PORTAL_TYPE:\n        return $$typeof;\n    }\n  }\n\n  return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n  {\n    if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n      hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n      console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n    }\n  }\n\n  return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n  return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n  return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n  return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n  return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n  return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n  return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n  return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n  return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n  return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n  return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n  return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-is/cjs/react-is.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-is/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/react-is/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ \"./jaas-client/node_modules/react-is/cjs/react-is.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-is/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js ***!
-  \***************************************************************************/
-/*! exports provided: MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter, BrowserRouter, HashRouter, Link, NavLink */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BrowserRouter\", function() { return BrowserRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"HashRouter\", function() { return HashRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Link\", function() { return Link; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NavLink\", function() { return NavLink; });\n/* harmony import */ var react_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-router */ \"./jaas-client/node_modules/react-router/esm/react-router.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MemoryRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"MemoryRouter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Prompt\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Prompt\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Redirect\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Redirect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Route\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Route\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StaticRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"StaticRouter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Switch\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Switch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"generatePath\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"generatePath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matchPath\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"matchPath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useHistory\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useHistory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useLocation\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useLocation\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useParams\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useParams\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useRouteMatch\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useRouteMatch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"withRouter\"]; });\n\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! history */ \"./jaas-client/node_modules/history/esm/history.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The public API for a <Router> that uses HTML5 history.\n */\n\nvar BrowserRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(BrowserRouter, _React$Component);\n\n  function BrowserRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createBrowserHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = BrowserRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"], {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return BrowserRouter;\n}(react__WEBPACK_IMPORTED_MODULE_2___default.a.Component);\n\nif (true) {\n  BrowserRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n    forceRefresh: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    keyLength: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  };\n\n  BrowserRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(!this.props.history, \"<BrowserRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { BrowserRouter as Router }`.\") : undefined;\n  };\n}\n\n/**\n * The public API for a <Router> that uses window.location.hash.\n */\n\nvar HashRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(HashRouter, _React$Component);\n\n  function HashRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createHashHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = HashRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"], {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return HashRouter;\n}(react__WEBPACK_IMPORTED_MODULE_2___default.a.Component);\n\nif (true) {\n  HashRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    hashType: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf([\"hashbang\", \"noslash\", \"slash\"])\n  };\n\n  HashRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(!this.props.history, \"<HashRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { HashRouter as Router }`.\") : undefined;\n  };\n}\n\nvar resolveToLocation = function resolveToLocation(to, currentLocation) {\n  return typeof to === \"function\" ? to(currentLocation) : to;\n};\nvar normalizeToLocation = function normalizeToLocation(to, currentLocation) {\n  return typeof to === \"string\" ? Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(to, null, null, currentLocation) : to;\n};\n\nvar forwardRefShim = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = forwardRefShim;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nvar LinkAnchor = forwardRef(function (_ref, forwardedRef) {\n  var innerRef = _ref.innerRef,\n      navigate = _ref.navigate,\n      _onClick = _ref.onClick,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref, [\"innerRef\", \"navigate\", \"onClick\"]);\n\n  var target = rest.target;\n\n  var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, rest, {\n    onClick: function onClick(event) {\n      try {\n        if (_onClick) _onClick(event);\n      } catch (ex) {\n        event.preventDefault();\n        throw ex;\n      }\n\n      if (!event.defaultPrevented && // onClick prevented default\n      event.button === 0 && ( // ignore everything but left clicks\n      !target || target === \"_self\") && // let browser handle \"target=_blank\" etc.\n      !isModifiedEvent(event) // ignore clicks with modifier keys\n      ) {\n          event.preventDefault();\n          navigate();\n        }\n    }\n  }); // React 15 compat\n\n\n  if (forwardRefShim !== forwardRef) {\n    props.ref = forwardedRef || innerRef;\n  } else {\n    props.ref = innerRef;\n  }\n  /* eslint-disable-next-line jsx-a11y/anchor-has-content */\n\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"a\", props);\n});\n\nif (true) {\n  LinkAnchor.displayName = \"LinkAnchor\";\n}\n/**\n * The public API for rendering a history-aware <a>.\n */\n\n\nvar Link = forwardRef(function (_ref2, forwardedRef) {\n  var _ref2$component = _ref2.component,\n      component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,\n      replace = _ref2.replace,\n      to = _ref2.to,\n      innerRef = _ref2.innerRef,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref2, [\"component\", \"replace\", \"to\", \"innerRef\"]);\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"__RouterContext\"].Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(false, \"You should not use <Link> outside a <Router>\") : undefined : void 0;\n    var history = context.history;\n    var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);\n    var href = location ? history.createHref(location) : \"\";\n\n    var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, rest, {\n      href: href,\n      navigate: function navigate() {\n        var location = resolveToLocation(to, context.location);\n        var method = replace ? history.replace : history.push;\n        method(location);\n      }\n    }); // React 15 compat\n\n\n    if (forwardRefShim !== forwardRef) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(component, props);\n  });\n});\n\nif (true) {\n  var toType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]);\n  var refType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    current: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n  })]);\n  Link.displayName = \"Link\";\n  Link.propTypes = {\n    innerRef: refType,\n    onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    replace: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    target: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    to: toType.isRequired\n  };\n}\n\nvar forwardRefShim$1 = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef$1 = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef;\n\nif (typeof forwardRef$1 === \"undefined\") {\n  forwardRef$1 = forwardRefShim$1;\n}\n\nfunction joinClassnames() {\n  for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {\n    classnames[_key] = arguments[_key];\n  }\n\n  return classnames.filter(function (i) {\n    return i;\n  }).join(\" \");\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\n\nvar NavLink = forwardRef$1(function (_ref, forwardedRef) {\n  var _ref$ariaCurrent = _ref[\"aria-current\"],\n      ariaCurrent = _ref$ariaCurrent === void 0 ? \"page\" : _ref$ariaCurrent,\n      _ref$activeClassName = _ref.activeClassName,\n      activeClassName = _ref$activeClassName === void 0 ? \"active\" : _ref$activeClassName,\n      activeStyle = _ref.activeStyle,\n      classNameProp = _ref.className,\n      exact = _ref.exact,\n      isActiveProp = _ref.isActive,\n      locationProp = _ref.location,\n      sensitive = _ref.sensitive,\n      strict = _ref.strict,\n      styleProp = _ref.style,\n      to = _ref.to,\n      innerRef = _ref.innerRef,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref, [\"aria-current\", \"activeClassName\", \"activeStyle\", \"className\", \"exact\", \"isActive\", \"location\", \"sensitive\", \"strict\", \"style\", \"to\", \"innerRef\"]);\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"__RouterContext\"].Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(false, \"You should not use <NavLink> outside a <Router>\") : undefined : void 0;\n    var currentLocation = locationProp || context.location;\n    var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);\n    var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n\n    var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n    var match = escapedPath ? Object(react_router__WEBPACK_IMPORTED_MODULE_0__[\"matchPath\"])(currentLocation.pathname, {\n      path: escapedPath,\n      exact: exact,\n      sensitive: sensitive,\n      strict: strict\n    }) : null;\n    var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);\n    var className = isActive ? joinClassnames(classNameProp, activeClassName) : classNameProp;\n    var style = isActive ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, styleProp, {}, activeStyle) : styleProp;\n\n    var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n      \"aria-current\": isActive && ariaCurrent || null,\n      className: className,\n      style: style,\n      to: toLocation\n    }, rest); // React 15 compat\n\n\n    if (forwardRefShim$1 !== forwardRef$1) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Link, props);\n  });\n});\n\nif (true) {\n  NavLink.displayName = \"NavLink\";\n  var ariaCurrentType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\"]);\n  NavLink.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, Link.propTypes, {\n    \"aria-current\": ariaCurrentType,\n    activeClassName: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    activeStyle: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n    className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    exact: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    isActive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n    sensitive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    strict: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n  });\n}\n\n\n//# sourceMappingURL=react-router-dom.js.map\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-router/esm/react-router.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/react-router/esm/react-router.js ***!
-  \*******************************************************************/
-/*! exports provided: MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, __HistoryContext, __RouterContext, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MemoryRouter\", function() { return MemoryRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Prompt\", function() { return Prompt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Redirect\", function() { return Redirect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Route\", function() { return Route; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return Router; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StaticRouter\", function() { return StaticRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Switch\", function() { return Switch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__HistoryContext\", function() { return historyContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__RouterContext\", function() { return context; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"generatePath\", function() { return generatePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"matchPath\", function() { return matchPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useHistory\", function() { return useHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useLocation\", function() { return useLocation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useParams\", function() { return useParams; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useRouteMatch\", function() { return useRouteMatch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"withRouter\", function() { return withRouter; });\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! history */ \"./jaas-client/node_modules/history/esm/history.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! mini-create-react-context */ \"./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var path_to_regexp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! path-to-regexp */ \"./jaas-client/node_modules/path-to-regexp/index.js\");\n/* harmony import */ var path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(path_to_regexp__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext = function createNamedContext(name) {\n  var context = Object(mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n  context.displayName = name;\n  return context;\n};\n\nvar historyContext =\n/*#__PURE__*/\ncreateNamedContext(\"Router-History\");\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext$1 = function createNamedContext(name) {\n  var context = Object(mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n  context.displayName = name;\n  return context;\n};\n\nvar context =\n/*#__PURE__*/\ncreateNamedContext$1(\"Router\");\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Router, _React$Component);\n\n  Router.computeRootMatch = function computeRootMatch(pathname) {\n    return {\n      path: \"/\",\n      url: \"/\",\n      params: {},\n      isExact: pathname === \"/\"\n    };\n  };\n\n  function Router(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n    _this.state = {\n      location: props.history.location\n    }; // This is a bit of a hack. We have to start listening for location\n    // changes here in the constructor in case there are any <Redirect>s\n    // on the initial render. If there are, they will replace/push when\n    // they mount and since cDM fires in children before parents, we may\n    // get a new location before the <Router> is mounted.\n\n    _this._isMounted = false;\n    _this._pendingLocation = null;\n\n    if (!props.staticContext) {\n      _this.unlisten = props.history.listen(function (location) {\n        if (_this._isMounted) {\n          _this.setState({\n            location: location\n          });\n        } else {\n          _this._pendingLocation = location;\n        }\n      });\n    }\n\n    return _this;\n  }\n\n  var _proto = Router.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this._isMounted = true;\n\n    if (this._pendingLocation) {\n      this.setState({\n        location: this._pendingLocation\n      });\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.unlisten) this.unlisten();\n  };\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Provider, {\n      value: {\n        history: this.props.history,\n        location: this.state.location,\n        match: Router.computeRootMatch(this.state.location.pathname),\n        staticContext: this.props.staticContext\n      }\n    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(historyContext.Provider, {\n      children: this.props.children || null,\n      value: this.props.history\n    }));\n  };\n\n  return Router;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Router.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n    history: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object.isRequired,\n    staticContext: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  };\n\n  Router.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(prevProps.history === this.props.history, \"You cannot change <Router history>\") : undefined;\n  };\n}\n\n/**\n * The public API for a <Router> that stores location in memory.\n */\n\nvar MemoryRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(MemoryRouter, _React$Component);\n\n  function MemoryRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createMemoryHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = MemoryRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return MemoryRouter;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  MemoryRouter.propTypes = {\n    initialEntries: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.array,\n    initialIndex: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n    keyLength: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node\n  };\n\n  MemoryRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!this.props.history, \"<MemoryRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { MemoryRouter as Router }`.\") : undefined;\n  };\n}\n\nvar Lifecycle =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Lifecycle, _React$Component);\n\n  function Lifecycle() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Lifecycle.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    if (this.props.onMount) this.props.onMount.call(this, this);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.props.onUnmount) this.props.onUnmount.call(this, this);\n  };\n\n  _proto.render = function render() {\n    return null;\n  };\n\n  return Lifecycle;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\n/**\n * The public API for prompting the user before navigating away from a screen.\n */\n\nfunction Prompt(_ref) {\n  var message = _ref.message,\n      _ref$when = _ref.when,\n      when = _ref$when === void 0 ? true : _ref$when;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Prompt> outside a <Router>\") : undefined : void 0;\n    if (!when || context.staticContext) return null;\n    var method = context.history.block;\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Lifecycle, {\n      onMount: function onMount(self) {\n        self.release = method(message);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        if (prevProps.message !== message) {\n          self.release();\n          self.release = method(message);\n        }\n      },\n      onUnmount: function onUnmount(self) {\n        self.release();\n      },\n      message: message\n    });\n  });\n}\n\nif (true) {\n  var messageType = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string]);\n  Prompt.propTypes = {\n    when: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    message: messageType.isRequired\n  };\n}\n\nvar cache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nfunction compilePath(path) {\n  if (cache[path]) return cache[path];\n  var generator = path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default.a.compile(path);\n\n  if (cacheCount < cacheLimit) {\n    cache[path] = generator;\n    cacheCount++;\n  }\n\n  return generator;\n}\n/**\n * Public API for generating a URL pathname from a path and parameters.\n */\n\n\nfunction generatePath(path, params) {\n  if (path === void 0) {\n    path = \"/\";\n  }\n\n  if (params === void 0) {\n    params = {};\n  }\n\n  return path === \"/\" ? path : compilePath(path)(params, {\n    pretty: true\n  });\n}\n\n/**\n * The public API for navigating programmatically with a component.\n */\n\nfunction Redirect(_ref) {\n  var computedMatch = _ref.computedMatch,\n      to = _ref.to,\n      _ref$push = _ref.push,\n      push = _ref$push === void 0 ? false : _ref$push;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Redirect> outside a <Router>\") : undefined : void 0;\n    var history = context.history,\n        staticContext = context.staticContext;\n    var method = push ? history.push : history.replace;\n    var location = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(computedMatch ? typeof to === \"string\" ? generatePath(to, computedMatch.params) : Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, to, {\n      pathname: generatePath(to.pathname, computedMatch.params)\n    }) : to); // When rendering in a static context,\n    // set the new location immediately.\n\n    if (staticContext) {\n      method(location);\n      return null;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Lifecycle, {\n      onMount: function onMount() {\n        method(location);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        var prevLocation = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(prevProps.to);\n\n        if (!Object(history__WEBPACK_IMPORTED_MODULE_3__[\"locationsAreEqual\"])(prevLocation, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n          key: prevLocation.key\n        }))) {\n          method(location);\n        }\n      },\n      to: to\n    });\n  });\n}\n\nif (true) {\n  Redirect.propTypes = {\n    push: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    from: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,\n    to: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object]).isRequired\n  };\n}\n\nvar cache$1 = {};\nvar cacheLimit$1 = 10000;\nvar cacheCount$1 = 0;\n\nfunction compilePath$1(path, options) {\n  var cacheKey = \"\" + options.end + options.strict + options.sensitive;\n  var pathCache = cache$1[cacheKey] || (cache$1[cacheKey] = {});\n  if (pathCache[path]) return pathCache[path];\n  var keys = [];\n  var regexp = path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default()(path, keys, options);\n  var result = {\n    regexp: regexp,\n    keys: keys\n  };\n\n  if (cacheCount$1 < cacheLimit$1) {\n    pathCache[path] = result;\n    cacheCount$1++;\n  }\n\n  return result;\n}\n/**\n * Public API for matching a URL pathname to a path.\n */\n\n\nfunction matchPath(pathname, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  if (typeof options === \"string\" || Array.isArray(options)) {\n    options = {\n      path: options\n    };\n  }\n\n  var _options = options,\n      path = _options.path,\n      _options$exact = _options.exact,\n      exact = _options$exact === void 0 ? false : _options$exact,\n      _options$strict = _options.strict,\n      strict = _options$strict === void 0 ? false : _options$strict,\n      _options$sensitive = _options.sensitive,\n      sensitive = _options$sensitive === void 0 ? false : _options$sensitive;\n  var paths = [].concat(path);\n  return paths.reduce(function (matched, path) {\n    if (!path && path !== \"\") return null;\n    if (matched) return matched;\n\n    var _compilePath = compilePath$1(path, {\n      end: exact,\n      strict: strict,\n      sensitive: sensitive\n    }),\n        regexp = _compilePath.regexp,\n        keys = _compilePath.keys;\n\n    var match = regexp.exec(pathname);\n    if (!match) return null;\n    var url = match[0],\n        values = match.slice(1);\n    var isExact = pathname === url;\n    if (exact && !isExact) return null;\n    return {\n      path: path,\n      // the path used to match\n      url: path === \"/\" && url === \"\" ? \"/\" : url,\n      // the matched portion of the URL\n      isExact: isExact,\n      // whether or not we matched exactly\n      params: keys.reduce(function (memo, key, index) {\n        memo[key.name] = values[index];\n        return memo;\n      }, {})\n    };\n  }, null);\n}\n\nfunction isEmptyChildren(children) {\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.Children.count(children) === 0;\n}\n\nfunction evalChildrenDev(children, props, path) {\n  var value = children(props);\n   true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(value !== undefined, \"You returned `undefined` from the `children` function of \" + (\"<Route\" + (path ? \" path=\\\"\" + path + \"\\\"\" : \"\") + \">, but you \") + \"should have returned a React element or `null`\") : undefined;\n  return value || null;\n}\n/**\n * The public API for matching a single path and rendering.\n */\n\n\nvar Route =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Route, _React$Component);\n\n  function Route() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Route.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context$1) {\n      !context$1 ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Route> outside a <Router>\") : undefined : void 0;\n      var location = _this.props.location || context$1.location;\n      var match = _this.props.computedMatch ? _this.props.computedMatch // <Switch> already computed the match for us\n      : _this.props.path ? matchPath(location.pathname, _this.props) : context$1.match;\n\n      var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, context$1, {\n        location: location,\n        match: match\n      });\n\n      var _this$props = _this.props,\n          children = _this$props.children,\n          component = _this$props.component,\n          render = _this$props.render; // Preact uses an empty array as children by\n      // default, so use null if that's the case.\n\n      if (Array.isArray(children) && children.length === 0) {\n        children = null;\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Provider, {\n        value: props\n      }, props.match ? children ? typeof children === \"function\" ?  true ? evalChildrenDev(children, props, _this.props.path) : undefined : children : component ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(component, props) : render ? render(props) : null : typeof children === \"function\" ?  true ? evalChildrenDev(children, props, _this.props.path) : undefined : null);\n    });\n  };\n\n  return Route;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Route.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node]),\n    component: function component(props, propName) {\n      if (props[propName] && !Object(react_is__WEBPACK_IMPORTED_MODULE_9__[\"isValidElementType\"])(props[propName])) {\n        return new Error(\"Invalid prop 'component' supplied to 'Route': the prop is not a valid React component\");\n      }\n    },\n    exact: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,\n    path: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string)]),\n    render: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n    sensitive: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    strict: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool\n  };\n\n  Route.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.component), \"You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored\") : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.render), \"You should not use <Route render> and <Route children> in the same route; <Route render> will be ignored\") : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.component && this.props.render), \"You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored\") : undefined;\n  };\n\n  Route.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.location && !prevProps.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(!this.props.location && prevProps.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : undefined;\n  };\n}\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === \"/\" ? path : \"/\" + path;\n}\n\nfunction addBasename(basename, location) {\n  if (!basename) return location;\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n    pathname: addLeadingSlash(basename) + location.pathname\n  });\n}\n\nfunction stripBasename(basename, location) {\n  if (!basename) return location;\n  var base = addLeadingSlash(basename);\n  if (location.pathname.indexOf(base) !== 0) return location;\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n    pathname: location.pathname.substr(base.length)\n  });\n}\n\nfunction createURL(location) {\n  return typeof location === \"string\" ? location : Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createPath\"])(location);\n}\n\nfunction staticHandler(methodName) {\n  return function () {\n      true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You cannot %s with <StaticRouter>\", methodName) : undefined ;\n  };\n}\n\nfunction noop() {}\n/**\n * The public top-level API for a \"static\" <Router>, so-called because it\n * can't actually change the current location. Instead, it just records\n * location changes in a context object. Useful mainly in testing and\n * server-rendering scenarios.\n */\n\n\nvar StaticRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(StaticRouter, _React$Component);\n\n  function StaticRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n    _this.handlePush = function (location) {\n      return _this.navigateTo(location, \"PUSH\");\n    };\n\n    _this.handleReplace = function (location) {\n      return _this.navigateTo(location, \"REPLACE\");\n    };\n\n    _this.handleListen = function () {\n      return noop;\n    };\n\n    _this.handleBlock = function () {\n      return noop;\n    };\n\n    return _this;\n  }\n\n  var _proto = StaticRouter.prototype;\n\n  _proto.navigateTo = function navigateTo(location, action) {\n    var _this$props = this.props,\n        _this$props$basename = _this$props.basename,\n        basename = _this$props$basename === void 0 ? \"\" : _this$props$basename,\n        _this$props$context = _this$props.context,\n        context = _this$props$context === void 0 ? {} : _this$props$context;\n    context.action = action;\n    context.location = addBasename(basename, Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(location));\n    context.url = createURL(context.location);\n  };\n\n  _proto.render = function render() {\n    var _this$props2 = this.props,\n        _this$props2$basename = _this$props2.basename,\n        basename = _this$props2$basename === void 0 ? \"\" : _this$props2$basename,\n        _this$props2$context = _this$props2.context,\n        context = _this$props2$context === void 0 ? {} : _this$props2$context,\n        _this$props2$location = _this$props2.location,\n        location = _this$props2$location === void 0 ? \"/\" : _this$props2$location,\n        rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(_this$props2, [\"basename\", \"context\", \"location\"]);\n\n    var history = {\n      createHref: function createHref(path) {\n        return addLeadingSlash(basename + createURL(path));\n      },\n      action: \"POP\",\n      location: stripBasename(basename, Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(location)),\n      push: this.handlePush,\n      replace: this.handleReplace,\n      go: staticHandler(\"go\"),\n      goBack: staticHandler(\"goBack\"),\n      goForward: staticHandler(\"goForward\"),\n      listen: this.handleListen,\n      block: this.handleBlock\n    };\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Router, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, rest, {\n      history: history,\n      staticContext: context\n    }));\n  };\n\n  return StaticRouter;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  StaticRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,\n    context: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object])\n  };\n\n  StaticRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!this.props.history, \"<StaticRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { StaticRouter as Router }`.\") : undefined;\n  };\n}\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\n\nvar Switch =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Switch, _React$Component);\n\n  function Switch() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Switch.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n      !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Switch> outside a <Router>\") : undefined : void 0;\n      var location = _this.props.location || context.location;\n      var element, match; // We use React.Children.forEach instead of React.Children.toArray().find()\n      // here because toArray adds keys to all child elements and we do not want\n      // to trigger an unmount/remount for two <Route>s that render the same\n      // component at different URLs.\n\n      react__WEBPACK_IMPORTED_MODULE_1___default.a.Children.forEach(_this.props.children, function (child) {\n        if (match == null && react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(child)) {\n          element = child;\n          var path = child.props.path || child.props.from;\n          match = path ? matchPath(location.pathname, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, child.props, {\n            path: path\n          })) : context.match;\n        }\n      });\n      return match ? react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(element, {\n        location: location,\n        computedMatch: match\n      }) : null;\n    });\n  };\n\n  return Switch;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Switch.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  };\n\n  Switch.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.location && !prevProps.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(!this.props.location && prevProps.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : undefined;\n  };\n}\n\n/**\n * A public higher-order component to access the imperative API\n */\n\nfunction withRouter(Component) {\n  var displayName = \"withRouter(\" + (Component.displayName || Component.name) + \")\";\n\n  var C = function C(props) {\n    var wrappedComponentRef = props.wrappedComponentRef,\n        remainingProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(props, [\"wrappedComponentRef\"]);\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n      !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <\" + displayName + \" /> outside a <Router>\") : undefined : void 0;\n      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, remainingProps, context, {\n        ref: wrappedComponentRef\n      }));\n    });\n  };\n\n  C.displayName = displayName;\n  C.WrappedComponent = Component;\n\n  if (true) {\n    C.propTypes = {\n      wrappedComponentRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object])\n    };\n  }\n\n  return hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11___default()(C, Component);\n}\n\nvar useContext = react__WEBPACK_IMPORTED_MODULE_1___default.a.useContext;\nfunction useHistory() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useHistory()\") : undefined : void 0;\n  }\n\n  return useContext(historyContext);\n}\nfunction useLocation() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useLocation()\") : undefined : void 0;\n  }\n\n  return useContext(context).location;\n}\nfunction useParams() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useParams()\") : undefined : void 0;\n  }\n\n  var match = useContext(context).match;\n  return match ? match.params : {};\n}\nfunction useRouteMatch(path) {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useRouteMatch()\") : undefined : void 0;\n  }\n\n  var location = useLocation();\n  var match = useContext(context).match;\n  return path ? matchPath(location.pathname, path) : match;\n}\n\nif (true) {\n  if (typeof window !== \"undefined\") {\n    var global = window;\n    var key = \"__react_router_build__\";\n    var buildNames = {\n      cjs: \"CommonJS\",\n      esm: \"ES modules\",\n      umd: \"UMD\"\n    };\n\n    if (global[key] && global[key] !== \"esm\") {\n      var initialBuildName = buildNames[global[key]];\n      var secondaryBuildName = buildNames[\"esm\"]; // TODO: Add link to article that explains in detail how to avoid\n      // loading 2 different builds.\n\n      throw new Error(\"You are loading the \" + secondaryBuildName + \" build of React Router \" + (\"on a page that is already running the \" + initialBuildName + \" \") + \"build, so things won't work right.\");\n    }\n\n    global[key] = \"esm\";\n  }\n}\n\n\n//# sourceMappingURL=react-router.js.map\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-router/esm/react-router.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-sound/lib/index.js":
-/*!***********************************************************!*\
-  !*** ./jaas-client/node_modules/react-sound/lib/index.js ***!
-  \***********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar pendingCalls = [];\nvar initialized = false;\n\nvar soundManager = void 0;\n// Allow server side rendering\nif (typeof window !== 'undefined') {\n  if (true) {\n    var _require = __webpack_require__(/*! soundmanager2 */ \"./jaas-client/node_modules/soundmanager2/script/soundmanager2.js\");\n\n    soundManager = _require.soundManager;\n  } else { var _require2; }\n\n  soundManager.onready(function () {\n    pendingCalls.slice().forEach(function (cb) {\n      return cb();\n    });\n  });\n}\n\nfunction _createSound(options, cb) {\n  if (soundManager.ok()) {\n    cb(soundManager.createSound(options));\n    return function () {};\n  } else {\n    if (!initialized) {\n      initialized = true;\n      soundManager.beginDelayedInit();\n    }\n\n    var call = function call() {\n      cb(soundManager.createSound(options));\n    };\n\n    pendingCalls.push(call);\n\n    return function () {\n      pendingCalls.splice(pendingCalls.indexOf(call), 1);\n    };\n  }\n}\n\nfunction noop() {}\n\nvar playStatuses = {\n  PLAYING: 'PLAYING',\n  STOPPED: 'STOPPED',\n  PAUSED: 'PAUSED'\n};\n\nvar Sound = function (_React$Component) {\n  _inherits(Sound, _React$Component);\n\n  function Sound() {\n    _classCallCheck(this, Sound);\n\n    return _possibleConstructorReturn(this, (Sound.__proto__ || Object.getPrototypeOf(Sound)).apply(this, arguments));\n  }\n\n  _createClass(Sound, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      this.createSound(function (sound) {\n        return _this2.updateSound(sound);\n      });\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.removeSound();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps) {\n      var _this3 = this;\n\n      if (this.props.url !== prevProps.url) {\n        this.createSound(function (sound) {\n          return _this3.updateSound(sound, prevProps);\n        });\n      } else {\n        this.updateSound(this.sound);\n      }\n    }\n  }, {\n    key: 'updateSound',\n    value: function updateSound(sound) {\n      var prevProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (!sound) {\n        return;\n      }\n\n      if (this.props.playStatus === playStatuses.PLAYING) {\n        if (sound.playState === 0) {\n          sound.play();\n        }\n\n        if (sound.paused) {\n          sound.resume();\n        }\n      } else if (this.props.playStatus === playStatuses.STOPPED) {\n        if (sound.playState !== 0) {\n          sound.stop();\n        }\n      } else {\n        // this.props.playStatus === playStatuses.PAUSED\n        if (!sound.paused) {\n          sound.pause();\n        }\n      }\n\n      if (this.props.playFromPosition != null) {\n        if (this.props.playFromPosition !== prevProps.playFromPosition) {\n          sound.setPosition(this.props.playFromPosition);\n        }\n      }\n\n      if (this.props.position != null) {\n        if (sound.position !== this.props.position && Math.round(sound.position) !== Math.round(this.props.position)) {\n\n          sound.setPosition(this.props.position);\n        }\n      }\n\n      if (this.props.volume !== prevProps.volume) {\n        sound.setVolume(this.props.volume);\n      }\n\n      if (this.props.playbackRate !== prevProps.playbackRate) {\n        sound.setPlaybackRate(this.props.playbackRate);\n      }\n    }\n  }, {\n    key: 'createSound',\n    value: function createSound(callback) {\n      var _this4 = this;\n\n      this.removeSound();\n\n      var instance = this;\n\n      if (!this.props.url) {\n        return;\n      }\n\n      this.stopCreatingSound = _createSound({\n        url: this.props.url,\n        autoLoad: this.props.autoLoad,\n        volume: this.props.volume,\n        position: this.props.playFromPosition || this.props.position || 0,\n        playbackRate: this.props.playbackRate,\n        whileloading: function whileloading() {\n          instance.props.onLoading(this);\n        },\n        whileplaying: function whileplaying() {\n          instance.props.onPlaying(this);\n        },\n        onerror: function onerror(errorCode, description) {\n          instance.props.onError(errorCode, description, this);\n        },\n        onload: function onload() {\n          instance.props.onLoad(this);\n        },\n        onpause: function onpause() {\n          instance.props.onPause(this);\n        },\n        onresume: function onresume() {\n          instance.props.onResume(this);\n        },\n        onstop: function onstop() {\n          instance.props.onStop(this);\n        },\n        onfinish: function onfinish() {\n          if (instance.props.loop && instance.props.playStatus === playStatuses.PLAYING) {\n            instance.sound.play();\n          } else {\n            instance.props.onFinishedPlaying();\n          }\n        },\n        onbufferchange: function onbufferchange() {\n          instance.props.onBufferChange(this.isBuffering);\n        }\n      }, function (sound) {\n        _this4.sound = sound;\n        callback(sound);\n      });\n    }\n  }, {\n    key: 'removeSound',\n    value: function removeSound() {\n      if (this.stopCreatingSound) {\n        this.stopCreatingSound();\n        delete this.stopCreatingSound;\n      }\n\n      if (this.sound) {\n        try {\n          this.sound.destruct();\n        } catch (e) {} // eslint-disable-line\n\n        delete this.sound;\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Sound;\n}(_react2.default.Component);\n\nSound.status = playStatuses;\nSound.propTypes = {\n  url: _propTypes2.default.string.isRequired,\n  playStatus: _propTypes2.default.oneOf(Object.keys(playStatuses)).isRequired,\n  position: _propTypes2.default.number,\n  playFromPosition: _propTypes2.default.number,\n  volume: _propTypes2.default.number,\n  playbackRate: _propTypes2.default.number,\n  onError: _propTypes2.default.func,\n  onLoading: _propTypes2.default.func,\n  onLoad: _propTypes2.default.func,\n  onPlaying: _propTypes2.default.func,\n  onPause: _propTypes2.default.func,\n  onResume: _propTypes2.default.func,\n  onStop: _propTypes2.default.func,\n  onFinishedPlaying: _propTypes2.default.func,\n  onBufferChange: _propTypes2.default.func,\n  autoLoad: _propTypes2.default.bool,\n  loop: _propTypes2.default.bool\n};\nSound.defaultProps = {\n  volume: 100,\n  playbackRate: 1,\n  onError: noop,\n  onLoading: noop,\n  onPlaying: noop,\n  onLoad: noop,\n  onPause: noop,\n  onResume: noop,\n  onStop: noop,\n  onFinishedPlaying: noop,\n  onBufferChange: noop,\n  autoLoad: false,\n  loop: false\n};\nexports.default = Sound;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-sound/lib/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var dom_helpers_addClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dom-helpers/addClass */ \"./jaas-client/node_modules/dom-helpers/esm/addClass.js\");\n/* harmony import */ var dom_helpers_removeClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! dom-helpers/removeClass */ \"./jaas-client/node_modules/dom-helpers/esm/removeClass.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony import */ var _utils_PropTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/PropTypes */ \"./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js\");\n\n\n\n\n\n\n\n\n\n\nvar _addClass = function addClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return Object(dom_helpers_addClass__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(node, c);\n  });\n};\n\nvar removeClass = function removeClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return Object(dom_helpers_removeClass__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(node, c);\n  });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n *         <div>\n *           {\"I'll receive my-node-* classes\"}\n *         </div>\n *       </CSSTransition>\n *       <button type=\"button\" onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n *   opacity: 0;\n * }\n * .my-node-enter-active {\n *   opacity: 1;\n *   transition: opacity 200ms;\n * }\n * .my-node-exit {\n *   opacity: 1;\n * }\n * .my-node-exit-active {\n *   opacity: 0;\n *   transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(CSSTransition, _React$Component);\n\n  function CSSTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.appliedClasses = {\n      appear: {},\n      enter: {},\n      exit: {}\n    };\n\n    _this.onEnter = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument[0],\n          appearing = _this$resolveArgument[1];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n      if (_this.props.onEnter) {\n        _this.props.onEnter(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntering = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument2[0],\n          appearing = _this$resolveArgument2[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.addClass(node, type, 'active');\n\n      if (_this.props.onEntering) {\n        _this.props.onEntering(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntered = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument3[0],\n          appearing = _this$resolveArgument3[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.removeClasses(node, type);\n\n      _this.addClass(node, type, 'done');\n\n      if (_this.props.onEntered) {\n        _this.props.onEntered(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onExit = function (maybeNode) {\n      var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument4[0];\n\n      _this.removeClasses(node, 'appear');\n\n      _this.removeClasses(node, 'enter');\n\n      _this.addClass(node, 'exit', 'base');\n\n      if (_this.props.onExit) {\n        _this.props.onExit(maybeNode);\n      }\n    };\n\n    _this.onExiting = function (maybeNode) {\n      var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument5[0];\n\n      _this.addClass(node, 'exit', 'active');\n\n      if (_this.props.onExiting) {\n        _this.props.onExiting(maybeNode);\n      }\n    };\n\n    _this.onExited = function (maybeNode) {\n      var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument6[0];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, 'exit', 'done');\n\n      if (_this.props.onExited) {\n        _this.props.onExited(maybeNode);\n      }\n    };\n\n    _this.resolveArguments = function (maybeNode, maybeAppearing) {\n      return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n      : [maybeNode, maybeAppearing];\n    };\n\n    _this.getClassNames = function (type) {\n      var classNames = _this.props.classNames;\n      var isStringClassNames = typeof classNames === 'string';\n      var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n      var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n      var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n      var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n      return {\n        baseClassName: baseClassName,\n        activeClassName: activeClassName,\n        doneClassName: doneClassName\n      };\n    };\n\n    return _this;\n  }\n\n  var _proto = CSSTransition.prototype;\n\n  _proto.addClass = function addClass(node, type, phase) {\n    var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n    var _this$getClassNames = this.getClassNames('enter'),\n        doneClassName = _this$getClassNames.doneClassName;\n\n    if (type === 'appear' && phase === 'done' && doneClassName) {\n      className += \" \" + doneClassName;\n    } // This is for to force a repaint,\n    // which is necessary in order to transition styles when adding a class name.\n\n\n    if (phase === 'active') {\n      /* eslint-disable no-unused-expressions */\n      node && node.scrollTop;\n    }\n\n    if (className) {\n      this.appliedClasses[type][phase] = className;\n\n      _addClass(node, className);\n    }\n  };\n\n  _proto.removeClasses = function removeClasses(node, type) {\n    var _this$appliedClasses$ = this.appliedClasses[type],\n        baseClassName = _this$appliedClasses$.base,\n        activeClassName = _this$appliedClasses$.active,\n        doneClassName = _this$appliedClasses$.done;\n    this.appliedClasses[type] = {};\n\n    if (baseClassName) {\n      removeClass(node, baseClassName);\n    }\n\n    if (activeClassName) {\n      removeClass(node, activeClassName);\n    }\n\n    if (doneClassName) {\n      removeClass(node, doneClassName);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        _ = _this$props.classNames,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_this$props, [\"classNames\"]);\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_Transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, props, {\n      onEnter: this.onEnter,\n      onEntered: this.onEntered,\n      onEntering: this.onEntering,\n      onExit: this.onExit,\n      onExiting: this.onExiting,\n      onExited: this.onExited\n    }));\n  };\n\n  return CSSTransition;\n}(react__WEBPACK_IMPORTED_MODULE_6___default.a.Component);\n\nCSSTransition.defaultProps = {\n  classNames: ''\n};\nCSSTransition.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _Transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"].propTypes, {\n  /**\n   * The animation classNames applied to the component as it appears, enters,\n   * exits or has finished the transition. A single name can be provided, which\n   * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n   *\n   * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n   * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n   * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n   *\n   * A few details to note about how these classes are applied:\n   *\n   * 1. They are _joined_ with the ones that are already defined on the child\n   *    component, so if you want to add some base styles, you can use\n   *    `className` without worrying that it will be overridden.\n   *\n   * 2. If the transition component mounts with `in={false}`, no classes are\n   *    applied yet. You might be expecting `*-exit-done`, but if you think\n   *    about it, a component cannot finish exiting if it hasn't entered yet.\n   *\n   * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n   *    allows you to define different behavior for when appearing is done and\n   *    when regular entering is done, using selectors like\n   *    `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n   *    an epic entrance animation when element first appears in the DOM using\n   *    [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n   *    simply use `fade-enter-done` for defining both cases.\n   *\n   * Each individual classNames can also be specified independently like:\n   *\n   * ```js\n   * classNames={{\n   *  appear: 'my-appear',\n   *  appearActive: 'my-active-appear',\n   *  appearDone: 'my-done-appear',\n   *  enter: 'my-enter',\n   *  enterActive: 'my-active-enter',\n   *  enterDone: 'my-done-enter',\n   *  exit: 'my-exit',\n   *  exitActive: 'my-active-exit',\n   *  exitDone: 'my-done-exit',\n   * }}\n   * ```\n   *\n   * If you want to set these classes using CSS Modules:\n   *\n   * ```js\n   * import styles from './styles.css';\n   * ```\n   *\n   * you might want to use camelCase in your CSS file, that way could simply\n   * spread them instead of listing them one by one:\n   *\n   * ```js\n   * classNames={{ ...styles }}\n   * ```\n   *\n   * @type {string | {\n   *  appear?: string,\n   *  appearActive?: string,\n   *  appearDone?: string,\n   *  enter?: string,\n   *  enterActive?: string,\n   *  enterDone?: string,\n   *  exit?: string,\n   *  exitActive?: string,\n   *  exitDone?: string,\n   * }}\n   */\n  classNames: _utils_PropTypes__WEBPACK_IMPORTED_MODULE_8__[\"classNamesShape\"],\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter-active' or\n   * 'appear-active' class is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or\n   * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' classes\n   * are **removed** and the `exit-done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func\n}) : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (CSSTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TransitionGroup */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js\");\n\n\n\n\n\n\n/**\n * The `<ReplaceTransition>` component is a specialized `Transition` component\n * that animates between two children.\n *\n * ```jsx\n * <ReplaceTransition in>\n *   <Fade><div>I appear first</div></Fade>\n *   <Fade><div>I replace the above</div></Fade>\n * </ReplaceTransition>\n * ```\n */\n\nvar ReplaceTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(ReplaceTransition, _React$Component);\n\n  function ReplaceTransition() {\n    var _this;\n\n    for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n      _args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n    _this.handleEnter = function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.handleLifecycle('onEnter', 0, args);\n    };\n\n    _this.handleEntering = function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.handleLifecycle('onEntering', 0, args);\n    };\n\n    _this.handleEntered = function () {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.handleLifecycle('onEntered', 0, args);\n    };\n\n    _this.handleExit = function () {\n      for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.handleLifecycle('onExit', 1, args);\n    };\n\n    _this.handleExiting = function () {\n      for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.handleLifecycle('onExiting', 1, args);\n    };\n\n    _this.handleExited = function () {\n      for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n        args[_key7] = arguments[_key7];\n      }\n\n      return _this.handleLifecycle('onExited', 1, args);\n    };\n\n    return _this;\n  }\n\n  var _proto = ReplaceTransition.prototype;\n\n  _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n    var _child$props;\n\n    var children = this.props.children;\n    var child = react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.toArray(children)[idx];\n    if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n\n    if (this.props[handler]) {\n      var maybeNode = child.props.nodeRef ? undefined : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this);\n      this.props[handler](maybeNode);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        inProp = _this$props.in,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"children\", \"in\"]);\n\n    var _React$Children$toArr = react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.toArray(children),\n        first = _React$Children$toArr[0],\n        second = _React$Children$toArr[1];\n\n    delete props.onEnter;\n    delete props.onEntering;\n    delete props.onEntered;\n    delete props.onExit;\n    delete props.onExiting;\n    delete props.onExited;\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TransitionGroup__WEBPACK_IMPORTED_MODULE_5__[\"default\"], props, inProp ? react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(first, {\n      key: 'first',\n      onEnter: this.handleEnter,\n      onEntering: this.handleEntering,\n      onEntered: this.handleEntered\n    }) : react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(second, {\n      key: 'second',\n      onEnter: this.handleExit,\n      onEntering: this.handleExiting,\n      onEntered: this.handleExited\n    }));\n  };\n\n  return ReplaceTransition;\n}(react__WEBPACK_IMPORTED_MODULE_3___default.a.Component);\n\nReplaceTransition.propTypes =  true ? {\n  in: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,\n  children: function children(props, propName) {\n    if (react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n    return null;\n  }\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (ReplaceTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js ***!
-  \*********************************************************************************/
-/*! exports provided: modes, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"modes\", function() { return modes; });\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n\n\nvar _leaveRenders, _enterRenders;\n\n\n\n\n\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n  if (oldChildren === newChildren) return false;\n\n  if (react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(oldChildren) && react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n    return false;\n  }\n\n  return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nvar modes = {\n  out: 'out-in',\n  in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n  return function () {\n    var _element$props;\n\n    element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n    cb();\n  };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n  var current = _ref.current,\n      changeState = _ref.changeState;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"], null);\n    })\n  });\n}, _leaveRenders[modes.in] = function (_ref2) {\n  var current = _ref2.current,\n      changeState = _ref2.changeState,\n      children = _ref2.children;\n  return [current, react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]);\n    })\n  })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n  var children = _ref3.children,\n      changeState = _ref3.changeState;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"], react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n        in: true\n      }));\n    })\n  });\n}, _enterRenders[modes.in] = function (_ref4) {\n  var current = _ref4.current,\n      children = _ref4.children,\n      changeState = _ref4.changeState;\n  return [react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"], react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n        in: true\n      }));\n    })\n  }), react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true\n  })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n *  const [state, setState] = useState(false);\n *  return (\n *    <SwitchTransition>\n *      <CSSTransition\n *        key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n *        classNames='fade'\n *      >\n *        <button onClick={() => setState(state => !state)}>\n *          {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        </button>\n *      </CSSTransition>\n *    </SwitchTransition>\n *  );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n *    opacity: 0;\n * }\n * .fade-exit{\n *    opacity: 1;\n * }\n * .fade-enter-active{\n *    opacity: 1;\n * }\n * .fade-exit-active{\n *    opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n *    transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(SwitchTransition, _React$Component);\n\n  function SwitchTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.state = {\n      status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"],\n      current: null\n    };\n    _this.appeared = false;\n\n    _this.changeState = function (status, current) {\n      if (current === void 0) {\n        current = _this.state.current;\n      }\n\n      _this.setState({\n        status: status,\n        current: current\n      });\n    };\n\n    return _this;\n  }\n\n  var _proto = SwitchTransition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.appeared = true;\n  };\n\n  SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n    if (props.children == null) {\n      return {\n        current: null\n      };\n    }\n\n    if (state.status === _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"] && props.mode === modes.in) {\n      return {\n        status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]\n      };\n    }\n\n    if (state.current && areChildrenDifferent(state.current, props.children)) {\n      return {\n        status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"EXITING\"]\n      };\n    }\n\n    return {\n      current: react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(props.children, {\n        in: true\n      })\n    };\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        mode = _this$props.mode,\n        _this$state = this.state,\n        status = _this$state.status,\n        current = _this$state.current;\n    var data = {\n      children: children,\n      current: current,\n      changeState: this.changeState,\n      status: status\n    };\n    var component;\n\n    switch (status) {\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]:\n        component = enterRenders[mode](data);\n        break;\n\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"EXITING\"]:\n        component = leaveRenders[mode](data);\n        break;\n\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"]:\n        component = current;\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Provider, {\n      value: {\n        isMounting: !this.appeared\n      }\n    }, component);\n  };\n\n  return SwitchTransition;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nSwitchTransition.propTypes =  true ? {\n  /**\n   * Transition modes.\n   * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n   * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n   *\n   * @type {'out-in'|'in-out'}\n   */\n  mode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf([modes.in, modes.out]),\n\n  /**\n   * Any `Transition` or `CSSTransition` component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element.isRequired])\n} : undefined;\nSwitchTransition.defaultProps = {\n  mode: modes.out\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SwitchTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/Transition.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/Transition.js ***!
-  \***************************************************************************/
-/*! exports provided: UNMOUNTED, EXITED, ENTERING, ENTERED, EXITING, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UNMOUNTED\", function() { return UNMOUNTED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EXITED\", function() { return EXITED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ENTERING\", function() { return ENTERING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ENTERED\", function() { return ENTERED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EXITING\", function() { return EXITING; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ \"./jaas-client/node_modules/react-transition-group/esm/config.js\");\n/* harmony import */ var _utils_PropTypes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/PropTypes */ \"./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js\");\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n\n\n\n\n\n\n\n\nvar UNMOUNTED = 'unmounted';\nvar EXITED = 'exited';\nvar ENTERING = 'entering';\nvar ENTERED = 'entered';\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 1 },\n *   entered:  { opacity: 1 },\n *   exiting:  { opacity: 0 },\n *   exited:  { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {state => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm a fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n *  - `'entering'`\n *  - `'entered'`\n *  - `'exiting'`\n *  - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <Transition in={inProp} timeout={500}>\n *         {state => (\n *           // ...\n *         )}\n *       </Transition>\n *       <button onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Transition, _React$Component);\n\n  function Transition(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n    var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n    var initialStatus;\n    _this.appearStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.appearStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = {\n      status: initialStatus\n    };\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var nextIn = _ref.in;\n\n    if (nextIn && prevState.status === UNMOUNTED) {\n      return {\n        status: EXITED\n      };\n    }\n\n    return null;\n  } // getSnapshotBeforeUpdate(prevProps) {\n  //   let nextStatus = null\n  //   if (prevProps !== this.props) {\n  //     const { status } = this.state\n  //     if (this.props.in) {\n  //       if (status !== ENTERING && status !== ENTERED) {\n  //         nextStatus = ENTERING\n  //       }\n  //     } else {\n  //       if (status === ENTERING || status === ENTERED) {\n  //         nextStatus = EXITING\n  //       }\n  //     }\n  //   }\n  //   return { nextStatus }\n  // }\n  ;\n\n  var _proto = Transition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.updateStatus(true, this.appearStatus);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var nextStatus = null;\n\n    if (prevProps !== this.props) {\n      var status = this.state.status;\n\n      if (this.props.in) {\n        if (status !== ENTERING && status !== ENTERED) {\n          nextStatus = ENTERING;\n        }\n      } else {\n        if (status === ENTERING || status === ENTERED) {\n          nextStatus = EXITING;\n        }\n      }\n    }\n\n    this.updateStatus(false, nextStatus);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  _proto.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n    var exit, enter, appear;\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter; // TODO: remove fallback for next major\n\n      appear = timeout.appear !== undefined ? timeout.appear : enter;\n    }\n\n    return {\n      exit: exit,\n      enter: enter,\n      appear: appear\n    };\n  };\n\n  _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n    if (mounting === void 0) {\n      mounting = false;\n    }\n\n    if (nextStatus !== null) {\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n\n      if (nextStatus === ENTERING) {\n        this.performEnter(mounting);\n      } else {\n        this.performExit();\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({\n        status: UNMOUNTED\n      });\n    }\n  };\n\n  _proto.performEnter = function performEnter(mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n    var appearing = this.context ? this.context.isMounting : mounting;\n\n    var _ref2 = this.props.nodeRef ? [appearing] : [react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this), appearing],\n        maybeNode = _ref2[0],\n        maybeAppearing = _ref2[1];\n\n    var timeouts = this.getTimeouts();\n    var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n\n    if (!mounting && !enter || _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"].disabled) {\n      this.safeSetState({\n        status: ENTERED\n      }, function () {\n        _this2.props.onEntered(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onEnter(maybeNode, maybeAppearing);\n    this.safeSetState({\n      status: ENTERING\n    }, function () {\n      _this2.props.onEntering(maybeNode, maybeAppearing);\n\n      _this2.onTransitionEnd(enterTimeout, function () {\n        _this2.safeSetState({\n          status: ENTERED\n        }, function () {\n          _this2.props.onEntered(maybeNode, maybeAppearing);\n        });\n      });\n    });\n  };\n\n  _proto.performExit = function performExit() {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n    var timeouts = this.getTimeouts();\n    var maybeNode = this.props.nodeRef ? undefined : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this); // no exit animation skip right to EXITED\n\n    if (!exit || _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"].disabled) {\n      this.safeSetState({\n        status: EXITED\n      }, function () {\n        _this3.props.onExited(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onExit(maybeNode);\n    this.safeSetState({\n      status: EXITING\n    }, function () {\n      _this3.props.onExiting(maybeNode);\n\n      _this3.onTransitionEnd(timeouts.exit, function () {\n        _this3.safeSetState({\n          status: EXITED\n        }, function () {\n          _this3.props.onExited(maybeNode);\n        });\n      });\n    });\n  };\n\n  _proto.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  _proto.safeSetState = function safeSetState(nextState, callback) {\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, callback);\n  };\n\n  _proto.setNextCallback = function setNextCallback(callback) {\n    var _this4 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this4.nextCallback = null;\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n    this.setNextCallback(handler);\n    var node = this.props.nodeRef ? this.props.nodeRef.current : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this);\n    var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n    if (!node || doesNotHaveTimeoutOrListener) {\n      setTimeout(this.nextCallback, 0);\n      return;\n    }\n\n    if (this.props.addEndListener) {\n      var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n          maybeNode = _ref3[0],\n          maybeNextCallback = _ref3[1];\n\n      this.props.addEndListener(maybeNode, maybeNextCallback);\n    }\n\n    if (timeout != null) {\n      setTimeout(this.nextCallback, timeout);\n    }\n  };\n\n  _proto.render = function render() {\n    var status = this.state.status;\n\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _this$props = this.props,\n        children = _this$props.children,\n        _in = _this$props.in,\n        _mountOnEnter = _this$props.mountOnEnter,\n        _unmountOnExit = _this$props.unmountOnExit,\n        _appear = _this$props.appear,\n        _enter = _this$props.enter,\n        _exit = _this$props.exit,\n        _timeout = _this$props.timeout,\n        _addEndListener = _this$props.addEndListener,\n        _onEnter = _this$props.onEnter,\n        _onEntering = _this$props.onEntering,\n        _onEntered = _this$props.onEntered,\n        _onExit = _this$props.onExit,\n        _onExiting = _this$props.onExiting,\n        _onExited = _this$props.onExited,\n        _nodeRef = _this$props.nodeRef,\n        childProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n    return (\n      /*#__PURE__*/\n      // allows for nested Transitions\n      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n        value: null\n      }, typeof children === 'function' ? children(status, childProps) : react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.only(children), childProps))\n    );\n  };\n\n  return Transition;\n}(react__WEBPACK_IMPORTED_MODULE_3___default.a.Component);\n\nTransition.contextType = _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\nTransition.propTypes =  true ? {\n  /**\n   * A React reference to DOM element that need to transition:\n   * https://stackoverflow.com/a/51127130/4671932\n   *\n   *   - When `nodeRef` prop is used, `node` is not passed to callback functions\n   *      (e.g. `onEnter`) because user already has direct access to the node.\n   *   - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n   *     `nodeRef` need to be provided to `Transition` with changed `key` prop\n   *     (see\n   *     [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n   */\n  nodeRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({\n    current: typeof Element === 'undefined' ? prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.any : prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(Element)\n  }),\n\n  /**\n   * A `function` child can be used instead of a React element. This function is\n   * called with the current transition status (`'entering'`, `'entered'`,\n   * `'exiting'`, `'exited'`), which can be used to apply context\n   * specific props to a component.\n   *\n   * ```jsx\n   * <Transition in={this.state.in} timeout={150}>\n   *   {state => (\n   *     <MyComponent className={`fade fade-${state}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component does not perform the enter transition when\n   * it first mounts, regardless of the value of `in`. If you want this\n   * behavior, set both `appear` and `in` to `true`.\n   *\n   * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n   * > only adds an additional enter transition. However, in the\n   * > `<CSSTransition>` component that first enter transition does result in\n   * > additional `.appear-*` classes, that way you can choose to style it\n   * > differently.\n   */\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEndListener` is provided.\n   *\n   * You may specify a single timeout for all transitions:\n   *\n   * ```jsx\n   * timeout={500}\n   * ```\n   *\n   * or individually:\n   *\n   * ```jsx\n   * timeout={{\n   *  appear: 500,\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * - `appear` defaults to the value of `enter`\n   * - `enter` defaults to `0`\n   * - `exit` defaults to `0`\n   *\n   * @type {number | { enter?: number, exit?: number, appear?: number }}\n   */\n  timeout: function timeout(props) {\n    var pt = _utils_PropTypes__WEBPACK_IMPORTED_MODULE_6__[\"timeoutsShape\"];\n    if (!props.addEndListener) pt = pt.isRequired;\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return pt.apply(void 0, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. Timeouts are still used as a fallback if provided.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n} : undefined; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Transition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/Transition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n/* harmony import */ var _utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/ChildMapping */ \"./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js\");\n\n\n\n\n\n\n\n\n\nvar values = Object.values || function (obj) {\n  return Object.keys(obj).map(function (k) {\n    return obj[k];\n  });\n};\n\nvar defaultProps = {\n  component: 'div',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n/**\n * The `<TransitionGroup>` component manages a set of transition components\n * (`<Transition>` and `<CSSTransition>`) in a list. Like with the transition\n * components, `<TransitionGroup>` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the `<TransitionGroup>`.\n *\n * Note that `<TransitionGroup>`  does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\nvar TransitionGroup = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n\n    var handleExited = _this.handleExited.bind(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_this)); // Initial children should all be entering, dependent on appear\n\n\n    _this.state = {\n      contextValue: {\n        isMounting: true\n      },\n      handleExited: handleExited,\n      firstRender: true\n    };\n    return _this;\n  }\n\n  var _proto = TransitionGroup.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.mounted = true;\n    this.setState({\n      contextValue: {\n        isMounting: false\n      }\n    });\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.mounted = false;\n  };\n\n  TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n    var prevChildMapping = _ref.children,\n        handleExited = _ref.handleExited,\n        firstRender = _ref.firstRender;\n    return {\n      children: firstRender ? Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getInitialChildMapping\"])(nextProps, handleExited) : Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getNextChildMapping\"])(nextProps, prevChildMapping, handleExited),\n      firstRender: false\n    };\n  } // node is `undefined` when user provided `nodeRef` prop\n  ;\n\n  _proto.handleExited = function handleExited(child, node) {\n    var currentChildMapping = Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getChildMapping\"])(this.props.children);\n    if (child.key in currentChildMapping) return;\n\n    if (child.props.onExited) {\n      child.props.onExited(node);\n    }\n\n    if (this.mounted) {\n      this.setState(function (state) {\n        var children = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, state.children);\n\n        delete children[child.key];\n        return {\n          children: children\n        };\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        Component = _this$props.component,\n        childFactory = _this$props.childFactory,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"component\", \"childFactory\"]);\n\n    var contextValue = this.state.contextValue;\n    var children = values(this.state.children).map(childFactory);\n    delete props.appear;\n    delete props.enter;\n    delete props.exit;\n\n    if (Component === null) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n        value: contextValue\n      }, children);\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n      value: contextValue\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(Component, props, children));\n  };\n\n  return TransitionGroup;\n}(react__WEBPACK_IMPORTED_MODULE_5___default.a.Component);\n\nTransitionGroup.propTypes =  true ? {\n  /**\n   * `<TransitionGroup>` renders a `<div>` by default. You can change this\n   * behavior by providing a `component` prop.\n   * If you use React v16+ and would like to avoid a wrapping `<div>` element\n   * you can pass in `component={null}`. This is useful if the wrapping div\n   * borks your css styles.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any,\n\n  /**\n   * A set of `<Transition>` components, that are toggled `in` and out as they\n   * leave. the `<TransitionGroup>` will inject specific transition props, so\n   * remember to spread them through if you are wrapping the `<Transition>` as\n   * with our `<Fade>` example.\n   *\n   * While this component is meant for multiple `Transition` or `CSSTransition`\n   * children, sometimes you may want to have a single transition child with\n   * content that you want to be transitioned out and in when you change it\n   * (e.g. routes, images etc.) In that case you can change the `key` prop of\n   * the transition child as you change its content, this will cause\n   * `TransitionGroup` to transition the child out and back in.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * A convenience prop that enables or disables appear animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A convenience prop that enables or disables enter animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A convenience prop that enables or disables exit animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * You may need to apply reactive updates to a child as it is exiting.\n   * This is generally done by using `cloneElement` however in the case of an exiting\n   * child the element has already been removed and not accessible to the consumer.\n   *\n   * If you do need to update a child as it leaves you can provide a `childFactory`\n   * to wrap every child, even the ones that are leaving.\n   *\n   * @type Function(child: ReactElement) -> ReactElement\n   */\n  childFactory: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func\n} : undefined;\nTransitionGroup.defaultProps = defaultProps;\n/* harmony default export */ __webpack_exports__[\"default\"] = (TransitionGroup);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext(null));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/config.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/config.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  disabled: false\n});\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/config.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/index.js ***!
-  \**********************************************************************/
-/*! exports provided: CSSTransition, ReplaceTransition, SwitchTransition, TransitionGroup, Transition, config */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSSTransition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CSSTransition */ \"./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CSSTransition\", function() { return _CSSTransition__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _ReplaceTransition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ReplaceTransition */ \"./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ReplaceTransition\", function() { return _ReplaceTransition__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _SwitchTransition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SwitchTransition */ \"./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SwitchTransition\", function() { return _SwitchTransition__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TransitionGroup */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TransitionGroup\", function() { return _TransitionGroup__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Transition\", function() { return _Transition__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ \"./jaas-client/node_modules/react-transition-group/esm/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js ***!
-  \***********************************************************************************/
-/*! exports provided: getChildMapping, mergeChildMappings, getInitialChildMapping, getNextChildMapping */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getChildMapping\", function() { return getChildMapping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeChildMappings\", function() { return mergeChildMappings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getInitialChildMapping\", function() { return getInitialChildMapping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getNextChildMapping\", function() { return getNextChildMapping; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\n\nfunction getChildMapping(children, mapFn) {\n  var mapper = function mapper(child) {\n    return mapFn && Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(child) ? mapFn(child) : child;\n  };\n\n  var result = Object.create(null);\n  if (children) react__WEBPACK_IMPORTED_MODULE_0__[\"Children\"].map(children, function (c) {\n    return c;\n  }).forEach(function (child) {\n    // run the map function here instead so that the key is the computed one\n    result[child.key] = mapper(child);\n  });\n  return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nfunction mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    return key in next ? next[key] : prev[key];\n  } // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n\n\n  var nextKeysPending = Object.create(null);\n  var pendingKeys = [];\n\n  for (var prevKey in prev) {\n    if (prevKey in next) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i;\n  var childMapping = {};\n\n  for (var nextKey in next) {\n    if (nextKeysPending[nextKey]) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n\n    childMapping[nextKey] = getValueForKey(nextKey);\n  } // Finally, add the keys which didn't appear before any key in `next`\n\n\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n  return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n  return getChildMapping(props.children, function (child) {\n    return Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n      onExited: onExited.bind(null, child),\n      in: true,\n      appear: getProp(child, 'appear', props),\n      enter: getProp(child, 'enter', props),\n      exit: getProp(child, 'exit', props)\n    });\n  });\n}\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n  var nextChildMapping = getChildMapping(nextProps.children);\n  var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n  Object.keys(children).forEach(function (key) {\n    var child = children[key];\n    if (!Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(child)) return;\n    var hasPrev = (key in prevChildMapping);\n    var hasNext = (key in nextChildMapping);\n    var prevChild = prevChildMapping[key];\n    var isLeaving = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(prevChild) && !prevChild.props.in; // item is new (entering)\n\n    if (hasNext && (!hasPrev || isLeaving)) {\n      // console.log('entering', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        onExited: onExited.bind(null, child),\n        in: true,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    } else if (!hasNext && hasPrev && !isLeaving) {\n      // item is old (exiting)\n      // console.log('leaving', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        in: false\n      });\n    } else if (hasNext && hasPrev && Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(prevChild)) {\n      // item hasn't changed transition states\n      // copy over the last transition props;\n      // console.log('unchanged', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        onExited: onExited.bind(null, child),\n        in: prevChild.props.in,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    }\n  });\n  return children;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js ***!
-  \********************************************************************************/
-/*! exports provided: timeoutsShape, classNamesShape */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeoutsShape\", function() { return timeoutsShape; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classNamesShape\", function() { return classNamesShape; });\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar timeoutsShape =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number\n}).isRequired]) : undefined;\nvar classNamesShape =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  active: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string\n}), prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  enterDone: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  enterActive: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exitDone: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exitActive: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string\n})]) : undefined;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react/cjs/react.development.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/react/cjs/react.development.js ***!
-  \*****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v16.13.1\n * react.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar _assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\nvar checkPropTypes = __webpack_require__(/*! prop-types/checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\n\nvar ReactVersion = '16.13.1';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\n/**\n * Keeps track of the current dispatcher.\n */\nvar ReactCurrentDispatcher = {\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n};\n\n/**\n * Keeps track of the current batch's configuration such as how long an update\n * should suspend for if it needs to.\n */\nvar ReactCurrentBatchConfig = {\n  suspense: null\n};\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n};\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n  var sourceInfo = '';\n\n  if (source) {\n    var path = source.fileName;\n    var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n    {\n      // In DEV, include code for a common special case:\n      // prefer \"folder/index.js\" instead of just \"index.js\".\n      if (/^index\\./.test(fileName)) {\n        var match = path.match(BEFORE_SLASH_RE);\n\n        if (match) {\n          var pathBeforeSlash = match[1];\n\n          if (pathBeforeSlash) {\n            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n            fileName = folderName + '/' + fileName;\n          }\n        }\n      }\n    }\n\n    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n  } else if (ownerName) {\n    sourceInfo = ' (created by ' + ownerName + ')';\n  }\n\n  return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n}\n\nvar Resolved = 1;\nfunction refineResolvedLazyComponent(lazyComponent) {\n  return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = innerType.displayName || innerType.name || '';\n  return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        return 'Context.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        return 'Context.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        return getComponentName(type.type);\n\n      case REACT_BLOCK_TYPE:\n        return getComponentName(type.render);\n\n      case REACT_LAZY_TYPE:\n        {\n          var thenable = type;\n          var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n          if (resolvedThenable) {\n            return getComponentName(resolvedThenable);\n          }\n\n          break;\n        }\n    }\n  }\n\n  return null;\n}\n\nvar ReactDebugCurrentFrame = {};\nvar currentlyValidatingElement = null;\nfunction setCurrentlyValidatingElement(element) {\n  {\n    currentlyValidatingElement = element;\n  }\n}\n\n{\n  // Stack implementation injected by the current renderer.\n  ReactDebugCurrentFrame.getCurrentStack = null;\n\n  ReactDebugCurrentFrame.getStackAddendum = function () {\n    var stack = ''; // Add an extra top frame while an element is being validated\n\n    if (currentlyValidatingElement) {\n      var name = getComponentName(currentlyValidatingElement.type);\n      var owner = currentlyValidatingElement._owner;\n      stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));\n    } // Delegate to the injected renderer-specific implementation\n\n\n    var impl = ReactDebugCurrentFrame.getCurrentStack;\n\n    if (impl) {\n      stack += impl() || '';\n    }\n\n    return stack;\n  };\n}\n\n/**\n * Used by act() to track whether you're inside an act() scope.\n */\nvar IsSomeRendererActing = {\n  current: false\n};\n\nvar ReactSharedInternals = {\n  ReactCurrentDispatcher: ReactCurrentDispatcher,\n  ReactCurrentBatchConfig: ReactCurrentBatchConfig,\n  ReactCurrentOwner: ReactCurrentOwner,\n  IsSomeRendererActing: IsSomeRendererActing,\n  // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n  assign: _assign\n};\n\n{\n  _assign(ReactSharedInternals, {\n    // These should not be included in production.\n    ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n    // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n    // TODO: remove in React 17.0.\n    ReactComponentTreeHook: {}\n  });\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n  {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    printWarning('warn', format, args);\n  }\n}\nfunction error(format) {\n  {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    printWarning('error', format, args);\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n    if (!hasExistingStack) {\n      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n      var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n      if (stack !== '') {\n        format += '%s';\n        args = args.concat([stack]);\n      }\n    }\n\n    var argsWithFormat = args.map(function (item) {\n      return '' + item;\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      throw new Error(message);\n    } catch (x) {}\n  }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = {};\n\nfunction warnNoop(publicInstance, callerName) {\n  {\n    var _constructor = publicInstance.constructor;\n    var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';\n    var warningKey = componentName + \".\" + callerName;\n\n    if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n      return;\n    }\n\n    error(\"Can't call %s on a component that is not yet mounted. \" + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);\n\n    didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n  }\n}\n/**\n * This is the abstract API for an update queue.\n */\n\n\nvar ReactNoopUpdateQueue = {\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @param {ReactClass} publicInstance The instance we want to test.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function (publicInstance) {\n    return false;\n  },\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} callerName name of the calling function in the public API.\n   * @internal\n   */\n  enqueueForceUpdate: function (publicInstance, callback, callerName) {\n    warnNoop(publicInstance, 'forceUpdate');\n  },\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} completeState Next state.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} callerName name of the calling function in the public API.\n   * @internal\n   */\n  enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n    warnNoop(publicInstance, 'replaceState');\n  },\n\n  /**\n   * Sets a subset of the state. This only exists because _pendingState is\n   * internal. This provides a merging strategy that is not available to deep\n   * properties which is confusing. TODO: Expose pendingState or don't use it\n   * during the merge.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} partialState Next partial state to be merged with state.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} Name of the calling function in the public API.\n   * @internal\n   */\n  enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n    warnNoop(publicInstance, 'setState');\n  }\n};\n\nvar emptyObject = {};\n\n{\n  Object.freeze(emptyObject);\n}\n/**\n * Base class helpers for the updating state of a component.\n */\n\n\nfunction Component(props, context, updater) {\n  this.props = props;\n  this.context = context; // If a component has string refs, we will assign a different object later.\n\n  this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the\n  // renderer.\n\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nComponent.prototype.isReactComponent = {};\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together.  You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n *        produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\n\nComponent.prototype.setState = function (partialState, callback) {\n  if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {\n    {\n      throw Error( \"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\" );\n    }\n  }\n\n  this.updater.enqueueSetState(this, partialState, callback, 'setState');\n};\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\n\n\nComponent.prototype.forceUpdate = function (callback) {\n  this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n};\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\n\n\n{\n  var deprecatedAPIs = {\n    isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n    replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n  };\n\n  var defineDeprecationWarning = function (methodName, info) {\n    Object.defineProperty(Component.prototype, methodName, {\n      get: function () {\n        warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n\n        return undefined;\n      }\n    });\n  };\n\n  for (var fnName in deprecatedAPIs) {\n    if (deprecatedAPIs.hasOwnProperty(fnName)) {\n      defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n    }\n  }\n}\n\nfunction ComponentDummy() {}\n\nComponentDummy.prototype = Component.prototype;\n/**\n * Convenience component with default shallow equality check for sCU.\n */\n\nfunction PureComponent(props, context, updater) {\n  this.props = props;\n  this.context = context; // If a component has string refs, we will assign a different object later.\n\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nvar pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\npureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.\n\n_assign(pureComponentPrototype, Component.prototype);\n\npureComponentPrototype.isPureReactComponent = true;\n\n// an immutable object with a single mutable value\nfunction createRef() {\n  var refObject = {\n    current: null\n  };\n\n  {\n    Object.seal(refObject);\n  }\n\n  return refObject;\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n  key: true,\n  ref: true,\n  __self: true,\n  __source: true\n};\nvar specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;\n\n{\n  didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n  {\n    if (hasOwnProperty.call(config, 'ref')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n  {\n    if (hasOwnProperty.call(config, 'key')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n  var warnAboutAccessingKey = function () {\n    {\n      if (!specialPropKeyWarningShown) {\n        specialPropKeyWarningShown = true;\n\n        error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n      }\n    }\n  };\n\n  warnAboutAccessingKey.isReactWarning = true;\n  Object.defineProperty(props, 'key', {\n    get: warnAboutAccessingKey,\n    configurable: true\n  });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n  var warnAboutAccessingRef = function () {\n    {\n      if (!specialPropRefWarningShown) {\n        specialPropRefWarningShown = true;\n\n        error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n      }\n    }\n  };\n\n  warnAboutAccessingRef.isReactWarning = true;\n  Object.defineProperty(props, 'ref', {\n    get: warnAboutAccessingRef,\n    configurable: true\n  });\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config) {\n  {\n    if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {\n      var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n      if (!didWarnAboutStringRefs[componentName]) {\n        error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n        didWarnAboutStringRefs[componentName] = true;\n      }\n    }\n  }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n  var element = {\n    // This tag allows us to uniquely identify this as a React Element\n    $$typeof: REACT_ELEMENT_TYPE,\n    // Built-in properties that belong on the element\n    type: type,\n    key: key,\n    ref: ref,\n    props: props,\n    // Record the component responsible for creating this element.\n    _owner: owner\n  };\n\n  {\n    // The validation flag is currently mutative. We put it on\n    // an external backing store so that we can freeze the whole object.\n    // This can be replaced with a WeakMap once they are implemented in\n    // commonly used development environments.\n    element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n    // the validation flag non-enumerable (where possible, which should\n    // include every environment we run tests in), so the test framework\n    // ignores it.\n\n    Object.defineProperty(element._store, 'validated', {\n      configurable: false,\n      enumerable: false,\n      writable: true,\n      value: false\n    }); // self and source are DEV only properties.\n\n    Object.defineProperty(element, '_self', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: self\n    }); // Two elements created in two different places should be considered\n    // equal for testing purposes and therefore we hide it from enumeration.\n\n    Object.defineProperty(element, '_source', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: source\n    });\n\n    if (Object.freeze) {\n      Object.freeze(element.props);\n      Object.freeze(element);\n    }\n  }\n\n  return element;\n};\n/**\n * Create and return a new ReactElement of the given type.\n * See https://reactjs.org/docs/react-api.html#createelement\n */\n\nfunction createElement(type, config, children) {\n  var propName; // Reserved names are extracted\n\n  var props = {};\n  var key = null;\n  var ref = null;\n  var self = null;\n  var source = null;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      ref = config.ref;\n\n      {\n        warnIfStringRefCannotBeAutoConverted(config);\n      }\n    }\n\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    }\n\n    self = config.__self === undefined ? null : config.__self;\n    source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        props[propName] = config[propName];\n      }\n    }\n  } // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n\n\n  var childrenLength = arguments.length - 2;\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n\n    {\n      if (Object.freeze) {\n        Object.freeze(childArray);\n      }\n    }\n\n    props.children = childArray;\n  } // Resolve default props\n\n\n  if (type && type.defaultProps) {\n    var defaultProps = type.defaultProps;\n\n    for (propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n  }\n\n  {\n    if (key || ref) {\n      var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n      if (key) {\n        defineKeyPropWarningGetter(props, displayName);\n      }\n\n      if (ref) {\n        defineRefPropWarningGetter(props, displayName);\n      }\n    }\n  }\n\n  return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n  var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n  return newElement;\n}\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://reactjs.org/docs/react-api.html#cloneelement\n */\n\nfunction cloneElement(element, config, children) {\n  if (!!(element === null || element === undefined)) {\n    {\n      throw Error( \"React.cloneElement(...): The argument must be a React element, but you passed \" + element + \".\" );\n    }\n  }\n\n  var propName; // Original props are copied\n\n  var props = _assign({}, element.props); // Reserved names are extracted\n\n\n  var key = element.key;\n  var ref = element.ref; // Self is preserved since the owner is preserved.\n\n  var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a\n  // transpiler, and the original source is probably a better indicator of the\n  // true owner.\n\n  var source = element._source; // Owner will be preserved, unless ref is overridden\n\n  var owner = element._owner;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      // Silently steal the ref from the parent.\n      ref = config.ref;\n      owner = ReactCurrentOwner.current;\n    }\n\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    } // Remaining properties override existing props\n\n\n    var defaultProps;\n\n    if (element.type && element.type.defaultProps) {\n      defaultProps = element.type.defaultProps;\n    }\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        if (config[propName] === undefined && defaultProps !== undefined) {\n          // Resolve default props\n          props[propName] = defaultProps[propName];\n        } else {\n          props[propName] = config[propName];\n        }\n      }\n    }\n  } // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n\n\n  var childrenLength = arguments.length - 2;\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n\n    props.children = childArray;\n  }\n\n  return ReactElement(element.type, key, ref, self, source, owner, props);\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n  var escapeRegex = /[=:]/g;\n  var escaperLookup = {\n    '=': '=0',\n    ':': '=2'\n  };\n  var escapedString = ('' + key).replace(escapeRegex, function (match) {\n    return escaperLookup[match];\n  });\n  return '$' + escapedString;\n}\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\n\nvar didWarnAboutMaps = false;\nvar userProvidedKeyEscapeRegex = /\\/+/g;\n\nfunction escapeUserProvidedKey(text) {\n  return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\nvar POOL_SIZE = 10;\nvar traverseContextPool = [];\n\nfunction getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n  if (traverseContextPool.length) {\n    var traverseContext = traverseContextPool.pop();\n    traverseContext.result = mapResult;\n    traverseContext.keyPrefix = keyPrefix;\n    traverseContext.func = mapFunction;\n    traverseContext.context = mapContext;\n    traverseContext.count = 0;\n    return traverseContext;\n  } else {\n    return {\n      result: mapResult,\n      keyPrefix: keyPrefix,\n      func: mapFunction,\n      context: mapContext,\n      count: 0\n    };\n  }\n}\n\nfunction releaseTraverseContext(traverseContext) {\n  traverseContext.result = null;\n  traverseContext.keyPrefix = null;\n  traverseContext.func = null;\n  traverseContext.context = null;\n  traverseContext.count = 0;\n\n  if (traverseContextPool.length < POOL_SIZE) {\n    traverseContextPool.push(traverseContext);\n  }\n}\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n  var type = typeof children;\n\n  if (type === 'undefined' || type === 'boolean') {\n    // All of the above are perceived as null.\n    children = null;\n  }\n\n  var invokeCallback = false;\n\n  if (children === null) {\n    invokeCallback = true;\n  } else {\n    switch (type) {\n      case 'string':\n      case 'number':\n        invokeCallback = true;\n        break;\n\n      case 'object':\n        switch (children.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n          case REACT_PORTAL_TYPE:\n            invokeCallback = true;\n        }\n\n    }\n  }\n\n  if (invokeCallback) {\n    callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array\n    // so that it's consistent if the number of children grows.\n    nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n    return 1;\n  }\n\n  var child;\n  var nextName;\n  var subtreeCount = 0; // Count of children found in the current subtree.\n\n  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      child = children[i];\n      nextName = nextNamePrefix + getComponentKey(child, i);\n      subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n    }\n  } else {\n    var iteratorFn = getIteratorFn(children);\n\n    if (typeof iteratorFn === 'function') {\n\n      {\n        // Warn about using Maps as children\n        if (iteratorFn === children.entries) {\n          if (!didWarnAboutMaps) {\n            warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.');\n          }\n\n          didWarnAboutMaps = true;\n        }\n      }\n\n      var iterator = iteratorFn.call(children);\n      var step;\n      var ii = 0;\n\n      while (!(step = iterator.next()).done) {\n        child = step.value;\n        nextName = nextNamePrefix + getComponentKey(child, ii++);\n        subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n      }\n    } else if (type === 'object') {\n      var addendum = '';\n\n      {\n        addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();\n      }\n\n      var childrenString = '' + children;\n\n      {\n        {\n          throw Error( \"Objects are not valid as a React child (found: \" + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + \").\" + addendum );\n        }\n      }\n    }\n  }\n\n  return subtreeCount;\n}\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildren(children, callback, traverseContext) {\n  if (children == null) {\n    return 0;\n  }\n\n  return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\n\n\nfunction getComponentKey(component, index) {\n  // Do some typechecking here since we call this blindly. We want to ensure\n  // that we don't block potential future ES APIs.\n  if (typeof component === 'object' && component !== null && component.key != null) {\n    // Explicit key\n    return escape(component.key);\n  } // Implicit key determined by the index in the set\n\n\n  return index.toString(36);\n}\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n  var func = bookKeeping.func,\n      context = bookKeeping.context;\n  func.call(context, child, bookKeeping.count++);\n}\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenforeach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\n\n\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n  if (children == null) {\n    return children;\n  }\n\n  var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n  traverseAllChildren(children, forEachSingleChild, traverseContext);\n  releaseTraverseContext(traverseContext);\n}\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n  var result = bookKeeping.result,\n      keyPrefix = bookKeeping.keyPrefix,\n      func = bookKeeping.func,\n      context = bookKeeping.context;\n  var mappedChild = func.call(context, child, bookKeeping.count++);\n\n  if (Array.isArray(mappedChild)) {\n    mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {\n      return c;\n    });\n  } else if (mappedChild != null) {\n    if (isValidElement(mappedChild)) {\n      mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as\n      // traverseAllChildren used to do for objects as children\n      keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n    }\n\n    result.push(mappedChild);\n  }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n  var escapedPrefix = '';\n\n  if (prefix != null) {\n    escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n  }\n\n  var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n  releaseTraverseContext(traverseContext);\n}\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenmap\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\n\n\nfunction mapChildren(children, func, context) {\n  if (children == null) {\n    return children;\n  }\n\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n  return result;\n}\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrencount\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\n\n\nfunction countChildren(children) {\n  return traverseAllChildren(children, function () {\n    return null;\n  }, null);\n}\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrentoarray\n */\n\n\nfunction toArray(children) {\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, function (child) {\n    return child;\n  });\n  return result;\n}\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenonly\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\n\n\nfunction onlyChild(children) {\n  if (!isValidElement(children)) {\n    {\n      throw Error( \"React.Children.only expected to receive a single React element child.\" );\n    }\n  }\n\n  return children;\n}\n\nfunction createContext(defaultValue, calculateChangedBits) {\n  if (calculateChangedBits === undefined) {\n    calculateChangedBits = null;\n  } else {\n    {\n      if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {\n        error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);\n      }\n    }\n  }\n\n  var context = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    _calculateChangedBits: calculateChangedBits,\n    // As a workaround to support multiple concurrent renderers, we categorize\n    // some renderers as primary and others as secondary. We only expect\n    // there to be two concurrent renderers at most: React Native (primary) and\n    // Fabric (secondary); React DOM (primary) and React ART (secondary).\n    // Secondary renderers store their context values on separate fields.\n    _currentValue: defaultValue,\n    _currentValue2: defaultValue,\n    // Used to track how many concurrent renderers this context currently\n    // supports within in a single renderer. Such as parallel server rendering.\n    _threadCount: 0,\n    // These are circular\n    Provider: null,\n    Consumer: null\n  };\n  context.Provider = {\n    $$typeof: REACT_PROVIDER_TYPE,\n    _context: context\n  };\n  var hasWarnedAboutUsingNestedContextConsumers = false;\n  var hasWarnedAboutUsingConsumerProvider = false;\n\n  {\n    // A separate object, but proxies back to the original context object for\n    // backwards compatibility. It has a different $$typeof, so we can properly\n    // warn for the incorrect usage of Context as a Consumer.\n    var Consumer = {\n      $$typeof: REACT_CONTEXT_TYPE,\n      _context: context,\n      _calculateChangedBits: context._calculateChangedBits\n    }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here\n\n    Object.defineProperties(Consumer, {\n      Provider: {\n        get: function () {\n          if (!hasWarnedAboutUsingConsumerProvider) {\n            hasWarnedAboutUsingConsumerProvider = true;\n\n            error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');\n          }\n\n          return context.Provider;\n        },\n        set: function (_Provider) {\n          context.Provider = _Provider;\n        }\n      },\n      _currentValue: {\n        get: function () {\n          return context._currentValue;\n        },\n        set: function (_currentValue) {\n          context._currentValue = _currentValue;\n        }\n      },\n      _currentValue2: {\n        get: function () {\n          return context._currentValue2;\n        },\n        set: function (_currentValue2) {\n          context._currentValue2 = _currentValue2;\n        }\n      },\n      _threadCount: {\n        get: function () {\n          return context._threadCount;\n        },\n        set: function (_threadCount) {\n          context._threadCount = _threadCount;\n        }\n      },\n      Consumer: {\n        get: function () {\n          if (!hasWarnedAboutUsingNestedContextConsumers) {\n            hasWarnedAboutUsingNestedContextConsumers = true;\n\n            error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n          }\n\n          return context.Consumer;\n        }\n      }\n    }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty\n\n    context.Consumer = Consumer;\n  }\n\n  {\n    context._currentRenderer = null;\n    context._currentRenderer2 = null;\n  }\n\n  return context;\n}\n\nfunction lazy(ctor) {\n  var lazyType = {\n    $$typeof: REACT_LAZY_TYPE,\n    _ctor: ctor,\n    // React uses these fields to store the result.\n    _status: -1,\n    _result: null\n  };\n\n  {\n    // In production, this would just set it on the object.\n    var defaultProps;\n    var propTypes;\n    Object.defineProperties(lazyType, {\n      defaultProps: {\n        configurable: true,\n        get: function () {\n          return defaultProps;\n        },\n        set: function (newDefaultProps) {\n          error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n          defaultProps = newDefaultProps; // Match production behavior more closely:\n\n          Object.defineProperty(lazyType, 'defaultProps', {\n            enumerable: true\n          });\n        }\n      },\n      propTypes: {\n        configurable: true,\n        get: function () {\n          return propTypes;\n        },\n        set: function (newPropTypes) {\n          error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n          propTypes = newPropTypes; // Match production behavior more closely:\n\n          Object.defineProperty(lazyType, 'propTypes', {\n            enumerable: true\n          });\n        }\n      }\n    });\n  }\n\n  return lazyType;\n}\n\nfunction forwardRef(render) {\n  {\n    if (render != null && render.$$typeof === REACT_MEMO_TYPE) {\n      error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');\n    } else if (typeof render !== 'function') {\n      error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);\n    } else {\n      if (render.length !== 0 && render.length !== 2) {\n        error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');\n      }\n    }\n\n    if (render != null) {\n      if (render.defaultProps != null || render.propTypes != null) {\n        error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');\n      }\n    }\n  }\n\n  return {\n    $$typeof: REACT_FORWARD_REF_TYPE,\n    render: render\n  };\n}\n\nfunction isValidElementType(type) {\n  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction memo(type, compare) {\n  {\n    if (!isValidElementType(type)) {\n      error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);\n    }\n  }\n\n  return {\n    $$typeof: REACT_MEMO_TYPE,\n    type: type,\n    compare: compare === undefined ? null : compare\n  };\n}\n\nfunction resolveDispatcher() {\n  var dispatcher = ReactCurrentDispatcher.current;\n\n  if (!(dispatcher !== null)) {\n    {\n      throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n    }\n  }\n\n  return dispatcher;\n}\n\nfunction useContext(Context, unstable_observedBits) {\n  var dispatcher = resolveDispatcher();\n\n  {\n    if (unstable_observedBits !== undefined) {\n      error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\\n\\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '');\n    } // TODO: add a more generic warning for invalid values.\n\n\n    if (Context._context !== undefined) {\n      var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs\n      // and nobody should be using this in existing code.\n\n      if (realContext.Consumer === Context) {\n        error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');\n      } else if (realContext.Provider === Context) {\n        error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');\n      }\n    }\n  }\n\n  return dispatcher.useContext(Context, unstable_observedBits);\n}\nfunction useState(initialState) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useState(initialState);\n}\nfunction useReducer(reducer, initialArg, init) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useReducer(reducer, initialArg, init);\n}\nfunction useRef(initialValue) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useRef(initialValue);\n}\nfunction useEffect(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useEffect(create, deps);\n}\nfunction useLayoutEffect(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useLayoutEffect(create, deps);\n}\nfunction useCallback(callback, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useCallback(callback, deps);\n}\nfunction useMemo(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useMemo(create, deps);\n}\nfunction useImperativeHandle(ref, create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useImperativeHandle(ref, create, deps);\n}\nfunction useDebugValue(value, formatterFn) {\n  {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useDebugValue(value, formatterFn);\n  }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n  propTypesMisspellWarningShown = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n  if (ReactCurrentOwner.current) {\n    var name = getComponentName(ReactCurrentOwner.current.type);\n\n    if (name) {\n      return '\\n\\nCheck the render method of `' + name + '`.';\n    }\n  }\n\n  return '';\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n  if (source !== undefined) {\n    var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n    var lineNumber = source.lineNumber;\n    return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n  }\n\n  return '';\n}\n\nfunction getSourceInfoErrorAddendumForProps(elementProps) {\n  if (elementProps !== null && elementProps !== undefined) {\n    return getSourceInfoErrorAddendum(elementProps.__source);\n  }\n\n  return '';\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n  var info = getDeclarationErrorAddendum();\n\n  if (!info) {\n    var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n    if (parentName) {\n      info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n    }\n  }\n\n  return info;\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n  if (!element._store || element._store.validated || element.key != null) {\n    return;\n  }\n\n  element._store.validated = true;\n  var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n  if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n    return;\n  }\n\n  ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n  // property, it may be the creator of the child that's responsible for\n  // assigning it a key.\n\n  var childOwner = '';\n\n  if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n    // Give the component that originally created this child.\n    childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n  }\n\n  setCurrentlyValidatingElement(element);\n\n  {\n    error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);\n  }\n\n  setCurrentlyValidatingElement(null);\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n  if (typeof node !== 'object') {\n    return;\n  }\n\n  if (Array.isArray(node)) {\n    for (var i = 0; i < node.length; i++) {\n      var child = node[i];\n\n      if (isValidElement(child)) {\n        validateExplicitKey(child, parentType);\n      }\n    }\n  } else if (isValidElement(node)) {\n    // This element was passed in a valid location.\n    if (node._store) {\n      node._store.validated = true;\n    }\n  } else if (node) {\n    var iteratorFn = getIteratorFn(node);\n\n    if (typeof iteratorFn === 'function') {\n      // Entry iterators used to provide implicit keys,\n      // but now we print a separate warning for them later.\n      if (iteratorFn !== node.entries) {\n        var iterator = iteratorFn.call(node);\n        var step;\n\n        while (!(step = iterator.next()).done) {\n          if (isValidElement(step.value)) {\n            validateExplicitKey(step.value, parentType);\n          }\n        }\n      }\n    }\n  }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n  {\n    var type = element.type;\n\n    if (type === null || type === undefined || typeof type === 'string') {\n      return;\n    }\n\n    var name = getComponentName(type);\n    var propTypes;\n\n    if (typeof type === 'function') {\n      propTypes = type.propTypes;\n    } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n    // Inner props are checked in the reconciler.\n    type.$$typeof === REACT_MEMO_TYPE)) {\n      propTypes = type.propTypes;\n    } else {\n      return;\n    }\n\n    if (propTypes) {\n      setCurrentlyValidatingElement(element);\n      checkPropTypes(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);\n      setCurrentlyValidatingElement(null);\n    } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n      propTypesMisspellWarningShown = true;\n\n      error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');\n    }\n\n    if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n    }\n  }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n  {\n    setCurrentlyValidatingElement(fragment);\n    var keys = Object.keys(fragment.props);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n\n      if (key !== 'children' && key !== 'key') {\n        error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n        break;\n      }\n    }\n\n    if (fragment.ref !== null) {\n      error('Invalid attribute `ref` supplied to `React.Fragment`.');\n    }\n\n    setCurrentlyValidatingElement(null);\n  }\n}\nfunction createElementWithValidation(type, props, children) {\n  var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n  // succeed and there will likely be errors in render.\n\n  if (!validType) {\n    var info = '';\n\n    if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n      info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n    }\n\n    var sourceInfo = getSourceInfoErrorAddendumForProps(props);\n\n    if (sourceInfo) {\n      info += sourceInfo;\n    } else {\n      info += getDeclarationErrorAddendum();\n    }\n\n    var typeString;\n\n    if (type === null) {\n      typeString = 'null';\n    } else if (Array.isArray(type)) {\n      typeString = 'array';\n    } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n      typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n      info = ' Did you accidentally export a JSX literal instead of a component?';\n    } else {\n      typeString = typeof type;\n    }\n\n    {\n      error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n    }\n  }\n\n  var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.\n  // TODO: Drop this when these are no longer allowed as the type argument.\n\n  if (element == null) {\n    return element;\n  } // Skip key warning if the type isn't valid since our key validation logic\n  // doesn't expect a non-string/function type and can throw confusing errors.\n  // We don't want exception behavior to differ between dev and prod.\n  // (Rendering will throw with a helpful message and as soon as the type is\n  // fixed, the key warnings will appear.)\n\n\n  if (validType) {\n    for (var i = 2; i < arguments.length; i++) {\n      validateChildKeys(arguments[i], type);\n    }\n  }\n\n  if (type === REACT_FRAGMENT_TYPE) {\n    validateFragmentProps(element);\n  } else {\n    validatePropTypes(element);\n  }\n\n  return element;\n}\nvar didWarnAboutDeprecatedCreateFactory = false;\nfunction createFactoryWithValidation(type) {\n  var validatedFactory = createElementWithValidation.bind(null, type);\n  validatedFactory.type = type;\n\n  {\n    if (!didWarnAboutDeprecatedCreateFactory) {\n      didWarnAboutDeprecatedCreateFactory = true;\n\n      warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');\n    } // Legacy hook: remove it\n\n\n    Object.defineProperty(validatedFactory, 'type', {\n      enumerable: false,\n      get: function () {\n        warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n\n        Object.defineProperty(this, 'type', {\n          value: type\n        });\n        return type;\n      }\n    });\n  }\n\n  return validatedFactory;\n}\nfunction cloneElementWithValidation(element, props, children) {\n  var newElement = cloneElement.apply(this, arguments);\n\n  for (var i = 2; i < arguments.length; i++) {\n    validateChildKeys(arguments[i], newElement.type);\n  }\n\n  validatePropTypes(newElement);\n  return newElement;\n}\n\n{\n\n  try {\n    var frozenObject = Object.freeze({});\n    var testMap = new Map([[frozenObject, null]]);\n    var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.\n    // https://github.com/rollup/rollup/issues/1771\n    // TODO: we can remove these if Rollup fixes the bug.\n\n    testMap.set(0, 0);\n    testSet.add(0);\n  } catch (e) {\n  }\n}\n\nvar createElement$1 =  createElementWithValidation ;\nvar cloneElement$1 =  cloneElementWithValidation ;\nvar createFactory =  createFactoryWithValidation ;\nvar Children = {\n  map: mapChildren,\n  forEach: forEachChildren,\n  count: countChildren,\n  toArray: toArray,\n  only: onlyChild\n};\n\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;\nexports.cloneElement = cloneElement$1;\nexports.createContext = createContext;\nexports.createElement = createElement$1;\nexports.createFactory = createFactory;\nexports.createRef = createRef;\nexports.forwardRef = forwardRef;\nexports.isValidElement = isValidElement;\nexports.lazy = lazy;\nexports.memo = memo;\nexports.useCallback = useCallback;\nexports.useContext = useContext;\nexports.useDebugValue = useDebugValue;\nexports.useEffect = useEffect;\nexports.useImperativeHandle = useImperativeHandle;\nexports.useLayoutEffect = useLayoutEffect;\nexports.useMemo = useMemo;\nexports.useReducer = useReducer;\nexports.useRef = useRef;\nexports.useState = useState;\nexports.version = ReactVersion;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react/cjs/react.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react/index.js":
-/*!*************************************************!*\
-  !*** ./jaas-client/node_modules/react/index.js ***!
-  \*************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react.development.js */ \"./jaas-client/node_modules/react/cjs/react.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nfunction isAbsolute(pathname) {\n  return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n    list[i] = list[k];\n  }\n\n  list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n  if (from === undefined) from = '';\n\n  var toParts = (to && to.split('/')) || [];\n  var fromParts = (from && from.split('/')) || [];\n\n  var isToAbs = to && isAbsolute(to);\n  var isFromAbs = from && isAbsolute(from);\n  var mustEndAbs = isToAbs || isFromAbs;\n\n  if (to && isAbsolute(to)) {\n    // to is absolute\n    fromParts = toParts;\n  } else if (toParts.length) {\n    // to is relative, drop the filename\n    fromParts.pop();\n    fromParts = fromParts.concat(toParts);\n  }\n\n  if (!fromParts.length) return '/';\n\n  var hasTrailingSlash;\n  if (fromParts.length) {\n    var last = fromParts[fromParts.length - 1];\n    hasTrailingSlash = last === '.' || last === '..' || last === '';\n  } else {\n    hasTrailingSlash = false;\n  }\n\n  var up = 0;\n  for (var i = fromParts.length; i >= 0; i--) {\n    var part = fromParts[i];\n\n    if (part === '.') {\n      spliceOne(fromParts, i);\n    } else if (part === '..') {\n      spliceOne(fromParts, i);\n      up++;\n    } else if (up) {\n      spliceOne(fromParts, i);\n      up--;\n    }\n  }\n\n  if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n  if (\n    mustEndAbs &&\n    fromParts[0] !== '' &&\n    (!fromParts[0] || !isAbsolute(fromParts[0]))\n  )\n    fromParts.unshift('');\n\n  var result = fromParts.join('/');\n\n  if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n  return result;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (resolvePathname);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js ***!
-  \*********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v0.19.1\n * scheduler-tracing.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.\n\nvar interactionIDCounter = 0;\nvar threadIDCounter = 0; // Set of currently traced interactions.\n// Interactions \"stack\"–\n// Meaning that newly traced interactions are appended to the previously active set.\n// When an interaction goes out of scope, the previous set (if any) is restored.\n\nexports.__interactionsRef = null; // Listener(s) to notify when interactions begin and end.\n\nexports.__subscriberRef = null;\n\n{\n  exports.__interactionsRef = {\n    current: new Set()\n  };\n  exports.__subscriberRef = {\n    current: null\n  };\n}\nfunction unstable_clear(callback) {\n\n  var prevInteractions = exports.__interactionsRef.current;\n  exports.__interactionsRef.current = new Set();\n\n  try {\n    return callback();\n  } finally {\n    exports.__interactionsRef.current = prevInteractions;\n  }\n}\nfunction unstable_getCurrent() {\n  {\n    return exports.__interactionsRef.current;\n  }\n}\nfunction unstable_getThreadID() {\n  return ++threadIDCounter;\n}\nfunction unstable_trace(name, timestamp, callback) {\n  var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;\n\n  var interaction = {\n    __count: 1,\n    id: interactionIDCounter++,\n    name: name,\n    timestamp: timestamp\n  };\n  var prevInteractions = exports.__interactionsRef.current; // Traced interactions should stack/accumulate.\n  // To do that, clone the current interactions.\n  // The previous set will be restored upon completion.\n\n  var interactions = new Set(prevInteractions);\n  interactions.add(interaction);\n  exports.__interactionsRef.current = interactions;\n  var subscriber = exports.__subscriberRef.current;\n  var returnValue;\n\n  try {\n    if (subscriber !== null) {\n      subscriber.onInteractionTraced(interaction);\n    }\n  } finally {\n    try {\n      if (subscriber !== null) {\n        subscriber.onWorkStarted(interactions, threadID);\n      }\n    } finally {\n      try {\n        returnValue = callback();\n      } finally {\n        exports.__interactionsRef.current = prevInteractions;\n\n        try {\n          if (subscriber !== null) {\n            subscriber.onWorkStopped(interactions, threadID);\n          }\n        } finally {\n          interaction.__count--; // If no async work was scheduled for this interaction,\n          // Notify subscribers that it's completed.\n\n          if (subscriber !== null && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        }\n      }\n    }\n  }\n\n  return returnValue;\n}\nfunction unstable_wrap(callback) {\n  var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;\n\n  var wrappedInteractions = exports.__interactionsRef.current;\n  var subscriber = exports.__subscriberRef.current;\n\n  if (subscriber !== null) {\n    subscriber.onWorkScheduled(wrappedInteractions, threadID);\n  } // Update the pending async work count for the current interactions.\n  // Update after calling subscribers in case of error.\n\n\n  wrappedInteractions.forEach(function (interaction) {\n    interaction.__count++;\n  });\n  var hasRun = false;\n\n  function wrapped() {\n    var prevInteractions = exports.__interactionsRef.current;\n    exports.__interactionsRef.current = wrappedInteractions;\n    subscriber = exports.__subscriberRef.current;\n\n    try {\n      var returnValue;\n\n      try {\n        if (subscriber !== null) {\n          subscriber.onWorkStarted(wrappedInteractions, threadID);\n        }\n      } finally {\n        try {\n          returnValue = callback.apply(undefined, arguments);\n        } finally {\n          exports.__interactionsRef.current = prevInteractions;\n\n          if (subscriber !== null) {\n            subscriber.onWorkStopped(wrappedInteractions, threadID);\n          }\n        }\n      }\n\n      return returnValue;\n    } finally {\n      if (!hasRun) {\n        // We only expect a wrapped function to be executed once,\n        // But in the event that it's executed more than once–\n        // Only decrement the outstanding interaction counts once.\n        hasRun = true; // Update pending async counts for all wrapped interactions.\n        // If this was the last scheduled async work for any of them,\n        // Mark them as completed.\n\n        wrappedInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber !== null && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        });\n      }\n    }\n  }\n\n  wrapped.cancel = function cancel() {\n    subscriber = exports.__subscriberRef.current;\n\n    try {\n      if (subscriber !== null) {\n        subscriber.onWorkCanceled(wrappedInteractions, threadID);\n      }\n    } finally {\n      // Update pending async counts for all wrapped interactions.\n      // If this was the last scheduled async work for any of them,\n      // Mark them as completed.\n      wrappedInteractions.forEach(function (interaction) {\n        interaction.__count--;\n\n        if (subscriber && interaction.__count === 0) {\n          subscriber.onInteractionScheduledWorkCompleted(interaction);\n        }\n      });\n    }\n  };\n\n  return wrapped;\n}\n\nvar subscribers = null;\n\n{\n  subscribers = new Set();\n}\n\nfunction unstable_subscribe(subscriber) {\n  {\n    subscribers.add(subscriber);\n\n    if (subscribers.size === 1) {\n      exports.__subscriberRef.current = {\n        onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,\n        onInteractionTraced: onInteractionTraced,\n        onWorkCanceled: onWorkCanceled,\n        onWorkScheduled: onWorkScheduled,\n        onWorkStarted: onWorkStarted,\n        onWorkStopped: onWorkStopped\n      };\n    }\n  }\n}\nfunction unstable_unsubscribe(subscriber) {\n  {\n    subscribers.delete(subscriber);\n\n    if (subscribers.size === 0) {\n      exports.__subscriberRef.current = null;\n    }\n  }\n}\n\nfunction onInteractionTraced(interaction) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onInteractionTraced(interaction);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onInteractionScheduledWorkCompleted(interaction) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onInteractionScheduledWorkCompleted(interaction);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkScheduled(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkScheduled(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkStarted(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkStarted(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkStopped(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkStopped(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkCanceled(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkCanceled(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nexports.unstable_clear = unstable_clear;\nexports.unstable_getCurrent = unstable_getCurrent;\nexports.unstable_getThreadID = unstable_getThreadID;\nexports.unstable_subscribe = unstable_subscribe;\nexports.unstable_trace = unstable_trace;\nexports.unstable_unsubscribe = unstable_unsubscribe;\nexports.unstable_wrap = unstable_wrap;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/cjs/scheduler.development.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/cjs/scheduler.development.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v0.19.1\n * scheduler.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar enableSchedulerDebugging = false;\nvar enableProfiling = true;\n\nvar requestHostCallback;\nvar requestHostTimeout;\nvar cancelHostTimeout;\nvar shouldYieldToHost;\nvar requestPaint;\n\nif ( // If Scheduler runs in a non-DOM environment, it falls back to a naive\n// implementation using setTimeout.\ntypeof window === 'undefined' || // Check if MessageChannel is supported, too.\ntypeof MessageChannel !== 'function') {\n  // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,\n  // fallback to a naive implementation.\n  var _callback = null;\n  var _timeoutID = null;\n\n  var _flushCallback = function () {\n    if (_callback !== null) {\n      try {\n        var currentTime = exports.unstable_now();\n        var hasRemainingTime = true;\n\n        _callback(hasRemainingTime, currentTime);\n\n        _callback = null;\n      } catch (e) {\n        setTimeout(_flushCallback, 0);\n        throw e;\n      }\n    }\n  };\n\n  var initialTime = Date.now();\n\n  exports.unstable_now = function () {\n    return Date.now() - initialTime;\n  };\n\n  requestHostCallback = function (cb) {\n    if (_callback !== null) {\n      // Protect against re-entrancy.\n      setTimeout(requestHostCallback, 0, cb);\n    } else {\n      _callback = cb;\n      setTimeout(_flushCallback, 0);\n    }\n  };\n\n  requestHostTimeout = function (cb, ms) {\n    _timeoutID = setTimeout(cb, ms);\n  };\n\n  cancelHostTimeout = function () {\n    clearTimeout(_timeoutID);\n  };\n\n  shouldYieldToHost = function () {\n    return false;\n  };\n\n  requestPaint = exports.unstable_forceFrameRate = function () {};\n} else {\n  // Capture local references to native APIs, in case a polyfill overrides them.\n  var performance = window.performance;\n  var _Date = window.Date;\n  var _setTimeout = window.setTimeout;\n  var _clearTimeout = window.clearTimeout;\n\n  if (typeof console !== 'undefined') {\n    // TODO: Scheduler no longer requires these methods to be polyfilled. But\n    // maybe we want to continue warning if they don't exist, to preserve the\n    // option to rely on it in the future?\n    var requestAnimationFrame = window.requestAnimationFrame;\n    var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link\n\n    if (typeof requestAnimationFrame !== 'function') {\n      // Using console['error'] to evade Babel and ESLint\n      console['error'](\"This browser doesn't support requestAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n\n    if (typeof cancelAnimationFrame !== 'function') {\n      // Using console['error'] to evade Babel and ESLint\n      console['error'](\"This browser doesn't support cancelAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n  }\n\n  if (typeof performance === 'object' && typeof performance.now === 'function') {\n    exports.unstable_now = function () {\n      return performance.now();\n    };\n  } else {\n    var _initialTime = _Date.now();\n\n    exports.unstable_now = function () {\n      return _Date.now() - _initialTime;\n    };\n  }\n\n  var isMessageLoopRunning = false;\n  var scheduledHostCallback = null;\n  var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main\n  // thread, like user events. By default, it yields multiple times per frame.\n  // It does not attempt to align with frame boundaries, since most tasks don't\n  // need to be frame aligned; for those that do, use requestAnimationFrame.\n\n  var yieldInterval = 5;\n  var deadline = 0; // TODO: Make this configurable\n\n  {\n    // `isInputPending` is not available. Since we have no way of knowing if\n    // there's pending input, always yield at the end of the frame.\n    shouldYieldToHost = function () {\n      return exports.unstable_now() >= deadline;\n    }; // Since we yield every frame regardless, `requestPaint` has no effect.\n\n\n    requestPaint = function () {};\n  }\n\n  exports.unstable_forceFrameRate = function (fps) {\n    if (fps < 0 || fps > 125) {\n      // Using console['error'] to evade Babel and ESLint\n      console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported');\n      return;\n    }\n\n    if (fps > 0) {\n      yieldInterval = Math.floor(1000 / fps);\n    } else {\n      // reset the framerate\n      yieldInterval = 5;\n    }\n  };\n\n  var performWorkUntilDeadline = function () {\n    if (scheduledHostCallback !== null) {\n      var currentTime = exports.unstable_now(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync\n      // cycle. This means there's always time remaining at the beginning of\n      // the message event.\n\n      deadline = currentTime + yieldInterval;\n      var hasTimeRemaining = true;\n\n      try {\n        var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);\n\n        if (!hasMoreWork) {\n          isMessageLoopRunning = false;\n          scheduledHostCallback = null;\n        } else {\n          // If there's more work, schedule the next message event at the end\n          // of the preceding one.\n          port.postMessage(null);\n        }\n      } catch (error) {\n        // If a scheduler task throws, exit the current browser task so the\n        // error can be observed.\n        port.postMessage(null);\n        throw error;\n      }\n    } else {\n      isMessageLoopRunning = false;\n    } // Yielding to the browser will give it a chance to paint, so we can\n  };\n\n  var channel = new MessageChannel();\n  var port = channel.port2;\n  channel.port1.onmessage = performWorkUntilDeadline;\n\n  requestHostCallback = function (callback) {\n    scheduledHostCallback = callback;\n\n    if (!isMessageLoopRunning) {\n      isMessageLoopRunning = true;\n      port.postMessage(null);\n    }\n  };\n\n  requestHostTimeout = function (callback, ms) {\n    taskTimeoutID = _setTimeout(function () {\n      callback(exports.unstable_now());\n    }, ms);\n  };\n\n  cancelHostTimeout = function () {\n    _clearTimeout(taskTimeoutID);\n\n    taskTimeoutID = -1;\n  };\n}\n\nfunction push(heap, node) {\n  var index = heap.length;\n  heap.push(node);\n  siftUp(heap, node, index);\n}\nfunction peek(heap) {\n  var first = heap[0];\n  return first === undefined ? null : first;\n}\nfunction pop(heap) {\n  var first = heap[0];\n\n  if (first !== undefined) {\n    var last = heap.pop();\n\n    if (last !== first) {\n      heap[0] = last;\n      siftDown(heap, last, 0);\n    }\n\n    return first;\n  } else {\n    return null;\n  }\n}\n\nfunction siftUp(heap, node, i) {\n  var index = i;\n\n  while (true) {\n    var parentIndex = index - 1 >>> 1;\n    var parent = heap[parentIndex];\n\n    if (parent !== undefined && compare(parent, node) > 0) {\n      // The parent is larger. Swap positions.\n      heap[parentIndex] = node;\n      heap[index] = parent;\n      index = parentIndex;\n    } else {\n      // The parent is smaller. Exit.\n      return;\n    }\n  }\n}\n\nfunction siftDown(heap, node, i) {\n  var index = i;\n  var length = heap.length;\n\n  while (index < length) {\n    var leftIndex = (index + 1) * 2 - 1;\n    var left = heap[leftIndex];\n    var rightIndex = leftIndex + 1;\n    var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.\n\n    if (left !== undefined && compare(left, node) < 0) {\n      if (right !== undefined && compare(right, left) < 0) {\n        heap[index] = right;\n        heap[rightIndex] = node;\n        index = rightIndex;\n      } else {\n        heap[index] = left;\n        heap[leftIndex] = node;\n        index = leftIndex;\n      }\n    } else if (right !== undefined && compare(right, node) < 0) {\n      heap[index] = right;\n      heap[rightIndex] = node;\n      index = rightIndex;\n    } else {\n      // Neither child is smaller. Exit.\n      return;\n    }\n  }\n}\n\nfunction compare(a, b) {\n  // Compare sort index first, then task id.\n  var diff = a.sortIndex - b.sortIndex;\n  return diff !== 0 ? diff : a.id - b.id;\n}\n\n// TODO: Use symbols?\nvar NoPriority = 0;\nvar ImmediatePriority = 1;\nvar UserBlockingPriority = 2;\nvar NormalPriority = 3;\nvar LowPriority = 4;\nvar IdlePriority = 5;\n\nvar runIdCounter = 0;\nvar mainThreadIdCounter = 0;\nvar profilingStateSize = 4;\nvar sharedProfilingBuffer =  // $FlowFixMe Flow doesn't know about SharedArrayBuffer\ntypeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer\ntypeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9\n;\nvar profilingState =  sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks\n\nvar PRIORITY = 0;\nvar CURRENT_TASK_ID = 1;\nvar CURRENT_RUN_ID = 2;\nvar QUEUE_SIZE = 3;\n\n{\n  profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue\n  // array might include canceled tasks.\n\n  profilingState[QUEUE_SIZE] = 0;\n  profilingState[CURRENT_TASK_ID] = 0;\n} // Bytes per element is 4\n\n\nvar INITIAL_EVENT_LOG_SIZE = 131072;\nvar MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes\n\nvar eventLogSize = 0;\nvar eventLogBuffer = null;\nvar eventLog = null;\nvar eventLogIndex = 0;\nvar TaskStartEvent = 1;\nvar TaskCompleteEvent = 2;\nvar TaskErrorEvent = 3;\nvar TaskCancelEvent = 4;\nvar TaskRunEvent = 5;\nvar TaskYieldEvent = 6;\nvar SchedulerSuspendEvent = 7;\nvar SchedulerResumeEvent = 8;\n\nfunction logEvent(entries) {\n  if (eventLog !== null) {\n    var offset = eventLogIndex;\n    eventLogIndex += entries.length;\n\n    if (eventLogIndex + 1 > eventLogSize) {\n      eventLogSize *= 2;\n\n      if (eventLogSize > MAX_EVENT_LOG_SIZE) {\n        // Using console['error'] to evade Babel and ESLint\n        console['error'](\"Scheduler Profiling: Event log exceeded maximum size. Don't \" + 'forget to call `stopLoggingProfilingEvents()`.');\n        stopLoggingProfilingEvents();\n        return;\n      }\n\n      var newEventLog = new Int32Array(eventLogSize * 4);\n      newEventLog.set(eventLog);\n      eventLogBuffer = newEventLog.buffer;\n      eventLog = newEventLog;\n    }\n\n    eventLog.set(entries, offset);\n  }\n}\n\nfunction startLoggingProfilingEvents() {\n  eventLogSize = INITIAL_EVENT_LOG_SIZE;\n  eventLogBuffer = new ArrayBuffer(eventLogSize * 4);\n  eventLog = new Int32Array(eventLogBuffer);\n  eventLogIndex = 0;\n}\nfunction stopLoggingProfilingEvents() {\n  var buffer = eventLogBuffer;\n  eventLogSize = 0;\n  eventLogBuffer = null;\n  eventLog = null;\n  eventLogIndex = 0;\n  return buffer;\n}\nfunction markTaskStart(task, ms) {\n  {\n    profilingState[QUEUE_SIZE]++;\n\n    if (eventLog !== null) {\n      // performance.now returns a float, representing milliseconds. When the\n      // event is logged, it's coerced to an int. Convert to microseconds to\n      // maintain extra degrees of precision.\n      logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);\n    }\n  }\n}\nfunction markTaskCompleted(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskCompleteEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskCanceled(task, ms) {\n  {\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskCancelEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskErrored(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskErrorEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskRun(task, ms) {\n  {\n    runIdCounter++;\n    profilingState[PRIORITY] = task.priorityLevel;\n    profilingState[CURRENT_TASK_ID] = task.id;\n    profilingState[CURRENT_RUN_ID] = runIdCounter;\n\n    if (eventLog !== null) {\n      logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);\n    }\n  }\n}\nfunction markTaskYield(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[CURRENT_RUN_ID] = 0;\n\n    if (eventLog !== null) {\n      logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);\n    }\n  }\n}\nfunction markSchedulerSuspended(ms) {\n  {\n    mainThreadIdCounter++;\n\n    if (eventLog !== null) {\n      logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);\n    }\n  }\n}\nfunction markSchedulerUnsuspended(ms) {\n  {\n    if (eventLog !== null) {\n      logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);\n    }\n  }\n}\n\n/* eslint-disable no-var */\n// Math.pow(2, 30) - 1\n// 0b111111111111111111111111111111\n\nvar maxSigned31BitInt = 1073741823; // Times out immediately\n\nvar IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out\n\nvar USER_BLOCKING_PRIORITY = 250;\nvar NORMAL_PRIORITY_TIMEOUT = 5000;\nvar LOW_PRIORITY_TIMEOUT = 10000; // Never times out\n\nvar IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap\n\nvar taskQueue = [];\nvar timerQueue = []; // Incrementing id counter. Used to maintain insertion order.\n\nvar taskIdCounter = 1; // Pausing the scheduler is useful for debugging.\nvar currentTask = null;\nvar currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.\n\nvar isPerformingWork = false;\nvar isHostCallbackScheduled = false;\nvar isHostTimeoutScheduled = false;\n\nfunction advanceTimers(currentTime) {\n  // Check for tasks that are no longer delayed and add them to the queue.\n  var timer = peek(timerQueue);\n\n  while (timer !== null) {\n    if (timer.callback === null) {\n      // Timer was cancelled.\n      pop(timerQueue);\n    } else if (timer.startTime <= currentTime) {\n      // Timer fired. Transfer to the task queue.\n      pop(timerQueue);\n      timer.sortIndex = timer.expirationTime;\n      push(taskQueue, timer);\n\n      {\n        markTaskStart(timer, currentTime);\n        timer.isQueued = true;\n      }\n    } else {\n      // Remaining timers are pending.\n      return;\n    }\n\n    timer = peek(timerQueue);\n  }\n}\n\nfunction handleTimeout(currentTime) {\n  isHostTimeoutScheduled = false;\n  advanceTimers(currentTime);\n\n  if (!isHostCallbackScheduled) {\n    if (peek(taskQueue) !== null) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    } else {\n      var firstTimer = peek(timerQueue);\n\n      if (firstTimer !== null) {\n        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n      }\n    }\n  }\n}\n\nfunction flushWork(hasTimeRemaining, initialTime) {\n  {\n    markSchedulerUnsuspended(initialTime);\n  } // We'll need a host callback the next time work is scheduled.\n\n\n  isHostCallbackScheduled = false;\n\n  if (isHostTimeoutScheduled) {\n    // We scheduled a timeout but it's no longer needed. Cancel it.\n    isHostTimeoutScheduled = false;\n    cancelHostTimeout();\n  }\n\n  isPerformingWork = true;\n  var previousPriorityLevel = currentPriorityLevel;\n\n  try {\n    if (enableProfiling) {\n      try {\n        return workLoop(hasTimeRemaining, initialTime);\n      } catch (error) {\n        if (currentTask !== null) {\n          var currentTime = exports.unstable_now();\n          markTaskErrored(currentTask, currentTime);\n          currentTask.isQueued = false;\n        }\n\n        throw error;\n      }\n    } else {\n      // No catch in prod codepath.\n      return workLoop(hasTimeRemaining, initialTime);\n    }\n  } finally {\n    currentTask = null;\n    currentPriorityLevel = previousPriorityLevel;\n    isPerformingWork = false;\n\n    {\n      var _currentTime = exports.unstable_now();\n\n      markSchedulerSuspended(_currentTime);\n    }\n  }\n}\n\nfunction workLoop(hasTimeRemaining, initialTime) {\n  var currentTime = initialTime;\n  advanceTimers(currentTime);\n  currentTask = peek(taskQueue);\n\n  while (currentTask !== null && !(enableSchedulerDebugging )) {\n    if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n      // This currentTask hasn't expired, and we've reached the deadline.\n      break;\n    }\n\n    var callback = currentTask.callback;\n\n    if (callback !== null) {\n      currentTask.callback = null;\n      currentPriorityLevel = currentTask.priorityLevel;\n      var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n      markTaskRun(currentTask, currentTime);\n      var continuationCallback = callback(didUserCallbackTimeout);\n      currentTime = exports.unstable_now();\n\n      if (typeof continuationCallback === 'function') {\n        currentTask.callback = continuationCallback;\n        markTaskYield(currentTask, currentTime);\n      } else {\n        {\n          markTaskCompleted(currentTask, currentTime);\n          currentTask.isQueued = false;\n        }\n\n        if (currentTask === peek(taskQueue)) {\n          pop(taskQueue);\n        }\n      }\n\n      advanceTimers(currentTime);\n    } else {\n      pop(taskQueue);\n    }\n\n    currentTask = peek(taskQueue);\n  } // Return whether there's additional work\n\n\n  if (currentTask !== null) {\n    return true;\n  } else {\n    var firstTimer = peek(timerQueue);\n\n    if (firstTimer !== null) {\n      requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n    }\n\n    return false;\n  }\n}\n\nfunction unstable_runWithPriority(priorityLevel, eventHandler) {\n  switch (priorityLevel) {\n    case ImmediatePriority:\n    case UserBlockingPriority:\n    case NormalPriority:\n    case LowPriority:\n    case IdlePriority:\n      break;\n\n    default:\n      priorityLevel = NormalPriority;\n  }\n\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n}\n\nfunction unstable_next(eventHandler) {\n  var priorityLevel;\n\n  switch (currentPriorityLevel) {\n    case ImmediatePriority:\n    case UserBlockingPriority:\n    case NormalPriority:\n      // Shift down to normal priority\n      priorityLevel = NormalPriority;\n      break;\n\n    default:\n      // Anything lower than normal priority should remain at the current level.\n      priorityLevel = currentPriorityLevel;\n      break;\n  }\n\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n}\n\nfunction unstable_wrapCallback(callback) {\n  var parentPriorityLevel = currentPriorityLevel;\n  return function () {\n    // This is a fork of runWithPriority, inlined for performance.\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = parentPriorityLevel;\n\n    try {\n      return callback.apply(this, arguments);\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  };\n}\n\nfunction timeoutForPriorityLevel(priorityLevel) {\n  switch (priorityLevel) {\n    case ImmediatePriority:\n      return IMMEDIATE_PRIORITY_TIMEOUT;\n\n    case UserBlockingPriority:\n      return USER_BLOCKING_PRIORITY;\n\n    case IdlePriority:\n      return IDLE_PRIORITY;\n\n    case LowPriority:\n      return LOW_PRIORITY_TIMEOUT;\n\n    case NormalPriority:\n    default:\n      return NORMAL_PRIORITY_TIMEOUT;\n  }\n}\n\nfunction unstable_scheduleCallback(priorityLevel, callback, options) {\n  var currentTime = exports.unstable_now();\n  var startTime;\n  var timeout;\n\n  if (typeof options === 'object' && options !== null) {\n    var delay = options.delay;\n\n    if (typeof delay === 'number' && delay > 0) {\n      startTime = currentTime + delay;\n    } else {\n      startTime = currentTime;\n    }\n\n    timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);\n  } else {\n    timeout = timeoutForPriorityLevel(priorityLevel);\n    startTime = currentTime;\n  }\n\n  var expirationTime = startTime + timeout;\n  var newTask = {\n    id: taskIdCounter++,\n    callback: callback,\n    priorityLevel: priorityLevel,\n    startTime: startTime,\n    expirationTime: expirationTime,\n    sortIndex: -1\n  };\n\n  {\n    newTask.isQueued = false;\n  }\n\n  if (startTime > currentTime) {\n    // This is a delayed task.\n    newTask.sortIndex = startTime;\n    push(timerQueue, newTask);\n\n    if (peek(taskQueue) === null && newTask === peek(timerQueue)) {\n      // All tasks are delayed, and this is the task with the earliest delay.\n      if (isHostTimeoutScheduled) {\n        // Cancel an existing timeout.\n        cancelHostTimeout();\n      } else {\n        isHostTimeoutScheduled = true;\n      } // Schedule a timeout.\n\n\n      requestHostTimeout(handleTimeout, startTime - currentTime);\n    }\n  } else {\n    newTask.sortIndex = expirationTime;\n    push(taskQueue, newTask);\n\n    {\n      markTaskStart(newTask, currentTime);\n      newTask.isQueued = true;\n    } // Schedule a host callback, if needed. If we're already performing work,\n    // wait until the next time we yield.\n\n\n    if (!isHostCallbackScheduled && !isPerformingWork) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    }\n  }\n\n  return newTask;\n}\n\nfunction unstable_pauseExecution() {\n}\n\nfunction unstable_continueExecution() {\n\n  if (!isHostCallbackScheduled && !isPerformingWork) {\n    isHostCallbackScheduled = true;\n    requestHostCallback(flushWork);\n  }\n}\n\nfunction unstable_getFirstCallbackNode() {\n  return peek(taskQueue);\n}\n\nfunction unstable_cancelCallback(task) {\n  {\n    if (task.isQueued) {\n      var currentTime = exports.unstable_now();\n      markTaskCanceled(task, currentTime);\n      task.isQueued = false;\n    }\n  } // Null out the callback to indicate the task has been canceled. (Can't\n  // remove from the queue because you can't remove arbitrary nodes from an\n  // array based heap, only the first one.)\n\n\n  task.callback = null;\n}\n\nfunction unstable_getCurrentPriorityLevel() {\n  return currentPriorityLevel;\n}\n\nfunction unstable_shouldYield() {\n  var currentTime = exports.unstable_now();\n  advanceTimers(currentTime);\n  var firstTask = peek(taskQueue);\n  return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();\n}\n\nvar unstable_requestPaint = requestPaint;\nvar unstable_Profiling =  {\n  startLoggingProfilingEvents: startLoggingProfilingEvents,\n  stopLoggingProfilingEvents: stopLoggingProfilingEvents,\n  sharedProfilingBuffer: sharedProfilingBuffer\n} ;\n\nexports.unstable_IdlePriority = IdlePriority;\nexports.unstable_ImmediatePriority = ImmediatePriority;\nexports.unstable_LowPriority = LowPriority;\nexports.unstable_NormalPriority = NormalPriority;\nexports.unstable_Profiling = unstable_Profiling;\nexports.unstable_UserBlockingPriority = UserBlockingPriority;\nexports.unstable_cancelCallback = unstable_cancelCallback;\nexports.unstable_continueExecution = unstable_continueExecution;\nexports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;\nexports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;\nexports.unstable_next = unstable_next;\nexports.unstable_pauseExecution = unstable_pauseExecution;\nexports.unstable_requestPaint = unstable_requestPaint;\nexports.unstable_runWithPriority = unstable_runWithPriority;\nexports.unstable_scheduleCallback = unstable_scheduleCallback;\nexports.unstable_shouldYield = unstable_shouldYield;\nexports.unstable_wrapCallback = unstable_wrapCallback;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/cjs/scheduler.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/index.js":
-/*!*****************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/index.js ***!
-  \*****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/scheduler.development.js */ \"./jaas-client/node_modules/scheduler/cjs/scheduler.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/tracing.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/tracing.js ***!
-  \*******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/scheduler-tracing.development.js */ \"./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/tracing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/index.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/index.js ***!
-  \****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar url = __webpack_require__(/*! ./url */ \"./jaas-client/node_modules/socket.io-client/lib/url.js\");\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar Manager = __webpack_require__(/*! ./manager */ \"./jaas-client/node_modules/socket.io-client/lib/manager.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup (uri, opts) {\n  if (typeof uri === 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var path = parsed.path;\n  var sameNamespace = cache[id] && path in cache[id].nsps;\n  var newConnection = opts.forceNew || opts['force new connection'] ||\n                      false === opts.multiplex || sameNamespace;\n\n  var io;\n\n  if (newConnection) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n  if (parsed.query && !opts.query) {\n    opts.query = parsed.query;\n  }\n  return io.socket(parsed.path, opts);\n}\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = __webpack_require__(/*! ./manager */ \"./jaas-client/node_modules/socket.io-client/lib/manager.js\");\nexports.Socket = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/socket.io-client/lib/socket.js\");\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/manager.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/manager.js ***!
-  \******************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar eio = __webpack_require__(/*! engine.io-client */ \"./jaas-client/node_modules/engine.io-client/lib/index.js\");\nvar Socket = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/socket.io-client/lib/socket.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js\");\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar on = __webpack_require__(/*! ./on */ \"./jaas-client/node_modules/socket.io-client/lib/on.js\");\nvar bind = __webpack_require__(/*! component-bind */ \"./jaas-client/node_modules/component-bind/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:manager');\nvar indexOf = __webpack_require__(/*! indexof */ \"./jaas-client/node_modules/indexof/index.js\");\nvar Backoff = __webpack_require__(/*! backo2 */ \"./jaas-client/node_modules/backo2/index.js\");\n\n/**\n * IE6+ hasOwnProperty\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager (uri, opts) {\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' === typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connecting = [];\n  this.lastPing = null;\n  this.encoding = false;\n  this.packetBuffer = [];\n  var _parser = opts.parser || parser;\n  this.encoder = new _parser.Encoder();\n  this.decoder = new _parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function () {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n    }\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function () {\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].id = this.generateId(nsp);\n    }\n  }\n};\n\n/**\n * generate `socket.id` for the given `nsp`\n *\n * @param {String} nsp\n * @return {String}\n * @api private\n */\n\nManager.prototype.generateId = function (nsp) {\n  return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function (v) {\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function (v) {\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function (v) {\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function (v) {\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function (v) {\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function (v) {\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function () {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function (fn, opts) {\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function () {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function (data) {\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function () {\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function () {\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n  this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n};\n\n/**\n * Called upon a ping.\n *\n * @api private\n */\n\nManager.prototype.onping = function () {\n  this.lastPing = new Date();\n  this.emitAll('ping');\n};\n\n/**\n * Called upon a packet.\n *\n * @api private\n */\n\nManager.prototype.onpong = function () {\n  this.emitAll('pong', new Date() - this.lastPing);\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function (data) {\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function (err) {\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function (nsp, opts) {\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp, opts);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connecting', onConnecting);\n    socket.on('connect', function () {\n      socket.id = self.generateId(nsp);\n    });\n\n    if (this.autoConnect) {\n      // manually call here since connecting event is fired before listening\n      onConnecting();\n    }\n  }\n\n  function onConnecting () {\n    if (!~indexOf(self.connecting, socket)) {\n      self.connecting.push(socket);\n    }\n  }\n\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function (socket) {\n  var index = indexOf(this.connecting, socket);\n  if (~index) this.connecting.splice(index, 1);\n  if (this.connecting.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function (packet) {\n  debug('writing packet %j', packet);\n  var self = this;\n  if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function (encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i], packet.options);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function () {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function () {\n  debug('cleanup');\n\n  var subsLength = this.subs.length;\n  for (var i = 0; i < subsLength; i++) {\n    var sub = this.subs.shift();\n    sub.destroy();\n  }\n\n  this.packetBuffer = [];\n  this.encoding = false;\n  this.lastPing = null;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function () {\n  debug('disconnect');\n  this.skipReconnect = true;\n  this.reconnecting = false;\n  if ('opening' === this.readyState) {\n    // `onclose` will not fire because\n    // an open event never happened\n    this.cleanup();\n  }\n  this.backoff.reset();\n  this.readyState = 'closed';\n  if (this.engine) this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function (reason) {\n  debug('onclose');\n\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function () {\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function () {\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function (err) {\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function () {\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/manager.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/on.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/on.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on (obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function () {\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/on.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/socket.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/socket.js ***!
-  \*****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js\");\nvar toArray = __webpack_require__(/*! to-array */ \"./jaas-client/node_modules/to-array/index.js\");\nvar on = __webpack_require__(/*! ./on */ \"./jaas-client/node_modules/socket.io-client/lib/on.js\");\nvar bind = __webpack_require__(/*! component-bind */ \"./jaas-client/node_modules/component-bind/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:socket');\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar hasBin = __webpack_require__(/*! has-binary2 */ \"./jaas-client/node_modules/has-binary2/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  connecting: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1,\n  ping: 1,\n  pong: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket (io, nsp, opts) {\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n  this.flags = {};\n  if (opts && opts.query) {\n    this.query = opts.query;\n  }\n  if (this.io.autoConnect) this.open();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function () {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function () {\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' === this.io.readyState) this.onopen();\n  this.emit('connecting');\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function () {\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function (ev) {\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var packet = {\n    type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT,\n    data: args\n  };\n\n  packet.options = {};\n  packet.options.compress = !this.flags || false !== this.flags.compress;\n\n  // event ack callback\n  if ('function' === typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  this.flags = {};\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function (packet) {\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function () {\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' !== this.nsp) {\n    if (this.query) {\n      var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;\n      debug('sending connect packet with query %s', query);\n      this.packet({type: parser.CONNECT, query: query});\n    } else {\n      this.packet({type: parser.CONNECT});\n    }\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function (reason) {\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function (packet) {\n  var sameNamespace = packet.nsp === this.nsp;\n  var rootNamespaceError = packet.type === parser.ERROR && packet.nsp === '/';\n\n  if (!sameNamespace && !rootNamespaceError) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function (packet) {\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function (id) {\n  var self = this;\n  var sent = false;\n  return function () {\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    self.packet({\n      type: hasBin(args) ? parser.BINARY_ACK : parser.ACK,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function (packet) {\n  var ack = this.acks[packet.id];\n  if ('function' === typeof ack) {\n    debug('calling ack %s with %j', packet.id, packet.data);\n    ack.apply(this, packet.data);\n    delete this.acks[packet.id];\n  } else {\n    debug('bad ack %s', packet.id);\n  }\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function () {\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function () {\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function () {\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function () {\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function () {\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n\n/**\n * Sets the compress flag.\n *\n * @param {Boolean} if `true`, compresses the sending data\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.compress = function (compress) {\n  this.flags.compress = compress;\n  return this;\n};\n\n/**\n * Sets the binary flag\n *\n * @param {Boolean} whether the emitted data contains binary\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.binary = function (binary) {\n  this.flags.binary = binary;\n  return this;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/socket.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/url.js":
-/*!**************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/url.js ***!
-  \**************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar parseuri = __webpack_require__(/*! parseuri */ \"./jaas-client/node_modules/parseuri/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url (uri, loc) {\n  var obj = uri;\n\n  // default to window.location\n  loc = loc || (typeof location !== 'undefined' && location);\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' === typeof uri) {\n    if ('/' === uri.charAt(0)) {\n      if ('/' === uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.host + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' !== typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    } else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  var ipv6 = obj.host.indexOf(':') !== -1;\n  var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\n  // define unique id\n  obj.id = obj.protocol + '://' + host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/url.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js ***!
-  \*******************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/binary.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/binary.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js\");\nvar isBuf = __webpack_require__(/*! ./is-buffer */ \"./jaas-client/node_modules/socket.io-parser/is-buffer.js\");\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]');\nvar withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]');\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet) {\n  var buffers = [];\n  var packetData = packet.data;\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData, buffers);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\nfunction _deconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (isBuf(data)) {\n    var placeholder = { _placeholder: true, num: buffers.length };\n    buffers.push(data);\n    return placeholder;\n  } else if (isArray(data)) {\n    var newData = new Array(data.length);\n    for (var i = 0; i < data.length; i++) {\n      newData[i] = _deconstructPacket(data[i], buffers);\n    }\n    return newData;\n  } else if (typeof data === 'object' && !(data instanceof Date)) {\n    var newData = {};\n    for (var key in data) {\n      newData[key] = _deconstructPacket(data[key], buffers);\n    }\n    return newData;\n  }\n  return data;\n}\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  packet.data = _reconstructPacket(packet.data, buffers);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\nfunction _reconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (data && data._placeholder) {\n    return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n  } else if (isArray(data)) {\n    for (var i = 0; i < data.length; i++) {\n      data[i] = _reconstructPacket(data[i], buffers);\n    }\n  } else if (typeof data === 'object') {\n    for (var key in data) {\n      data[key] = _reconstructPacket(data[key], buffers);\n    }\n  }\n\n  return data;\n}\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (typeof obj === 'object' && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/binary.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/index.js":
-/*!************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/index.js ***!
-  \************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js\")('socket.io-parser');\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js\");\nvar binary = __webpack_require__(/*! ./binary */ \"./jaas-client/node_modules/socket.io-parser/binary.js\");\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js\");\nvar isBuf = __webpack_require__(/*! ./is-buffer */ \"./jaas-client/node_modules/socket.io-parser/is-buffer.js\");\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'ACK',\n  'ERROR',\n  'BINARY_EVENT',\n  'BINARY_ACK'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\nvar ERROR_PACKET = exports.ERROR + '\"encode error\"';\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    encodeAsBinary(obj, callback);\n  } else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n\n  // first is type\n  var str = '' + obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    str += obj.attachments + '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' !== obj.nsp) {\n    str += obj.nsp + ',';\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    var payload = tryStringify(obj.data);\n    if (payload !== false) {\n      str += payload;\n    } else {\n      return ERROR_PACKET;\n    }\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\nfunction tryStringify(str) {\n  try {\n    return JSON.stringify(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if (typeof obj === 'string') {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  } else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  } else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var i = 0;\n  // look up type\n  var p = {\n    type: Number(str.charAt(0))\n  };\n\n  if (null == exports.types[p.type]) {\n    return error('unknown packet type ' + p.type);\n  }\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {\n    var buf = '';\n    while (str.charAt(++i) !== '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) !== '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' === str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' === c) break;\n      p.nsp += c;\n      if (i === str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i === str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    var payload = tryParse(str.substr(i));\n    var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));\n    if (isPayloadValid) {\n      p.data = payload;\n    } else {\n      return error('invalid payload');\n    }\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\nfunction tryParse(str) {\n  try {\n    return JSON.parse(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length === this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(msg) {\n  return {\n    type: exports.ERROR,\n    data: 'parser error: ' + msg\n  };\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/is-buffer.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/is-buffer.js ***!
-  \****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(Buffer) {\nmodule.exports = isBuf;\n\nvar withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function';\nvar withNativeArrayBuffer = typeof ArrayBuffer === 'function';\n\nvar isView = function (obj) {\n  return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer);\n};\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (withNativeBuffer && Buffer.isBuffer(obj)) ||\n          (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj)));\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/is-buffer.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js ***!
-  \*******************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js ***!
-  \*************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(/*! ./debug */ \"./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js\");\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js ***!
-  \***********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = __webpack_require__(/*! ms */ \"./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js\");\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js ***!
-  \*********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isNaN(val) === false) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  return plural(ms, d, 'day') ||\n    plural(ms, h, 'hour') ||\n    plural(ms, m, 'minute') ||\n    plural(ms, s, 'second') ||\n    ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return;\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name;\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/soundmanager2/script/soundmanager2.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/soundmanager2/script/soundmanager2.js ***!
-  \************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/** @license\r\n *\r\n * SoundManager 2: JavaScript Sound for the Web\r\n * ----------------------------------------------\r\n * http://schillmania.com/projects/soundmanager2/\r\n *\r\n * Copyright (c) 2007, Scott Schiller. All rights reserved.\r\n * Code provided under the BSD License:\r\n * http://schillmania.com/projects/soundmanager2/license.txt\r\n *\r\n * V2.97a.20170601\r\n */\r\n\r\n/**\r\n * About this file\r\n * -------------------------------------------------------------------------------------\r\n * This is the fully-commented source version of the SoundManager 2 API,\r\n * recommended for use during development and testing.\r\n *\r\n * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)\r\n * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion\r\n * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)\r\n *\r\n * You may notice <d> and </d> comments in this source; these are delimiters for\r\n * debug blocks which are removed in the -nodebug builds, further optimizing code size.\r\n *\r\n * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)\r\n */\r\n\r\n(function SM2(window, _undefined) {\r\n\r\n/* global Audio, document, window, navigator, define, module, SM2_DEFER, opera, setTimeout, setInterval, clearTimeout, sm2Debugger */\r\n\r\n'use strict';\r\n\r\nif (!window || !window.document) {\r\n\r\n  // Don't cross the [environment] streams. SM2 expects to be running in a browser, not under node.js etc.\r\n  // Additionally, if a browser somehow manages to fail this test, as Egon said: \"It would be bad.\"\r\n\r\n  throw new Error('SoundManager requires a browser with window and document objects.');\r\n\r\n}\r\n\r\nvar soundManager = null;\r\n\r\n/**\r\n * The SoundManager constructor.\r\n *\r\n * @constructor\r\n * @param {string} smURL Optional: Path to SWF files\r\n * @param {string} smID Optional: The ID to use for the SWF container element\r\n * @this {SoundManager}\r\n * @return {SoundManager} The new SoundManager instance\r\n */\r\n\r\nfunction SoundManager(smURL, smID) {\r\n\r\n  /**\r\n   * soundManager configuration options list\r\n   * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)\r\n   * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})\r\n   */\r\n\r\n  this.setupOptions = {\r\n\r\n    url: (smURL || null),             // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/\r\n    flashVersion: 8,                  // flash build to use (8 or 9.) Some API features require 9.\r\n    debugMode: true,                  // enable debugging output (console.log() with HTML fallback)\r\n    debugFlash: false,                // enable debugging output inside SWF, troubleshoot Flash/browser issues\r\n    useConsole: true,                 // use console.log() if available (otherwise, writes to #soundmanager-debug element)\r\n    consoleOnly: true,                // if console is being used, do not create/write to #soundmanager-debug\r\n    waitForWindowLoad: false,         // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r\n    bgColor: '#ffffff',               // SWF background color. N/A when wmode = 'transparent'\r\n    useHighPerformance: false,        // position:fixed flash movie can help increase js/flash speed, minimize lag\r\n    flashPollingInterval: null,       // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.\r\n    html5PollingInterval: null,       // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.\r\n    flashLoadTimeout: 1000,           // msec to wait for flash movie to load before failing (0 = infinity)\r\n    wmode: null,                      // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)\r\n    allowScriptAccess: 'always',      // for scripting the SWF (object/embed property), 'always' or 'sameDomain'\r\n    useFlashBlock: false,             // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.\r\n    useHTML5Audio: true,              // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (MP3/MP4 support varies.) Ideally, transparent vs. Flash API where possible.\r\n    forceUseGlobalHTML5Audio: false,  // if true, a single Audio() object is used for all sounds - and only one can play at a time.\r\n    ignoreMobileRestrictions: false,  // if true, SM2 will not apply global HTML5 audio rules to mobile UAs. iOS > 7 and WebViews may allow multiple Audio() instances.\r\n    html5Test: /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.\r\n    preferFlash: false,               // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.\r\n    noSWFCache: false,                // if true, appends ?ts={date} to break aggressive SWF caching.\r\n    idPrefix: 'sound'                 // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.\r\n\r\n  };\r\n\r\n  this.defaultOptions = {\r\n\r\n    /**\r\n     * the default configuration for sound objects made with createSound() and related methods\r\n     * eg., volume, auto-load behaviour and so forth\r\n     */\r\n\r\n    autoLoad: false,        // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r\n    autoPlay: false,        // enable playing of file as soon as possible (much faster if \"stream\" is true)\r\n    from: null,             // position to start playback within a sound (msec), default = beginning\r\n    loops: 1,               // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)\r\n    onid3: null,            // callback function for \"ID3 data is added/available\"\r\n    onerror: null,          // callback function for \"load failed\" (or, playback/network/decode error under HTML5.)\r\n    onload: null,           // callback function for \"load finished\"\r\n    whileloading: null,     // callback function for \"download progress update\" (X of Y bytes received)\r\n    onplay: null,           // callback for \"play\" start\r\n    onpause: null,          // callback for \"pause\"\r\n    onresume: null,         // callback for \"resume\" (pause toggle)\r\n    whileplaying: null,     // callback during play (position update)\r\n    onposition: null,       // object containing times and function callbacks for positions of interest\r\n    onstop: null,           // callback for \"user stop\"\r\n    onfinish: null,         // callback function for \"sound finished playing\"\r\n    multiShot: true,        // let sounds \"restart\" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r\n    multiShotEvents: false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled\r\n    position: null,         // offset (milliseconds) to seek to within loaded sound data.\r\n    pan: 0,                 // \"pan\" settings, left-to-right, -100 to 100\r\n    playbackRate: 1,        // rate at which to play the sound (HTML5-only)\r\n    stream: true,           // allows playing before entire file has loaded (recommended)\r\n    to: null,               // position to end playback within a sound (msec), default = end\r\n    type: null,             // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3\r\n    usePolicyFile: false,   // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)\r\n    volume: 100             // self-explanatory. 0-100, the latter being the max.\r\n\r\n  };\r\n\r\n  this.flash9Options = {\r\n\r\n    /**\r\n     * flash 9-only options,\r\n     * merged into defaultOptions if flash 9 is being used\r\n     */\r\n\r\n    onfailure: null,        // callback function for when playing fails (Flash 9, MovieStar + RTMP-only)\r\n    isMovieStar: null,      // \"MovieStar\" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r\n    usePeakData: false,     // enable left/right channel peak (level) data\r\n    useWaveformData: false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.\r\n    useEQData: false,       // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.\r\n    onbufferchange: null,   // callback for \"isBuffering\" property change\r\n    ondataerror: null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)\r\n\r\n  };\r\n\r\n  this.movieStarOptions = {\r\n\r\n    /**\r\n     * flash 9.0r115+ MPEG4 audio options,\r\n     * merged into defaultOptions if flash 9+movieStar mode is enabled\r\n     */\r\n\r\n    bufferTime: 3,          // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)\r\n    serverURL: null,        // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants\r\n    onconnect: null,        // rtmp: callback for connection to flash media server\r\n    duration: null          // rtmp: song duration (msec)\r\n\r\n  };\r\n\r\n  this.audioFormats = {\r\n\r\n    /**\r\n     * determines HTML5 support + flash requirements.\r\n     * if no support (via flash and/or HTML5) for a \"required\" format, SM2 will fail to start.\r\n     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)\r\n     */\r\n\r\n    mp3: {\r\n      type: ['audio/mpeg; codecs=\"mp3\"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],\r\n      required: true\r\n    },\r\n\r\n    mp4: {\r\n      related: ['aac', 'm4a', 'm4b'], // additional formats under the MP4 container\r\n      type: ['audio/mp4; codecs=\"mp4a.40.2\"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],\r\n      required: false\r\n    },\r\n\r\n    ogg: {\r\n      type: ['audio/ogg; codecs=vorbis'],\r\n      required: false\r\n    },\r\n\r\n    opus: {\r\n      type: ['audio/ogg; codecs=opus', 'audio/opus'],\r\n      required: false\r\n    },\r\n\r\n    wav: {\r\n      type: ['audio/wav; codecs=\"1\"', 'audio/wav', 'audio/wave', 'audio/x-wav'],\r\n      required: false\r\n    },\r\n\r\n    flac: {\r\n      type: ['audio/flac'],\r\n      required: false\r\n    }\r\n\r\n  };\r\n\r\n  // HTML attributes (id + class names) for the SWF container\r\n\r\n  this.movieID = 'sm2-container';\r\n  this.id = (smID || 'sm2movie');\r\n\r\n  this.debugID = 'soundmanager-debug';\r\n  this.debugURLParam = /([#?&])debug=1/i;\r\n\r\n  // dynamic attributes\r\n\r\n  this.versionNumber = 'V2.97a.20170601';\r\n  this.version = null;\r\n  this.movieURL = null;\r\n  this.altURL = null;\r\n  this.swfLoaded = false;\r\n  this.enabled = false;\r\n  this.oMC = null;\r\n  this.sounds = {};\r\n  this.soundIDs = [];\r\n  this.muted = false;\r\n  this.didFlashBlock = false;\r\n  this.filePattern = null;\r\n\r\n  this.filePatterns = {\r\n    flash8: /\\.mp3(\\?.*)?$/i,\r\n    flash9: /\\.mp3(\\?.*)?$/i\r\n  };\r\n\r\n  // support indicators, set at init\r\n\r\n  this.features = {\r\n    buffering: false,\r\n    peakData: false,\r\n    waveformData: false,\r\n    eqData: false,\r\n    movieStar: false\r\n  };\r\n\r\n  // flash sandbox info, used primarily in troubleshooting\r\n\r\n  this.sandbox = {\r\n    // <d>\r\n    type: null,\r\n    types: {\r\n      remote: 'remote (domain-based) rules',\r\n      localWithFile: 'local with file access (no internet access)',\r\n      localWithNetwork: 'local with network (internet access only, no local access)',\r\n      localTrusted: 'local, trusted (local+internet access)'\r\n    },\r\n    description: null,\r\n    noRemote: null,\r\n    noLocal: null\r\n    // </d>\r\n  };\r\n\r\n  /**\r\n   * format support (html5/flash)\r\n   * stores canPlayType() results based on audioFormats.\r\n   * eg. { mp3: boolean, mp4: boolean }\r\n   * treat as read-only.\r\n   */\r\n\r\n  this.html5 = {\r\n    usingFlash: null // set if/when flash fallback is needed\r\n  };\r\n\r\n  // file type support hash\r\n  this.flash = {};\r\n\r\n  // determined at init time\r\n  this.html5Only = false;\r\n\r\n  // used for special cases (eg. iPad/iPhone/palm OS?)\r\n  this.ignoreFlash = false;\r\n\r\n  /**\r\n   * a few private internals (OK, a lot. :D)\r\n   */\r\n\r\n  var SMSound,\r\n  sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],\r\n  canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5ErrorCodes, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, didSetup, msecScale = 1000,\r\n  is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie|trident/i),\r\n  isWebkit = ua.match(/webkit/i),\r\n  isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)),\r\n  isOpera = (ua.match(/opera/i)),\r\n  mobileHTML5 = (ua.match(/(mobile|pre\\/|xoom)/i) || is_iDevice || isAndroid),\r\n  isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS\\sX\\s10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, \"Silk\") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159\r\n  hasConsole = (window.console !== _undefined && console.log !== _undefined),\r\n  isFocused = (doc.hasFocus !== _undefined ? doc.hasFocus() : null),\r\n  tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())),\r\n  okToDisable = !tryInitOnFocus,\r\n  flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i,\r\n  emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)\r\n  emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading\r\n  overHTTP = (doc.location ? doc.location.protocol.match(/http/i) : null),\r\n  http = (!overHTTP ? '//' : ''),\r\n  // mp3, mp4, aac etc.\r\n  netStreamMimeTypes = /^\\s*audio\\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\\s*(?:$|;)/i,\r\n  // Flash v9.0r115+ \"moviestar\" formats\r\n  netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],\r\n  netStreamPattern = new RegExp('\\\\.(' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n  this.mimePattern = /^\\s*audio\\/(?:x-)?(?:mp(?:eg|3))\\s*(?:$|;)/i; // default mp3 set\r\n\r\n  // use altURL if not \"online\"\r\n  this.useAltURL = !overHTTP;\r\n\r\n  swfCSS = {\r\n    swfBox: 'sm2-object-box',\r\n    swfDefault: 'movieContainer',\r\n    swfError: 'swf_error', // SWF loaded, but SM2 couldn't start (other error)\r\n    swfTimedout: 'swf_timedout',\r\n    swfLoaded: 'swf_loaded',\r\n    swfUnblocked: 'swf_unblocked', // or loaded OK\r\n    sm2Debug: 'sm2_debug',\r\n    highPerf: 'high_performance',\r\n    flashDebug: 'flash_debug'\r\n  };\r\n\r\n  /**\r\n   * HTML5 error codes, per W3C\r\n   * Error code 1, MEDIA_ERR_ABORTED: Client aborted download at user's request.\r\n   * Error code 2, MEDIA_ERR_NETWORK: A network error of some description caused the user agent to stop fetching the media resource, after the resource was established to be usable.\r\n   * Error code 3, MEDIA_ERR_DECODE: An error of some description occurred while decoding the media resource, after the resource was established to be usable.\r\n   * Error code 4, MEDIA_ERR_SRC_NOT_SUPPORTED: Media (audio file) not supported (\"not usable.\")\r\n   * Reference: https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n   */\r\n  html5ErrorCodes = [\r\n    null,\r\n    'MEDIA_ERR_ABORTED',\r\n    'MEDIA_ERR_NETWORK',\r\n    'MEDIA_ERR_DECODE',\r\n    'MEDIA_ERR_SRC_NOT_SUPPORTED'\r\n  ];\r\n\r\n  /**\r\n   * basic HTML5 Audio() support test\r\n   * try...catch because of IE 9 \"not implemented\" nonsense\r\n   * https://github.com/Modernizr/Modernizr/issues/224\r\n   */\r\n\r\n  this.hasHTML5 = (function() {\r\n    try {\r\n      // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.\r\n      return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);\r\n    } catch(e) {\r\n      return false;\r\n    }\r\n  }());\r\n\r\n  /**\r\n   * Public SoundManager API\r\n   * -----------------------\r\n   */\r\n\r\n  /**\r\n   * Configures top-level soundManager properties.\r\n   *\r\n   * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }\r\n   * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.\r\n   */\r\n\r\n  this.setup = function(options) {\r\n\r\n    var noURL = (!sm2.url);\r\n\r\n    // warn if flash options have already been applied\r\n\r\n    if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {\r\n      complain(str('setupLate'));\r\n    }\r\n\r\n    // TODO: defer: true?\r\n\r\n    assign(options);\r\n\r\n    if (!useGlobalHTML5Audio) {\r\n\r\n      if (mobileHTML5) {\r\n\r\n        // force the singleton HTML5 pattern on mobile, by default.\r\n        if (!sm2.setupOptions.ignoreMobileRestrictions || sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n          messages.push(strings.globalHTML5);\r\n          useGlobalHTML5Audio = true;\r\n        }\r\n\r\n      } else if (sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n\r\n        // only apply singleton HTML5 on desktop if forced.\r\n        messages.push(strings.globalHTML5);\r\n        useGlobalHTML5Audio = true;\r\n\r\n      }\r\n\r\n    }\r\n\r\n    if (!didSetup && mobileHTML5) {\r\n\r\n      if (sm2.setupOptions.ignoreMobileRestrictions) {\r\n\r\n        messages.push(strings.ignoreMobile);\r\n\r\n      } else {\r\n\r\n        // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.\r\n\r\n        // <d>\r\n        if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {\r\n          // notify that defaults are being changed.\r\n          sm2._wD(strings.mobileUA);\r\n        }\r\n        // </d>\r\n\r\n        sm2.setupOptions.useHTML5Audio = true;\r\n        sm2.setupOptions.preferFlash = false;\r\n\r\n        if (is_iDevice) {\r\n\r\n          // no flash here.\r\n          sm2.ignoreFlash = true;\r\n\r\n        } else if ((isAndroid && !ua.match(/android\\s2\\.3/i)) || !isAndroid) {\r\n\r\n          /**\r\n           * Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence.\r\n           * Common use case: exiting sound onfinish() -> createSound() -> play()\r\n           * Presuming similar restrictions for other mobile, non-Android, non-iOS devices.\r\n           */\r\n\r\n          // <d>\r\n          sm2._wD(strings.globalHTML5);\r\n          // </d>\r\n\r\n          useGlobalHTML5Audio = true;\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // special case 1: \"Late setup\". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.\r\n\r\n    if (options) {\r\n\r\n      if (noURL && didDCLoaded && options.url !== _undefined) {\r\n        sm2.beginDelayedInit();\r\n      }\r\n\r\n      // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.\r\n\r\n      if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {\r\n        setTimeout(domContentLoaded, 1);\r\n      }\r\n\r\n    }\r\n\r\n    didSetup = true;\r\n\r\n    return sm2;\r\n\r\n  };\r\n\r\n  this.ok = function() {\r\n\r\n    return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));\r\n\r\n  };\r\n\r\n  this.supported = this.ok; // legacy\r\n\r\n  this.getMovie = function(movie_id) {\r\n\r\n    // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version\r\n    return id(movie_id) || doc[movie_id] || window[movie_id];\r\n\r\n  };\r\n\r\n  /**\r\n   * Creates a SMSound sound object instance. Can also be overloaded, e.g., createSound('mySound', '/some.mp3');\r\n   *\r\n   * @param {object} oOptions Sound options (at minimum, url parameter is required.)\r\n   * @return {object} SMSound The new SMSound object.\r\n   */\r\n\r\n  this.createSound = function(oOptions, _url) {\r\n\r\n    var cs, cs_string, options, oSound = null;\r\n\r\n    // <d>\r\n    cs = sm + '.createSound(): ';\r\n    cs_string = cs + str(!didInit ? 'notReady' : 'notOK');\r\n    // </d>\r\n\r\n    if (!didInit || !sm2.ok()) {\r\n      complain(cs_string);\r\n      return false;\r\n    }\r\n\r\n    if (_url !== _undefined) {\r\n      // function overloading in JS! :) ... assume simple createSound(id, url) use case.\r\n      oOptions = {\r\n        id: oOptions,\r\n        url: _url\r\n      };\r\n    }\r\n\r\n    // inherit from defaultOptions\r\n    options = mixin(oOptions);\r\n\r\n    options.url = parseURL(options.url);\r\n\r\n    // generate an id, if needed.\r\n    if (options.id === _undefined) {\r\n      options.id = sm2.setupOptions.idPrefix + (idCounter++);\r\n    }\r\n\r\n    // <d>\r\n    if (options.id.toString().charAt(0).match(/^[0-9]$/)) {\r\n      sm2._wD(cs + str('badID', options.id), 2);\r\n    }\r\n\r\n    sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);\r\n    // </d>\r\n\r\n    if (idCheck(options.id, true)) {\r\n      sm2._wD(cs + options.id + ' exists', 1);\r\n      return sm2.sounds[options.id];\r\n    }\r\n\r\n    function make() {\r\n\r\n      options = loopFix(options);\r\n      sm2.sounds[options.id] = new SMSound(options);\r\n      sm2.soundIDs.push(options.id);\r\n      return sm2.sounds[options.id];\r\n\r\n    }\r\n\r\n    if (html5OK(options)) {\r\n\r\n      oSound = make();\r\n      // <d>\r\n      if (!sm2.html5Only) {\r\n        sm2._wD(options.id + ': Using HTML5');\r\n      }\r\n      // </d>\r\n      oSound._setup_html5(options);\r\n\r\n    } else {\r\n\r\n      if (sm2.html5Only) {\r\n        sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');\r\n        return make();\r\n      }\r\n\r\n      // TODO: Move HTML5/flash checks into generic URL parsing/handling function.\r\n\r\n      if (sm2.html5.usingFlash && options.url && options.url.match(/data:/i)) {\r\n        // data: URIs not supported by Flash, either.\r\n        sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');\r\n        return make();\r\n      }\r\n\r\n      if (fV > 8) {\r\n        if (options.isMovieStar === null) {\r\n          // attempt to detect MPEG-4 formats\r\n          options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));\r\n        }\r\n        // <d>\r\n        if (options.isMovieStar) {\r\n          sm2._wD(cs + 'using MovieStar handling');\r\n          if (options.loops > 1) {\r\n            _wDS('noNSLoop');\r\n          }\r\n        }\r\n        // </d>\r\n      }\r\n\r\n      options = policyFix(options, cs);\r\n      oSound = make();\r\n\r\n      if (fV === 8) {\r\n        flash._createSound(options.id, options.loops || 1, options.usePolicyFile);\r\n      } else {\r\n        flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar ? options.bufferTime : false), options.loops || 1, options.serverURL, options.duration || null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);\r\n        if (!options.serverURL) {\r\n          // We are connected immediately\r\n          oSound.connected = true;\r\n          if (options.onconnect) {\r\n            options.onconnect.apply(oSound);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!options.serverURL && (options.autoLoad || options.autoPlay)) {\r\n        // call load for non-rtmp streams\r\n        oSound.load(options);\r\n      }\r\n\r\n    }\r\n\r\n    // rtmp will play in onconnect\r\n    if (!options.serverURL && options.autoPlay) {\r\n      oSound.play();\r\n    }\r\n\r\n    return oSound;\r\n\r\n  };\r\n\r\n  /**\r\n   * Destroys a SMSound sound object instance.\r\n   *\r\n   * @param {string} sID The ID of the sound to destroy\r\n   */\r\n\r\n  this.destroySound = function(sID, _bFromSound) {\r\n\r\n    // explicitly destroy a sound before normal page unload, etc.\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    var oS = sm2.sounds[sID], i;\r\n\r\n    oS.stop();\r\n\r\n    // Disable all callbacks after stop(), when the sound is being destroyed\r\n    oS._iO = {};\r\n\r\n    oS.unload();\r\n\r\n    for (i = 0; i < sm2.soundIDs.length; i++) {\r\n      if (sm2.soundIDs[i] === sID) {\r\n        sm2.soundIDs.splice(i, 1);\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (!_bFromSound) {\r\n      // ignore if being called from SMSound instance\r\n      oS.destruct(true);\r\n    }\r\n\r\n    oS = null;\r\n    delete sm2.sounds[sID];\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the load() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {object} oOptions Optional: Sound options\r\n   */\r\n\r\n  this.load = function(sID, oOptions) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].load(oOptions);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the unload() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   */\r\n\r\n  this.unload = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].unload();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the onPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPosition The position to watch for\r\n   * @param {function} oMethod The relevant callback to fire\r\n   * @param {object} oScope Optional: The scope to apply the callback to\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.onPosition = function(sID, nPosition, oMethod, oScope) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);\r\n\r\n  };\r\n\r\n  // legacy/backwards-compability: lower-case method name\r\n  this.onposition = this.onPosition;\r\n\r\n  /**\r\n   * Calls the clearOnPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPosition The position to watch for\r\n   * @param {function} oMethod Optional: The relevant callback to fire\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.clearOnPosition = function(sID, nPosition, oMethod) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the play() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {object} oOptions Optional: Sound options\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.play = function(sID, oOptions) {\r\n\r\n    var result = null,\r\n        // legacy function-overloading use case: play('mySound', '/path/to/some.mp3');\r\n        overloaded = (oOptions && !(oOptions instanceof Object));\r\n\r\n    if (!didInit || !sm2.ok()) {\r\n      complain(sm + '.play(): ' + str(!didInit ? 'notReady' : 'notOK'));\r\n      return false;\r\n    }\r\n\r\n    if (!idCheck(sID, overloaded)) {\r\n\r\n      // no sound found for the given ID. Bail.\r\n      if (!overloaded) return false;\r\n\r\n      if (overloaded) {\r\n        oOptions = {\r\n          url: oOptions\r\n        };\r\n      }\r\n\r\n      if (oOptions && oOptions.url) {\r\n        // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});\r\n        sm2._wD(sm + '.play(): Attempting to create \"' + sID + '\"', 1);\r\n        oOptions.id = sID;\r\n        result = sm2.createSound(oOptions).play();\r\n      }\r\n\r\n    } else if (overloaded) {\r\n\r\n      // existing sound object case\r\n      oOptions = {\r\n        url: oOptions\r\n      };\r\n\r\n    }\r\n\r\n    if (result === null) {\r\n      // default case\r\n      result = sm2.sounds[sID].play(oOptions);\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  // just for convenience\r\n  this.start = this.play;\r\n\r\n  /**\r\n   * Calls the setPlaybackRate() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPlaybackRate = function(sID, rate, allowOverride) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPlaybackRate(rate, allowOverride);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nMsecOffset Position (milliseconds)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPosition = function(sID, nMsecOffset) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPosition(nMsecOffset);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the stop() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.stop = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    sm2._wD(sm + '.stop(' + sID + ')', 1);\r\n\r\n    return sm2.sounds[sID].stop();\r\n\r\n  };\r\n\r\n  /**\r\n   * Stops all currently-playing sounds.\r\n   */\r\n\r\n  this.stopAll = function() {\r\n\r\n    var oSound;\r\n    sm2._wD(sm + '.stopAll()', 1);\r\n\r\n    for (oSound in sm2.sounds) {\r\n      if (sm2.sounds.hasOwnProperty(oSound)) {\r\n        // apply only to sound objects\r\n        sm2.sounds[oSound].stop();\r\n      }\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the pause() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.pause = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].pause();\r\n\r\n  };\r\n\r\n  /**\r\n   * Pauses all currently-playing sounds.\r\n   */\r\n\r\n  this.pauseAll = function() {\r\n\r\n    var i;\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].pause();\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the resume() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.resume = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].resume();\r\n\r\n  };\r\n\r\n  /**\r\n   * Resumes all currently-paused sounds.\r\n   */\r\n\r\n  this.resumeAll = function() {\r\n\r\n    var i;\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].resume();\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the togglePause() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.togglePause = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].togglePause();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setPan() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPan The pan value (-100 to 100)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPan = function(sID, nPan) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPan(nPan);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setVolume() method of a SMSound object by ID\r\n   * Overloaded case: pass only volume argument eg., setVolume(50) to apply to all sounds.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nVol The volume value (0 to 100)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setVolume = function(sID, nVol) {\r\n\r\n    // setVolume(50) function overloading case - apply to all sounds\r\n\r\n    var i, j;\r\n\r\n    if (sID !== _undefined && !isNaN(sID) && nVol === _undefined) {\r\n      for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n        sm2.sounds[sm2.soundIDs[i]].setVolume(sID);\r\n      }\r\n      return false;\r\n    }\r\n\r\n    // setVolume('mySound', 50) case\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setVolume(nVol);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the mute() method of either a single SMSound object by ID, or all sound objects.\r\n   *\r\n   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n   */\r\n\r\n  this.mute = function(sID) {\r\n\r\n    var i = 0;\r\n\r\n    if (sID instanceof String) {\r\n      sID = null;\r\n    }\r\n\r\n    if (!sID) {\r\n\r\n      sm2._wD(sm + '.mute(): Muting all sounds');\r\n      for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n        sm2.sounds[sm2.soundIDs[i]].mute();\r\n      }\r\n      sm2.muted = true;\r\n\r\n    } else {\r\n\r\n      if (!idCheck(sID)) return false;\r\n\r\n      sm2._wD(sm + '.mute(): Muting \"' + sID + '\"');\r\n      return sm2.sounds[sID].mute();\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Mutes all sounds.\r\n   */\r\n\r\n  this.muteAll = function() {\r\n\r\n    sm2.mute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.\r\n   *\r\n   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n   */\r\n\r\n  this.unmute = function(sID) {\r\n\r\n    var i;\r\n\r\n    if (sID instanceof String) {\r\n      sID = null;\r\n    }\r\n\r\n    if (!sID) {\r\n\r\n      sm2._wD(sm + '.unmute(): Unmuting all sounds');\r\n      for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n        sm2.sounds[sm2.soundIDs[i]].unmute();\r\n      }\r\n      sm2.muted = false;\r\n\r\n    } else {\r\n\r\n      if (!idCheck(sID)) return false;\r\n\r\n      sm2._wD(sm + '.unmute(): Unmuting \"' + sID + '\"');\r\n\r\n      return sm2.sounds[sID].unmute();\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Unmutes all sounds.\r\n   */\r\n\r\n  this.unmuteAll = function() {\r\n\r\n    sm2.unmute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the toggleMute() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.toggleMute = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].toggleMute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Retrieves the memory used by the flash plugin.\r\n   *\r\n   * @return {number} The amount of memory in use\r\n   */\r\n\r\n  this.getMemoryUse = function() {\r\n\r\n    // flash-only\r\n    var ram = 0;\r\n\r\n    if (flash && fV !== 8) {\r\n      ram = parseInt(flash._getMemoryUse(), 10);\r\n    }\r\n\r\n    return ram;\r\n\r\n  };\r\n\r\n  /**\r\n   * Undocumented: NOPs soundManager and all SMSound objects.\r\n   */\r\n\r\n  this.disable = function(bNoDisable) {\r\n\r\n    // destroy all functions\r\n    var i;\r\n\r\n    if (bNoDisable === _undefined) {\r\n      bNoDisable = false;\r\n    }\r\n\r\n    // already disabled?\r\n    if (disabled) return false;\r\n\r\n    disabled = true;\r\n\r\n    _wDS('shutdown', 1);\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      disableObject(sm2.sounds[sm2.soundIDs[i]]);\r\n    }\r\n\r\n    disableObject(sm2);\r\n\r\n    // fire \"complete\", despite fail\r\n    initComplete(bNoDisable);\r\n\r\n    event.remove(window, 'load', initUserOnload);\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of a MIME type, eg. 'audio/mp3'.\r\n   */\r\n\r\n  this.canPlayMIME = function(sMIME) {\r\n\r\n    var result;\r\n\r\n    if (sm2.hasHTML5) {\r\n      result = html5CanPlay({\r\n        type: sMIME\r\n      });\r\n    }\r\n\r\n    if (!result && needsFlash) {\r\n      // if flash 9, test netStream (movieStar) types as well.\r\n      result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less \"weird\" (per JSLint)\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of a URL based on audio support.\r\n   *\r\n   * @param {string} sURL The URL to test\r\n   * @return {boolean} URL playability\r\n   */\r\n\r\n  this.canPlayURL = function(sURL) {\r\n\r\n    var result;\r\n\r\n    if (sm2.hasHTML5) {\r\n      result = html5CanPlay({\r\n        url: sURL\r\n      });\r\n    }\r\n\r\n    if (!result && needsFlash) {\r\n      result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of an HTML DOM &lt;a&gt; object (or similar object literal) based on audio support.\r\n   *\r\n   * @param {object} oLink an HTML DOM &lt;a&gt; object or object literal including href and/or type attributes\r\n   * @return {boolean} URL playability\r\n   */\r\n\r\n  this.canPlayLink = function(oLink) {\r\n\r\n    if (oLink.type !== _undefined && oLink.type && sm2.canPlayMIME(oLink.type)) return true;\r\n\r\n    return sm2.canPlayURL(oLink.href);\r\n\r\n  };\r\n\r\n  /**\r\n   * Retrieves a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.getSoundById = function(sID, _suppressDebug) {\r\n\r\n    if (!sID) return null;\r\n\r\n    var result = sm2.sounds[sID];\r\n\r\n    // <d>\r\n    if (!result && !_suppressDebug) {\r\n      sm2._wD(sm + '.getSoundById(): Sound \"' + sID + '\" not found.', 2);\r\n    }\r\n    // </d>\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Queues a callback for execution when SoundManager has successfully initialized.\r\n   *\r\n   * @param {function} oMethod The callback method to fire\r\n   * @param {object} oScope Optional: The scope to apply to the callback\r\n   */\r\n\r\n  this.onready = function(oMethod, oScope) {\r\n\r\n    var sType = 'onready',\r\n        result = false;\r\n\r\n    if (typeof oMethod === 'function') {\r\n\r\n      // <d>\r\n      if (didInit) {\r\n        sm2._wD(str('queue', sType));\r\n      }\r\n      // </d>\r\n\r\n      if (!oScope) {\r\n        oScope = window;\r\n      }\r\n\r\n      addOnEvent(sType, oMethod, oScope);\r\n      processOnEvents();\r\n\r\n      result = true;\r\n\r\n    } else {\r\n\r\n      throw str('needFunction', sType);\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Queues a callback for execution when SoundManager has failed to initialize.\r\n   *\r\n   * @param {function} oMethod The callback method to fire\r\n   * @param {object} oScope Optional: The scope to apply to the callback\r\n   */\r\n\r\n  this.ontimeout = function(oMethod, oScope) {\r\n\r\n    var sType = 'ontimeout',\r\n        result = false;\r\n\r\n    if (typeof oMethod === 'function') {\r\n\r\n      // <d>\r\n      if (didInit) {\r\n        sm2._wD(str('queue', sType));\r\n      }\r\n      // </d>\r\n\r\n      if (!oScope) {\r\n        oScope = window;\r\n      }\r\n\r\n      addOnEvent(sType, oMethod, oScope);\r\n      processOnEvents({ type: sType });\r\n\r\n      result = true;\r\n\r\n    } else {\r\n\r\n      throw str('needFunction', sType);\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Writes console.log()-style debug output to a console or in-browser element.\r\n   * Applies when debugMode = true\r\n   *\r\n   * @param {string} sText The console message\r\n   * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.\r\n   */\r\n\r\n  this._writeDebug = function(sText, sTypeOrObject) {\r\n\r\n    // pseudo-private console.log()-style output\r\n    // <d>\r\n\r\n    var sDID = 'soundmanager-debug', o, oItem;\r\n\r\n    if (!sm2.setupOptions.debugMode) return false;\r\n\r\n    if (hasConsole && sm2.useConsole) {\r\n      if (sTypeOrObject && typeof sTypeOrObject === 'object') {\r\n        // object passed; dump to console.\r\n        console.log(sText, sTypeOrObject);\r\n      } else if (debugLevels[sTypeOrObject] !== _undefined) {\r\n        console[debugLevels[sTypeOrObject]](sText);\r\n      } else {\r\n        console.log(sText);\r\n      }\r\n      if (sm2.consoleOnly) return true;\r\n    }\r\n\r\n    o = id(sDID);\r\n\r\n    if (!o) return false;\r\n\r\n    oItem = doc.createElement('div');\r\n\r\n    if (++wdCount % 2 === 0) {\r\n      oItem.className = 'sm2-alt';\r\n    }\r\n\r\n    if (sTypeOrObject === _undefined) {\r\n      sTypeOrObject = 0;\r\n    } else {\r\n      sTypeOrObject = parseInt(sTypeOrObject, 10);\r\n    }\r\n\r\n    oItem.appendChild(doc.createTextNode(sText));\r\n\r\n    if (sTypeOrObject) {\r\n      if (sTypeOrObject >= 2) {\r\n        oItem.style.fontWeight = 'bold';\r\n      }\r\n      if (sTypeOrObject === 3) {\r\n        oItem.style.color = '#ff3333';\r\n      }\r\n    }\r\n\r\n    // top-to-bottom\r\n    // o.appendChild(oItem);\r\n\r\n    // bottom-to-top\r\n    o.insertBefore(oItem, o.firstChild);\r\n\r\n    o = null;\r\n    // </d>\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  // <d>\r\n  // last-resort debugging option\r\n  if (wl.indexOf('sm2-debug=alert') !== -1) {\r\n    this._writeDebug = function(sText) {\r\n      window.alert(sText);\r\n    };\r\n  }\r\n  // </d>\r\n\r\n  // alias\r\n  this._wD = this._writeDebug;\r\n\r\n  /**\r\n   * Provides debug / state information on all SMSound objects.\r\n   */\r\n\r\n  this._debug = function() {\r\n\r\n    // <d>\r\n    var i, j;\r\n    _wDS('currentObj', 1);\r\n\r\n    for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n      sm2.sounds[sm2.soundIDs[i]]._debug();\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  /**\r\n   * Restarts and re-initializes the SoundManager instance.\r\n   *\r\n   * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.\r\n   * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).\r\n   * @return {object} soundManager The soundManager instance.\r\n   */\r\n\r\n  this.reboot = function(resetEvents, excludeInit) {\r\n\r\n    // reset some (or all) state, and re-init unless otherwise specified.\r\n\r\n    // <d>\r\n    if (sm2.soundIDs.length) {\r\n      sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');\r\n    }\r\n    // </d>\r\n\r\n    var i, j, k;\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].destruct();\r\n    }\r\n\r\n    // trash ze flash (remove from the DOM)\r\n\r\n    if (flash) {\r\n\r\n      try {\r\n\r\n        if (isIE) {\r\n          oRemovedHTML = flash.innerHTML;\r\n        }\r\n\r\n        oRemoved = flash.parentNode.removeChild(flash);\r\n\r\n      } catch(e) {\r\n\r\n        // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.\r\n\r\n        _wDS('badRemove', 2);\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // actually, force recreate of movie.\r\n\r\n    oRemovedHTML = oRemoved = needsFlash = flash = null;\r\n\r\n    sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;\r\n\r\n    sm2.soundIDs = [];\r\n    sm2.sounds = {};\r\n\r\n    idCounter = 0;\r\n    didSetup = false;\r\n\r\n    if (!resetEvents) {\r\n      // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init\r\n      for (i in on_queue) {\r\n        if (on_queue.hasOwnProperty(i)) {\r\n          for (j = 0, k = on_queue[i].length; j < k; j++) {\r\n            on_queue[i][j].fired = false;\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      // remove all callbacks entirely\r\n      on_queue = [];\r\n    }\r\n\r\n    // <d>\r\n    if (!excludeInit) {\r\n      sm2._wD(sm + ': Rebooting...');\r\n    }\r\n    // </d>\r\n\r\n    // reset HTML5 and flash canPlay test results\r\n\r\n    sm2.html5 = {\r\n      usingFlash: null\r\n    };\r\n\r\n    sm2.flash = {};\r\n\r\n    // reset device-specific HTML/flash mode switches\r\n\r\n    sm2.html5Only = false;\r\n    sm2.ignoreFlash = false;\r\n\r\n    window.setTimeout(function() {\r\n\r\n      // by default, re-init\r\n\r\n      if (!excludeInit) {\r\n        sm2.beginDelayedInit();\r\n      }\r\n\r\n    }, 20);\r\n\r\n    return sm2;\r\n\r\n  };\r\n\r\n  this.reset = function() {\r\n\r\n    /**\r\n     * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.\r\n     * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().\r\n     * @return {object} soundManager The soundManager instance.\r\n     */\r\n\r\n    _wDS('reset');\r\n\r\n    return sm2.reboot(true, true);\r\n\r\n  };\r\n\r\n  /**\r\n   * Undocumented: Determines the SM2 flash movie's load progress.\r\n   *\r\n   * @return {number or null} Percent loaded, or if invalid/unsupported, null.\r\n   */\r\n\r\n  this.getMoviePercent = function() {\r\n\r\n    /**\r\n     * Interesting syntax notes...\r\n     * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof \"function\" nor instanceof Function, but are still valid.\r\n     * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw \"object doesn't support this property or method\".\r\n     * Thus, 'in' syntax must be used.\r\n     */\r\n\r\n    return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null);\r\n\r\n  };\r\n\r\n  /**\r\n   * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().\r\n   */\r\n\r\n  this.beginDelayedInit = function() {\r\n\r\n    windowLoaded = true;\r\n    domContentLoaded();\r\n\r\n    setTimeout(function() {\r\n\r\n      if (initPending) return false;\r\n\r\n      createMovie();\r\n      initMovie();\r\n      initPending = true;\r\n\r\n      return true;\r\n\r\n    }, 20);\r\n\r\n    delayWaitForEI();\r\n\r\n  };\r\n\r\n  /**\r\n   * Destroys the SoundManager instance and all SMSound instances.\r\n   */\r\n\r\n  this.destruct = function() {\r\n\r\n    sm2._wD(sm + '.destruct()');\r\n    sm2.disable(true);\r\n\r\n  };\r\n\r\n  /**\r\n   * SMSound() (sound object) constructor\r\n   * ------------------------------------\r\n   *\r\n   * @param {object} oOptions Sound options (id and url are required attributes)\r\n   * @return {SMSound} The new SMSound object\r\n   */\r\n\r\n  SMSound = function(oOptions) {\r\n\r\n    var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;\r\n\r\n    lastHTML5State = {\r\n      // tracks duration + position (time)\r\n      duration: null,\r\n      time: null\r\n    };\r\n\r\n    this.id = oOptions.id;\r\n\r\n    // legacy\r\n    this.sID = this.id;\r\n\r\n    this.url = oOptions.url;\r\n    this.options = mixin(oOptions);\r\n\r\n    // per-play-instance-specific options\r\n    this.instanceOptions = this.options;\r\n\r\n    // short alias\r\n    this._iO = this.instanceOptions;\r\n\r\n    // assign property defaults\r\n    this.pan = this.options.pan;\r\n    this.volume = this.options.volume;\r\n\r\n    // whether or not this object is using HTML5\r\n    this.isHTML5 = false;\r\n\r\n    // internal HTML5 Audio() object reference\r\n    this._a = null;\r\n\r\n    // for flash 8 special-case createSound() without url, followed by load/play with url case\r\n    urlOmitted = (!this.url);\r\n\r\n    /**\r\n     * SMSound() public methods\r\n     * ------------------------\r\n     */\r\n\r\n    this.id3 = {};\r\n\r\n    /**\r\n     * Writes SMSound object parameters to debug console\r\n     */\r\n\r\n    this._debug = function() {\r\n\r\n      // <d>\r\n      sm2._wD(s.id + ': Merged options:', s.options);\r\n      // </d>\r\n\r\n    };\r\n\r\n    /**\r\n     * Begins loading a sound per its *url*.\r\n     *\r\n     * @param {object} options Optional: Sound options\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.load = function(options) {\r\n\r\n      var oSound = null, instanceOptions;\r\n\r\n      if (options !== _undefined) {\r\n        s._iO = mixin(options, s.options);\r\n      } else {\r\n        options = s.options;\r\n        s._iO = options;\r\n        if (lastURL && lastURL !== s.url) {\r\n          _wDS('manURL');\r\n          s._iO.url = s.url;\r\n          s.url = null;\r\n        }\r\n      }\r\n\r\n      if (!s._iO.url) {\r\n        s._iO.url = s.url;\r\n      }\r\n\r\n      s._iO.url = parseURL(s._iO.url);\r\n\r\n      // ensure we're in sync\r\n      s.instanceOptions = s._iO;\r\n\r\n      // local shortcut\r\n      instanceOptions = s._iO;\r\n\r\n      sm2._wD(s.id + ': load (' + instanceOptions.url + ')');\r\n\r\n      if (!instanceOptions.url && !s.url) {\r\n        sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);\r\n        return s;\r\n      }\r\n\r\n      // <d>\r\n      if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {\r\n        // flash 8 load() -> play() won't work before onload has fired.\r\n        sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);\r\n      }\r\n      // </d>\r\n\r\n      if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {\r\n        _wDS('onURL', 1);\r\n        // if loaded and an onload() exists, fire immediately.\r\n        if (s.readyState === 3 && instanceOptions.onload) {\r\n          // assume success based on truthy duration.\r\n          wrapCallback(s, function() {\r\n            instanceOptions.onload.apply(s, [(!!s.duration)]);\r\n          });\r\n        }\r\n        return s;\r\n      }\r\n\r\n      // reset a few state properties\r\n\r\n      s.loaded = false;\r\n      s.readyState = 1;\r\n      s.playState = 0;\r\n      s.id3 = {};\r\n\r\n      // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.\r\n\r\n      if (html5OK(instanceOptions)) {\r\n\r\n        oSound = s._setup_html5(instanceOptions);\r\n\r\n        if (!oSound._called_load) {\r\n\r\n          s._html5_canplay = false;\r\n\r\n          // TODO: review called_load / html5_canplay logic\r\n\r\n          // if url provided directly to load(), assign it here.\r\n\r\n          if (s.url !== instanceOptions.url) {\r\n\r\n            sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);\r\n\r\n            s._a.src = instanceOptions.url;\r\n\r\n            // TODO: review / re-apply all relevant options (volume, loop, onposition etc.)\r\n\r\n            // reset position for new URL\r\n            s.setPosition(0);\r\n\r\n          }\r\n\r\n          // given explicit load call, try to preload.\r\n\r\n          // early HTML5 implementation (non-standard)\r\n          s._a.autobuffer = 'auto';\r\n\r\n          // standard property, values: none / metadata / auto\r\n          // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx\r\n          s._a.preload = 'auto';\r\n\r\n          s._a._called_load = true;\r\n\r\n        } else {\r\n\r\n          sm2._wD(s.id + ': Ignoring request to load again');\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        if (sm2.html5Only) {\r\n          sm2._wD(s.id + ': No flash support. Exiting.');\r\n          return s;\r\n        }\r\n\r\n        if (s._iO.url && s._iO.url.match(/data:/i)) {\r\n          // data: URIs not supported by Flash, either.\r\n          sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');\r\n          return s;\r\n        }\r\n\r\n        try {\r\n          s.isHTML5 = false;\r\n          s._iO = policyFix(loopFix(instanceOptions));\r\n          // if we have \"position\", disable auto-play as we'll be seeking to that position at onload().\r\n          if (s._iO.autoPlay && (s._iO.position || s._iO.from)) {\r\n            sm2._wD(s.id + ': Disabling autoPlay because of non-zero offset case');\r\n            s._iO.autoPlay = false;\r\n          }\r\n          // re-assign local shortcut\r\n          instanceOptions = s._iO;\r\n          if (fV === 8) {\r\n            flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);\r\n          } else {\r\n            flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops || 1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);\r\n          }\r\n        } catch(e) {\r\n          _wDS('smError', 2);\r\n          debugTS('onload', false);\r\n          catchError({\r\n            type: 'SMSOUND_LOAD_JS_EXCEPTION',\r\n            fatal: true\r\n          });\r\n        }\r\n\r\n      }\r\n\r\n      // after all of this, ensure sound url is up to date.\r\n      s.url = instanceOptions.url;\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unloads a sound, canceling any open HTTP requests.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.unload = function() {\r\n\r\n      // Flash 8/AS2 can't \"close\" a stream - fake it by loading an empty URL\r\n      // Flash 9/AS3: Close stream, preventing further load\r\n      // HTML5: Most UAs will use empty URL\r\n\r\n      if (s.readyState !== 0) {\r\n\r\n        sm2._wD(s.id + ': unload()');\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          if (fV === 8) {\r\n            flash._unload(s.id, emptyURL);\r\n          } else {\r\n            flash._unload(s.id);\r\n          }\r\n\r\n        } else {\r\n\r\n          stop_html5_timer();\r\n\r\n          if (s._a) {\r\n\r\n            s._a.pause();\r\n\r\n            // update empty URL, too\r\n            lastURL = html5Unload(s._a);\r\n\r\n          }\r\n\r\n        }\r\n\r\n        // reset load/status flags\r\n        resetProperties();\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unloads and destroys a sound.\r\n     */\r\n\r\n    this.destruct = function(_bFromSM) {\r\n\r\n      sm2._wD(s.id + ': Destruct');\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        // kill sound within Flash\r\n        // Disable the onfailure handler\r\n        s._iO.onfailure = null;\r\n        flash._destroySound(s.id);\r\n\r\n      } else {\r\n\r\n        stop_html5_timer();\r\n\r\n        if (s._a) {\r\n          s._a.pause();\r\n          html5Unload(s._a);\r\n          if (!useGlobalHTML5Audio) {\r\n            remove_html5_events();\r\n          }\r\n          // break obvious circular reference\r\n          s._a._s = null;\r\n          s._a = null;\r\n        }\r\n\r\n      }\r\n\r\n      if (!_bFromSM) {\r\n        // ensure deletion from controller\r\n        sm2.destroySound(s.id, true);\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Begins playing a sound.\r\n     *\r\n     * @param {object} options Optional: Sound options\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.play = function(options, _updatePlayState) {\r\n\r\n      var fN, allowMulti, a, onready,\r\n          audioClone, onended, oncanplay,\r\n          startOK = true;\r\n\r\n      // <d>\r\n      fN = s.id + ': play(): ';\r\n      // </d>\r\n\r\n      // default to true\r\n      _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);\r\n\r\n      if (!options) {\r\n        options = {};\r\n      }\r\n\r\n      // first, use local URL (if specified)\r\n      if (s.url) {\r\n        s._iO.url = s.url;\r\n      }\r\n\r\n      // mix in any options defined at createSound()\r\n      s._iO = mixin(s._iO, s.options);\r\n\r\n      // mix in any options specific to this method\r\n      s._iO = mixin(options, s._iO);\r\n\r\n      s._iO.url = parseURL(s._iO.url);\r\n\r\n      s.instanceOptions = s._iO;\r\n\r\n      // RTMP-only\r\n      if (!s.isHTML5 && s._iO.serverURL && !s.connected) {\r\n        if (!s.getAutoPlay()) {\r\n          sm2._wD(fN + ' Netstream not connected yet - setting autoPlay');\r\n          s.setAutoPlay(true);\r\n        }\r\n        // play will be called in onconnect()\r\n        return s;\r\n      }\r\n\r\n      if (html5OK(s._iO)) {\r\n        s._setup_html5(s._iO);\r\n        start_html5_timer();\r\n      }\r\n\r\n      if (s.playState === 1 && !s.paused) {\r\n\r\n        allowMulti = s._iO.multiShot;\r\n\r\n        if (!allowMulti) {\r\n\r\n          sm2._wD(fN + 'Already playing (one-shot)', 1);\r\n\r\n          if (s.isHTML5) {\r\n            // go back to original position.\r\n            s.setPosition(s._iO.position);\r\n          }\r\n\r\n          return s;\r\n\r\n        }\r\n\r\n        sm2._wD(fN + 'Already playing (multi-shot)', 1);\r\n\r\n      }\r\n\r\n      // edge case: play() with explicit URL parameter\r\n      if (options.url && options.url !== s.url) {\r\n\r\n        // special case for createSound() followed by load() / play() with url; avoid double-load case.\r\n        if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {\r\n\r\n          urlOmitted = false;\r\n\r\n        } else {\r\n\r\n          // load using merged options\r\n          s.load(s._iO);\r\n\r\n        }\r\n\r\n      }\r\n\r\n      if (!s.loaded) {\r\n\r\n        if (s.readyState === 0) {\r\n\r\n          sm2._wD(fN + 'Attempting to load');\r\n\r\n          // try to get this sound playing ASAP\r\n          if (!s.isHTML5 && !sm2.html5Only) {\r\n\r\n            // flash: assign directly because setAutoPlay() increments the instanceCount\r\n            s._iO.autoPlay = true;\r\n            s.load(s._iO);\r\n\r\n          } else if (s.isHTML5) {\r\n\r\n            // iOS needs this when recycling sounds, loading a new URL on an existing object.\r\n            s.load(s._iO);\r\n\r\n          } else {\r\n\r\n            sm2._wD(fN + 'Unsupported type. Exiting.');\r\n\r\n            return s;\r\n\r\n          }\r\n\r\n          // HTML5 hack - re-set instanceOptions?\r\n          s.instanceOptions = s._iO;\r\n\r\n        } else if (s.readyState === 2) {\r\n\r\n          sm2._wD(fN + 'Could not load - exiting', 2);\r\n\r\n          return s;\r\n\r\n        } else {\r\n\r\n          sm2._wD(fN + 'Loading - attempting to play...');\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        // \"play()\"\r\n        sm2._wD(fN.substr(0, fN.lastIndexOf(':')));\r\n\r\n      }\r\n\r\n      if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {\r\n        // flash 9 needs a position reset if play() is called while at the end of a sound.\r\n        sm2._wD(fN + 'Sound at end, resetting to position: 0');\r\n        options.position = 0;\r\n      }\r\n\r\n      /**\r\n       * Streams will pause when their buffer is full if they are being loaded.\r\n       * In this case paused is true, but the song hasn't started playing yet.\r\n       * If we just call resume() the onplay() callback will never be called.\r\n       * So only call resume() if the position is > 0.\r\n       * Another reason is because options like volume won't have been applied yet.\r\n       * For normal sounds, just resume.\r\n       */\r\n\r\n      if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {\r\n\r\n        // https://gist.github.com/37b17df75cc4d7a90bf6\r\n        sm2._wD(fN + 'Resuming from paused state', 1);\r\n        s.resume();\r\n\r\n      } else {\r\n\r\n        s._iO = mixin(options, s._iO);\r\n\r\n        /**\r\n         * Preload in the event of play() with position under Flash,\r\n         * or from/to parameters and non-RTMP case\r\n         */\r\n        if (((!s.isHTML5 && s._iO.position !== null && s._iO.position > 0) || (s._iO.from !== null && s._iO.from > 0) || s._iO.to !== null) && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {\r\n\r\n          onready = function() {\r\n            // sound \"canplay\" or onload()\r\n            // re-apply position/from/to to instance options, and start playback\r\n            s._iO = mixin(options, s._iO);\r\n            s.play(s._iO);\r\n          };\r\n\r\n          // HTML5 needs to at least have \"canplay\" fired before seeking.\r\n          if (s.isHTML5 && !s._html5_canplay) {\r\n\r\n            // this hasn't been loaded yet. load it first, and then do this again.\r\n            sm2._wD(fN + 'Beginning load for non-zero offset case');\r\n\r\n            s.load({\r\n              // note: custom HTML5-only event added for from/to implementation.\r\n              _oncanplay: onready\r\n            });\r\n\r\n          } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {\r\n\r\n            // to be safe, preload the whole thing in Flash.\r\n\r\n            sm2._wD(fN + 'Preloading for non-zero offset case');\r\n\r\n            s.load({\r\n              onload: onready\r\n            });\r\n\r\n          }\r\n\r\n          // otherwise, we're ready to go. re-apply local options, and continue\r\n\r\n          s._iO = applyFromTo();\r\n\r\n        }\r\n\r\n        // sm2._wD(fN + 'Starting to play');\r\n\r\n        // increment instance counter, where enabled + supported\r\n        if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {\r\n          s.instanceCount++;\r\n        }\r\n\r\n        // if first play and onposition parameters exist, apply them now\r\n        if (s._iO.onposition && s.playState === 0) {\r\n          attachOnPosition(s);\r\n        }\r\n\r\n        s.playState = 1;\r\n        s.paused = false;\r\n\r\n        s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);\r\n\r\n        if (!s.isHTML5) {\r\n          s._iO = policyFix(loopFix(s._iO));\r\n        }\r\n\r\n        if (s._iO.onplay && _updatePlayState) {\r\n          s._iO.onplay.apply(s);\r\n          onplay_called = true;\r\n        }\r\n\r\n        s.setVolume(s._iO.volume, true);\r\n        s.setPan(s._iO.pan, true);\r\n\r\n        if (s._iO.playbackRate !== 1) {\r\n          s.setPlaybackRate(s._iO.playbackRate);\r\n        }\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);\r\n\r\n          if (fV === 9 && !startOK) {\r\n            // edge case: no sound hardware, or 32-channel flash ceiling hit.\r\n            // applies only to Flash 9, non-NetStream/MovieStar sounds.\r\n            // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29\r\n            sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);\r\n            if (s._iO.onplayerror) {\r\n              s._iO.onplayerror.apply(s);\r\n            }\r\n\r\n          }\r\n\r\n        } else if (s.instanceCount < 2) {\r\n\r\n            // HTML5 single-instance case\r\n\r\n            start_html5_timer();\r\n\r\n            a = s._setup_html5();\r\n\r\n            s.setPosition(s._iO.position);\r\n\r\n            a.play();\r\n\r\n          } else {\r\n\r\n            // HTML5 multi-shot case\r\n\r\n            sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');\r\n\r\n            audioClone = new Audio(s._iO.url);\r\n\r\n            onended = function() {\r\n              event.remove(audioClone, 'ended', onended);\r\n              s._onfinish(s);\r\n              // cleanup\r\n              html5Unload(audioClone);\r\n              audioClone = null;\r\n            };\r\n\r\n            oncanplay = function() {\r\n              event.remove(audioClone, 'canplay', oncanplay);\r\n              try {\r\n                audioClone.currentTime = s._iO.position / msecScale;\r\n              } catch(err) {\r\n                complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position / msecScale));\r\n              }\r\n              audioClone.play();\r\n            };\r\n\r\n            event.add(audioClone, 'ended', onended);\r\n\r\n            // apply volume to clones, too\r\n            if (s._iO.volume !== _undefined) {\r\n              audioClone.volume = Math.max(0, Math.min(1, s._iO.volume / 100));\r\n            }\r\n\r\n            // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.\r\n            if (s.muted) {\r\n              audioClone.muted = true;\r\n            }\r\n\r\n            if (s._iO.position) {\r\n              // HTML5 audio can't seek before onplay() event has fired.\r\n              // wait for canplay, then seek to position and start playback.\r\n              event.add(audioClone, 'canplay', oncanplay);\r\n            } else {\r\n              // begin playback at currentTime: 0\r\n              audioClone.play();\r\n            }\r\n\r\n          }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    // just for convenience\r\n    this.start = this.play;\r\n\r\n    /**\r\n     * Stops playing a sound (and optionally, all sounds)\r\n     *\r\n     * @param {boolean} bAll Optional: Whether to stop all sounds\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.stop = function(bAll) {\r\n\r\n      var instanceOptions = s._iO,\r\n          originalPosition;\r\n\r\n      if (s.playState === 1) {\r\n\r\n        sm2._wD(s.id + ': stop()');\r\n\r\n        s._onbufferchange(0);\r\n        s._resetOnPosition(0);\r\n        s.paused = false;\r\n\r\n        if (!s.isHTML5) {\r\n          s.playState = 0;\r\n        }\r\n\r\n        // remove onPosition listeners, if any\r\n        detachOnPosition();\r\n\r\n        // and \"to\" position, if set\r\n        if (instanceOptions.to) {\r\n          s.clearOnPosition(instanceOptions.to);\r\n        }\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          flash._stop(s.id, bAll);\r\n\r\n          // hack for netStream: just unload\r\n          if (instanceOptions.serverURL) {\r\n            s.unload();\r\n          }\r\n\r\n        } else if (s._a) {\r\n\r\n            originalPosition = s.position;\r\n\r\n            // act like Flash, though\r\n            s.setPosition(0);\r\n\r\n            // hack: reflect old position for onstop() (also like Flash)\r\n            s.position = originalPosition;\r\n\r\n            // html5 has no stop()\r\n            // NOTE: pausing means iOS requires interaction to resume.\r\n            s._a.pause();\r\n\r\n            s.playState = 0;\r\n\r\n            // and update UI\r\n            s._onTimer();\r\n\r\n            stop_html5_timer();\r\n\r\n          }\r\n\r\n        s.instanceCount = 0;\r\n        s._iO = {};\r\n\r\n        if (instanceOptions.onstop) {\r\n          instanceOptions.onstop.apply(s);\r\n        }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Undocumented/internal: Sets autoPlay for RTMP.\r\n     *\r\n     * @param {boolean} autoPlay state\r\n     */\r\n\r\n    this.setAutoPlay = function(autoPlay) {\r\n\r\n      sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));\r\n      s._iO.autoPlay = autoPlay;\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setAutoPlay(s.id, autoPlay);\r\n        if (autoPlay) {\r\n          // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)\r\n          if (!s.instanceCount && s.readyState === 1) {\r\n            s.instanceCount++;\r\n            sm2._wD(s.id + ': Incremented instance count to ' + s.instanceCount);\r\n          }\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Undocumented/internal: Returns the autoPlay boolean.\r\n     *\r\n     * @return {boolean} The current autoPlay value\r\n     */\r\n\r\n    this.getAutoPlay = function() {\r\n\r\n      return s._iO.autoPlay;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the playback rate of a sound (HTML5-only.)\r\n     *\r\n     * @param {number} playbackRate (+/-)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPlaybackRate = function(playbackRate) {\r\n\r\n      // Per Mozilla, limit acceptable values to prevent playback from stopping (unless allowOverride is truthy.)\r\n      // https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained\r\n      var normalizedRate = Math.max(0.5, Math.min(4, playbackRate));\r\n\r\n      // <d>\r\n      if (normalizedRate !== playbackRate) {\r\n        sm2._wD(s.id + ': setPlaybackRate(' + playbackRate + '): limiting rate to ' + normalizedRate, 2);\r\n      }\r\n      // </d>\r\n\r\n      if (s.isHTML5) {\r\n        try {\r\n          s._iO.playbackRate = normalizedRate;\r\n          s._a.playbackRate = normalizedRate;\r\n        } catch(e) {\r\n          sm2._wD(s.id + ': setPlaybackRate(' + normalizedRate + ') failed: ' + e.message, 2);\r\n        }\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the position of a sound.\r\n     *\r\n     * @param {number} nMsecOffset Position (milliseconds)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPosition = function(nMsecOffset) {\r\n\r\n      if (nMsecOffset === _undefined) {\r\n        nMsecOffset = 0;\r\n      }\r\n\r\n      var position, position1K,\r\n          // Use the duration from the instance options, if we don't have a track duration yet.\r\n          // position >= 0 and <= current available (loaded) duration\r\n          offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));\r\n\r\n      s.position = offset;\r\n      position1K = s.position / msecScale;\r\n      s._resetOnPosition(s.position);\r\n      s._iO.position = offset;\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        position = (fV === 9 ? s.position : position1K);\r\n\r\n        if (s.readyState && s.readyState !== 2) {\r\n          // if paused or not playing, will not resume (by playing)\r\n          flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);\r\n        }\r\n\r\n      } else if (s._a) {\r\n\r\n        // Set the position in the canplay handler if the sound is not ready yet\r\n        if (s._html5_canplay) {\r\n\r\n          if (s._a.currentTime.toFixed(3) !== position1K.toFixed(3)) {\r\n\r\n            /**\r\n             * DOM/JS errors/exceptions to watch out for:\r\n             * if seek is beyond (loaded?) position, \"DOM exception 11\"\r\n             * \"INDEX_SIZE_ERR\": DOM exception 1\r\n             */\r\n            sm2._wD(s.id + ': setPosition(' + position1K + ')');\r\n\r\n            try {\r\n              s._a.currentTime = position1K;\r\n              if (s.playState === 0 || s.paused) {\r\n                // allow seek without auto-play/resume\r\n                s._a.pause();\r\n              }\r\n            } catch(e) {\r\n              sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);\r\n            }\r\n\r\n          }\r\n\r\n        } else if (position1K) {\r\n\r\n          // warn on non-zero seek attempts\r\n          sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);\r\n          return s;\r\n\r\n        }\r\n\r\n        if (s.paused) {\r\n\r\n          // if paused, refresh UI right away by forcing update\r\n          s._onTimer(true);\r\n\r\n        }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Pauses sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.pause = function(_bCallFlash) {\r\n\r\n      if (s.paused || (s.playState === 0 && s.readyState !== 1)) return s;\r\n\r\n      sm2._wD(s.id + ': pause()');\r\n      s.paused = true;\r\n\r\n      if (!s.isHTML5) {\r\n        if (_bCallFlash || _bCallFlash === _undefined) {\r\n          flash._pause(s.id, s._iO.multiShot);\r\n        }\r\n      } else {\r\n        s._setup_html5().pause();\r\n        stop_html5_timer();\r\n      }\r\n\r\n      if (s._iO.onpause) {\r\n        s._iO.onpause.apply(s);\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Resumes sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    /**\r\n     * When auto-loaded streams pause on buffer full they have a playState of 0.\r\n     * We need to make sure that the playState is set to 1 when these streams \"resume\".\r\n     * When a paused stream is resumed, we need to trigger the onplay() callback if it\r\n     * hasn't been called already. In this case since the sound is being played for the\r\n     * first time, I think it's more appropriate to call onplay() rather than onresume().\r\n     */\r\n\r\n    this.resume = function() {\r\n\r\n      var instanceOptions = s._iO;\r\n\r\n      if (!s.paused) return s;\r\n\r\n      sm2._wD(s.id + ': resume()');\r\n      s.paused = false;\r\n      s.playState = 1;\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {\r\n          // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.\r\n          s.setPosition(s.position);\r\n        }\r\n\r\n        // flash method is toggle-based (pause/resume)\r\n        flash._pause(s.id, instanceOptions.multiShot);\r\n\r\n      } else {\r\n\r\n        s._setup_html5().play();\r\n        start_html5_timer();\r\n\r\n      }\r\n\r\n      if (!onplay_called && instanceOptions.onplay) {\r\n\r\n        instanceOptions.onplay.apply(s);\r\n        onplay_called = true;\r\n\r\n      } else if (instanceOptions.onresume) {\r\n\r\n        instanceOptions.onresume.apply(s);\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Toggles sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.togglePause = function() {\r\n\r\n      sm2._wD(s.id + ': togglePause()');\r\n\r\n      if (s.playState === 0) {\r\n        s.play({\r\n          position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)\r\n        });\r\n        return s;\r\n      }\r\n\r\n      if (s.paused) {\r\n        s.resume();\r\n      } else {\r\n        s.pause();\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the panning (L-R) effect.\r\n     *\r\n     * @param {number} nPan The pan value (-100 to 100)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPan = function(nPan, bInstanceOnly) {\r\n\r\n      if (nPan === _undefined) {\r\n        nPan = 0;\r\n      }\r\n\r\n      if (bInstanceOnly === _undefined) {\r\n        bInstanceOnly = false;\r\n      }\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setPan(s.id, nPan);\r\n      } // else { no HTML5 pan? }\r\n\r\n      s._iO.pan = nPan;\r\n\r\n      if (!bInstanceOnly) {\r\n        s.pan = nPan;\r\n        s.options.pan = nPan;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the volume.\r\n     *\r\n     * @param {number} nVol The volume value (0 to 100)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setVolume = function(nVol, _bInstanceOnly) {\r\n\r\n      /**\r\n       * Note: Setting volume has no effect on iOS \"special snowflake\" devices.\r\n       * Hardware volume control overrides software, and volume\r\n       * will always return 1 per Apple docs. (iOS 4 + 5.)\r\n       * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html\r\n       */\r\n\r\n      if (nVol === _undefined) {\r\n        nVol = 100;\r\n      }\r\n\r\n      if (_bInstanceOnly === _undefined) {\r\n        _bInstanceOnly = false;\r\n      }\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted ? 0 : nVol);\r\n\r\n      } else if (s._a) {\r\n\r\n        if (sm2.muted && !s.muted) {\r\n          s.muted = true;\r\n          s._a.muted = true;\r\n        }\r\n\r\n        // valid range for native HTML5 Audio(): 0-1\r\n        s._a.volume = Math.max(0, Math.min(1, nVol / 100));\r\n\r\n      }\r\n\r\n      s._iO.volume = nVol;\r\n\r\n      if (!_bInstanceOnly) {\r\n        s.volume = nVol;\r\n        s.options.volume = nVol;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Mutes the sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.mute = function() {\r\n\r\n      s.muted = true;\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setVolume(s.id, 0);\r\n      } else if (s._a) {\r\n        s._a.muted = true;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unmutes the sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.unmute = function() {\r\n\r\n      s.muted = false;\r\n      var hasIO = (s._iO.volume !== _undefined);\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setVolume(s.id, hasIO ? s._iO.volume : s.options.volume);\r\n      } else if (s._a) {\r\n        s._a.muted = false;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Toggles the muted state of a sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.toggleMute = function() {\r\n\r\n      return (s.muted ? s.unmute() : s.mute());\r\n\r\n    };\r\n\r\n    /**\r\n     * Registers a callback to be fired when a sound reaches a given position during playback.\r\n     *\r\n     * @param {number} nPosition The position to watch for\r\n     * @param {function} oMethod The relevant callback to fire\r\n     * @param {object} oScope Optional: The scope to apply the callback to\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.onPosition = function(nPosition, oMethod, oScope) {\r\n\r\n      // TODO: basic dupe checking?\r\n\r\n      onPositionItems.push({\r\n        position: parseInt(nPosition, 10),\r\n        method: oMethod,\r\n        scope: (oScope !== _undefined ? oScope : s),\r\n        fired: false\r\n      });\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    // legacy/backwards-compability: lower-case method name\r\n    this.onposition = this.onPosition;\r\n\r\n    /**\r\n     * Removes registered callback(s) from a sound, by position and/or callback.\r\n     *\r\n     * @param {number} nPosition The position to clear callback(s) for\r\n     * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.clearOnPosition = function(nPosition, oMethod) {\r\n\r\n      var i;\r\n\r\n      nPosition = parseInt(nPosition, 10);\r\n\r\n      if (isNaN(nPosition)) {\r\n        // safety check\r\n        return;\r\n      }\r\n\r\n      for (i = 0; i < onPositionItems.length; i++) {\r\n\r\n        if (nPosition === onPositionItems[i].position) {\r\n          // remove this item if no method was specified, or, if the method matches\r\n\r\n          if (!oMethod || (oMethod === onPositionItems[i].method)) {\r\n\r\n            if (onPositionItems[i].fired) {\r\n              // decrement \"fired\" counter, too\r\n              onPositionFired--;\r\n            }\r\n\r\n            onPositionItems.splice(i, 1);\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._processOnPosition = function() {\r\n\r\n      var i, item, j = onPositionItems.length;\r\n\r\n      if (!j || !s.playState || onPositionFired >= j) return false;\r\n\r\n      for (i = j - 1; i >= 0; i--) {\r\n\r\n        item = onPositionItems[i];\r\n\r\n        if (!item.fired && s.position >= item.position) {\r\n\r\n          item.fired = true;\r\n          onPositionFired++;\r\n          item.method.apply(item.scope, [item.position]);\r\n\r\n          //  reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.\r\n          j = onPositionItems.length;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._resetOnPosition = function(nPosition) {\r\n\r\n      // reset \"fired\" for items interested in this position\r\n      var i, item, j = onPositionItems.length;\r\n\r\n      if (!j) return false;\r\n\r\n      for (i = j - 1; i >= 0; i--) {\r\n\r\n        item = onPositionItems[i];\r\n\r\n        if (item.fired && nPosition <= item.position) {\r\n          item.fired = false;\r\n          onPositionFired--;\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * SMSound() private internals\r\n     * --------------------------------\r\n     */\r\n\r\n    applyFromTo = function() {\r\n\r\n      var instanceOptions = s._iO,\r\n          f = instanceOptions.from,\r\n          t = instanceOptions.to,\r\n          start, end;\r\n\r\n      end = function() {\r\n\r\n        // end has been reached.\r\n        sm2._wD(s.id + ': \"To\" time of ' + t + ' reached.');\r\n\r\n        // detach listener\r\n        s.clearOnPosition(t, end);\r\n\r\n        // stop should clear this, too\r\n        s.stop();\r\n\r\n      };\r\n\r\n      start = function() {\r\n\r\n        sm2._wD(s.id + ': Playing \"from\" ' + f);\r\n\r\n        // add listener for end\r\n        if (t !== null && !isNaN(t)) {\r\n          s.onPosition(t, end);\r\n        }\r\n\r\n      };\r\n\r\n      if (f !== null && !isNaN(f)) {\r\n\r\n        // apply to instance options, guaranteeing correct start position.\r\n        instanceOptions.position = f;\r\n\r\n        // multiShot timing can't be tracked, so prevent that.\r\n        instanceOptions.multiShot = false;\r\n\r\n        start();\r\n\r\n      }\r\n\r\n      // return updated instanceOptions including starting position\r\n      return instanceOptions;\r\n\r\n    };\r\n\r\n    attachOnPosition = function() {\r\n\r\n      var item,\r\n          op = s._iO.onposition;\r\n\r\n      // attach onposition things, if any, now.\r\n\r\n      if (op) {\r\n\r\n        for (item in op) {\r\n          if (op.hasOwnProperty(item)) {\r\n            s.onPosition(parseInt(item, 10), op[item]);\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    detachOnPosition = function() {\r\n\r\n      var item,\r\n          op = s._iO.onposition;\r\n\r\n      // detach any onposition()-style listeners.\r\n\r\n      if (op) {\r\n\r\n        for (item in op) {\r\n          if (op.hasOwnProperty(item)) {\r\n            s.clearOnPosition(parseInt(item, 10));\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    start_html5_timer = function() {\r\n\r\n      if (s.isHTML5) {\r\n        startTimer(s);\r\n      }\r\n\r\n    };\r\n\r\n    stop_html5_timer = function() {\r\n\r\n      if (s.isHTML5) {\r\n        stopTimer(s);\r\n      }\r\n\r\n    };\r\n\r\n    resetProperties = function(retainPosition) {\r\n\r\n      if (!retainPosition) {\r\n        onPositionItems = [];\r\n        onPositionFired = 0;\r\n      }\r\n\r\n      onplay_called = false;\r\n\r\n      s._hasTimer = null;\r\n      s._a = null;\r\n      s._html5_canplay = false;\r\n      s.bytesLoaded = null;\r\n      s.bytesTotal = null;\r\n      s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);\r\n      s.durationEstimate = null;\r\n      s.buffered = [];\r\n\r\n      // legacy: 1D array\r\n      s.eqData = [];\r\n\r\n      s.eqData.left = [];\r\n      s.eqData.right = [];\r\n\r\n      s.failures = 0;\r\n      s.isBuffering = false;\r\n      s.instanceOptions = {};\r\n      s.instanceCount = 0;\r\n      s.loaded = false;\r\n      s.metadata = {};\r\n\r\n      // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r\n      s.readyState = 0;\r\n\r\n      s.muted = false;\r\n      s.paused = false;\r\n\r\n      s.peakData = {\r\n        left: 0,\r\n        right: 0\r\n      };\r\n\r\n      s.waveformData = {\r\n        left: [],\r\n        right: []\r\n      };\r\n\r\n      s.playState = 0;\r\n      s.position = null;\r\n\r\n      s.id3 = {};\r\n\r\n    };\r\n\r\n    resetProperties();\r\n\r\n    /**\r\n     * Pseudo-private SMSound internals\r\n     * --------------------------------\r\n     */\r\n\r\n    this._onTimer = function(bForce) {\r\n\r\n      /**\r\n       * HTML5-only _whileplaying() etc.\r\n       * called from both HTML5 native events, and polling/interval-based timers\r\n       * mimics flash and fires only when time/duration change, so as to be polling-friendly\r\n       */\r\n\r\n      var duration, isNew = false, time, x = {};\r\n\r\n      if (s._hasTimer || bForce) {\r\n\r\n        // TODO: May not need to track readyState (1 = loading)\r\n\r\n        if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {\r\n\r\n          duration = s._get_html5_duration();\r\n\r\n          if (duration !== lastHTML5State.duration) {\r\n\r\n            lastHTML5State.duration = duration;\r\n            s.duration = duration;\r\n            isNew = true;\r\n\r\n          }\r\n\r\n          // TODO: investigate why this goes wack if not set/re-set each time.\r\n          s.durationEstimate = s.duration;\r\n\r\n          time = (s._a.currentTime * msecScale || 0);\r\n\r\n          if (time !== lastHTML5State.time) {\r\n\r\n            lastHTML5State.time = time;\r\n            isNew = true;\r\n\r\n          }\r\n\r\n          if (isNew || bForce) {\r\n\r\n            s._whileplaying(time, x, x, x, x);\r\n\r\n          }\r\n\r\n        }/* else {\r\n\r\n          // sm2._wD('_onTimer: Warn for \"'+s.id+'\": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));\r\n\r\n          return false;\r\n\r\n        }*/\r\n\r\n      }\r\n\r\n      return isNew;\r\n\r\n    };\r\n\r\n    this._get_html5_duration = function() {\r\n\r\n      var instanceOptions = s._iO,\r\n          // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null\r\n          d = (s._a && s._a.duration ? s._a.duration * msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),\r\n          result = (d && !isNaN(d) && d !== Infinity ? d : null);\r\n\r\n      return result;\r\n\r\n    };\r\n\r\n    this._apply_loop = function(a, nLoops) {\r\n\r\n      /**\r\n       * boolean instead of \"loop\", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop\r\n       * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.\r\n       */\r\n\r\n      // <d>\r\n      if (!a.loop && nLoops > 1) {\r\n        sm2._wD('Note: Native HTML5 looping is infinite.', 1);\r\n      }\r\n      // </d>\r\n\r\n      a.loop = (nLoops > 1 ? 'loop' : '');\r\n\r\n    };\r\n\r\n    this._setup_html5 = function(options) {\r\n\r\n      var instanceOptions = mixin(s._iO, options),\r\n          a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,\r\n          dURL = decodeURI(instanceOptions.url),\r\n          sameURL;\r\n\r\n      /**\r\n       * \"First things first, I, Poppa...\" (reset the previous state of the old sound, if playing)\r\n       * Fixes case with devices that can only play one sound at a time\r\n       * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state\r\n       */\r\n\r\n      if (useGlobalHTML5Audio) {\r\n\r\n        if (dURL === decodeURI(lastGlobalHTML5URL)) {\r\n          // global HTML5 audio: re-use of URL\r\n          sameURL = true;\r\n        }\r\n\r\n      } else if (dURL === decodeURI(lastURL)) {\r\n\r\n        // options URL is the same as the \"last\" URL, and we used (loaded) it\r\n        sameURL = true;\r\n\r\n      }\r\n\r\n      if (a) {\r\n\r\n        if (a._s) {\r\n\r\n          if (useGlobalHTML5Audio) {\r\n\r\n            if (a._s && a._s.playState && !sameURL) {\r\n\r\n              // global HTML5 audio case, and loading a new URL. stop the currently-playing one.\r\n              a._s.stop();\r\n\r\n            }\r\n\r\n          } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {\r\n\r\n            // non-global HTML5 reuse case: same url, ignore request\r\n            s._apply_loop(a, instanceOptions.loops);\r\n\r\n            return a;\r\n\r\n          }\r\n\r\n        }\r\n\r\n        if (!sameURL) {\r\n\r\n          // don't retain onPosition() stuff with new URLs.\r\n\r\n          if (lastURL) {\r\n            resetProperties(false);\r\n          }\r\n\r\n          // assign new HTML5 URL\r\n\r\n          a.src = instanceOptions.url;\r\n\r\n          s.url = instanceOptions.url;\r\n\r\n          lastURL = instanceOptions.url;\r\n\r\n          lastGlobalHTML5URL = instanceOptions.url;\r\n\r\n          a._called_load = false;\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n          s._a = new Audio(instanceOptions.url);\r\n          s._a.load();\r\n\r\n        } else {\r\n\r\n          // null for stupid Opera 9.64 case\r\n          s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());\r\n\r\n        }\r\n\r\n        // assign local reference\r\n        a = s._a;\r\n\r\n        a._called_load = false;\r\n\r\n        if (useGlobalHTML5Audio) {\r\n\r\n          globalHTML5Audio = a;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      s.isHTML5 = true;\r\n\r\n      // store a ref on the track\r\n      s._a = a;\r\n\r\n      // store a ref on the audio\r\n      a._s = s;\r\n\r\n      add_html5_events();\r\n\r\n      s._apply_loop(a, instanceOptions.loops);\r\n\r\n      if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n        s.load();\r\n\r\n      } else {\r\n\r\n        // early HTML5 implementation (non-standard)\r\n        a.autobuffer = false;\r\n\r\n        // standard ('none' is also an option.)\r\n        a.preload = 'auto';\r\n\r\n      }\r\n\r\n      return a;\r\n\r\n    };\r\n\r\n    add_html5_events = function() {\r\n\r\n      if (s._a._added_events) return false;\r\n\r\n      var f;\r\n\r\n      function add(oEvt, oFn, bCapture) {\r\n        return s._a ? s._a.addEventListener(oEvt, oFn, bCapture || false) : null;\r\n      }\r\n\r\n      s._a._added_events = true;\r\n\r\n      for (f in html5_events) {\r\n        if (html5_events.hasOwnProperty(f)) {\r\n          add(f, html5_events[f]);\r\n        }\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    remove_html5_events = function() {\r\n\r\n      // Remove event listeners\r\n\r\n      var f;\r\n\r\n      function remove(oEvt, oFn, bCapture) {\r\n        return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture || false) : null);\r\n      }\r\n\r\n      sm2._wD(s.id + ': Removing event listeners');\r\n      s._a._added_events = false;\r\n\r\n      for (f in html5_events) {\r\n        if (html5_events.hasOwnProperty(f)) {\r\n          remove(f, html5_events[f]);\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Pseudo-private event internals\r\n     * ------------------------------\r\n     */\r\n\r\n    this._onload = function(nSuccess) {\r\n\r\n      var fN,\r\n          // check for duration to prevent false positives from flash 8 when loading from cache.\r\n          loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);\r\n\r\n      // <d>\r\n      fN = s.id + ': ';\r\n      sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));\r\n\r\n      if (!loadOK && !s.isHTML5) {\r\n        if (sm2.sandbox.noRemote === true) {\r\n          sm2._wD(fN + str('noNet'), 1);\r\n        }\r\n        if (sm2.sandbox.noLocal === true) {\r\n          sm2._wD(fN + str('noLocal'), 1);\r\n        }\r\n      }\r\n      // </d>\r\n\r\n      s.loaded = loadOK;\r\n      s.readyState = (loadOK ? 3 : 2);\r\n      s._onbufferchange(0);\r\n\r\n      if (!loadOK && !s.isHTML5) {\r\n        // note: no error code from Flash.\r\n        s._onerror();\r\n      }\r\n\r\n      if (s._iO.onload) {\r\n        wrapCallback(s, function() {\r\n          s._iO.onload.apply(s, [loadOK]);\r\n        });\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._onerror = function(errorCode, description) {\r\n\r\n      // https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n      if (s._iO.onerror) {\r\n        wrapCallback(s, function() {\r\n          s._iO.onerror.apply(s, [errorCode, description]);\r\n        });\r\n      }\r\n\r\n    };\r\n\r\n    this._onbufferchange = function(nIsBuffering) {\r\n\r\n      // ignore if not playing\r\n      if (s.playState === 0) return false;\r\n\r\n      if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) return false;\r\n\r\n      s.isBuffering = (nIsBuffering === 1);\r\n\r\n      if (s._iO.onbufferchange) {\r\n        sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);\r\n        s._iO.onbufferchange.apply(s, [nIsBuffering]);\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * Playback may have stopped due to buffering, or related reason.\r\n     * This state can be encountered on iOS < 6 when auto-play is blocked.\r\n     */\r\n\r\n    this._onsuspend = function() {\r\n\r\n      if (s._iO.onsuspend) {\r\n        sm2._wD(s.id + ': Playback suspended');\r\n        s._iO.onsuspend.apply(s);\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * flash 9/movieStar + RTMP-only method, should fire only once at most\r\n     * at this point we just recreate failed sounds rather than trying to reconnect\r\n     */\r\n\r\n    this._onfailure = function(msg, level, code) {\r\n\r\n      s.failures++;\r\n      sm2._wD(s.id + ': Failure (' + s.failures + '): ' + msg);\r\n\r\n      if (s._iO.onfailure && s.failures === 1) {\r\n        s._iO.onfailure(msg, level, code);\r\n      } else {\r\n        sm2._wD(s.id + ': Ignoring failure');\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * flash 9/movieStar + RTMP-only method for unhandled warnings/exceptions from Flash\r\n     * e.g., RTMP \"method missing\" warning (non-fatal) for getStreamLength on server\r\n     */\r\n\r\n    this._onwarning = function(msg, level, code) {\r\n\r\n      if (s._iO.onwarning) {\r\n        s._iO.onwarning(msg, level, code);\r\n      }\r\n\r\n    };\r\n\r\n    this._onfinish = function() {\r\n\r\n      // store local copy before it gets trashed...\r\n      var io_onfinish = s._iO.onfinish;\r\n\r\n      s._onbufferchange(0);\r\n      s._resetOnPosition(0);\r\n\r\n      // reset some state items\r\n      if (s.instanceCount) {\r\n\r\n        s.instanceCount--;\r\n\r\n        if (!s.instanceCount) {\r\n\r\n          // remove onPosition listeners, if any\r\n          detachOnPosition();\r\n\r\n          // reset instance options\r\n          s.playState = 0;\r\n          s.paused = false;\r\n          s.instanceCount = 0;\r\n          s.instanceOptions = {};\r\n          s._iO = {};\r\n          stop_html5_timer();\r\n\r\n          // reset position, too\r\n          if (s.isHTML5) {\r\n            s.position = 0;\r\n          }\r\n\r\n        }\r\n\r\n        if (!s.instanceCount || s._iO.multiShotEvents) {\r\n          // fire onfinish for last, or every instance\r\n          if (io_onfinish) {\r\n            sm2._wD(s.id + ': onfinish()');\r\n            wrapCallback(s, function() {\r\n              io_onfinish.apply(s);\r\n            });\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {\r\n\r\n      var instanceOptions = s._iO;\r\n\r\n      s.bytesLoaded = nBytesLoaded;\r\n      s.bytesTotal = nBytesTotal;\r\n      s.duration = Math.floor(nDuration);\r\n      s.bufferLength = nBufferLength;\r\n\r\n      if (!s.isHTML5 && !instanceOptions.isMovieStar) {\r\n\r\n        if (instanceOptions.duration) {\r\n          // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.\r\n          s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;\r\n        } else {\r\n          s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);\r\n        }\r\n\r\n      } else {\r\n\r\n        s.durationEstimate = s.duration;\r\n\r\n      }\r\n\r\n      // for flash, reflect sequential-load-style buffering\r\n      if (!s.isHTML5) {\r\n        s.buffered = [{\r\n          start: 0,\r\n          end: s.duration\r\n        }];\r\n      }\r\n\r\n      // allow whileloading to fire even if \"load\" fired under HTML5, due to HTTP range/partials\r\n      if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {\r\n        instanceOptions.whileloading.apply(s);\r\n      }\r\n\r\n    };\r\n\r\n    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {\r\n\r\n      var instanceOptions = s._iO,\r\n          eqLeft;\r\n\r\n      // flash safety net\r\n      if (isNaN(nPosition) || nPosition === null) return false;\r\n\r\n      // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.\r\n      s.position = Math.max(0, nPosition);\r\n\r\n      s._processOnPosition();\r\n\r\n      if (!s.isHTML5 && fV > 8) {\r\n\r\n        if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {\r\n          s.peakData = {\r\n            left: oPeakData.leftPeak,\r\n            right: oPeakData.rightPeak\r\n          };\r\n        }\r\n\r\n        if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {\r\n          s.waveformData = {\r\n            left: oWaveformDataLeft.split(','),\r\n            right: oWaveformDataRight.split(',')\r\n          };\r\n        }\r\n\r\n        if (instanceOptions.useEQData) {\r\n          if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {\r\n            eqLeft = oEQData.leftEQ.split(',');\r\n            s.eqData = eqLeft;\r\n            s.eqData.left = eqLeft;\r\n            if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {\r\n              s.eqData.right = oEQData.rightEQ.split(',');\r\n            }\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n      if (s.playState === 1) {\r\n\r\n        // special case/hack: ensure buffering is false if loading from cache (and not yet started)\r\n        if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {\r\n          s._onbufferchange(0);\r\n        }\r\n\r\n        if (instanceOptions.whileplaying) {\r\n          // flash may call after actual finish\r\n          instanceOptions.whileplaying.apply(s);\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._oncaptiondata = function(oData) {\r\n\r\n      /**\r\n       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n       *\r\n       * @param {object} oData\r\n       */\r\n\r\n      sm2._wD(s.id + ': Caption data received.');\r\n\r\n      s.captiondata = oData;\r\n\r\n      if (s._iO.oncaptiondata) {\r\n        s._iO.oncaptiondata.apply(s, [oData]);\r\n      }\r\n\r\n    };\r\n\r\n    this._onmetadata = function(oMDProps, oMDData) {\r\n\r\n      /**\r\n       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n       * RTMP may include song title, MovieStar content may include encoding info\r\n       *\r\n       * @param {array} oMDProps (names)\r\n       * @param {array} oMDData (values)\r\n       */\r\n\r\n      sm2._wD(s.id + ': Metadata received.');\r\n\r\n      var oData = {}, i, j;\r\n\r\n      for (i = 0, j = oMDProps.length; i < j; i++) {\r\n        oData[oMDProps[i]] = oMDData[i];\r\n      }\r\n\r\n      s.metadata = oData;\r\n\r\n      if (s._iO.onmetadata) {\r\n        s._iO.onmetadata.call(s, s.metadata);\r\n      }\r\n\r\n    };\r\n\r\n    this._onid3 = function(oID3Props, oID3Data) {\r\n\r\n      /**\r\n       * internal: flash 8 + flash 9 ID3 feature\r\n       * may include artist, song title etc.\r\n       *\r\n       * @param {array} oID3Props (names)\r\n       * @param {array} oID3Data (values)\r\n       */\r\n\r\n      sm2._wD(s.id + ': ID3 data received.');\r\n\r\n      var oData = [], i, j;\r\n\r\n      for (i = 0, j = oID3Props.length; i < j; i++) {\r\n        oData[oID3Props[i]] = oID3Data[i];\r\n      }\r\n\r\n      s.id3 = mixin(s.id3, oData);\r\n\r\n      if (s._iO.onid3) {\r\n        s._iO.onid3.apply(s);\r\n      }\r\n\r\n    };\r\n\r\n    // flash/RTMP-only\r\n\r\n    this._onconnect = function(bSuccess) {\r\n\r\n      bSuccess = (bSuccess === 1);\r\n      sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));\r\n      s.connected = bSuccess;\r\n\r\n      if (bSuccess) {\r\n\r\n        s.failures = 0;\r\n\r\n        if (idCheck(s.id)) {\r\n          if (s.getAutoPlay()) {\r\n            // only update the play state if auto playing\r\n            s.play(_undefined, s.getAutoPlay());\r\n          } else if (s._iO.autoLoad) {\r\n            s.load();\r\n          }\r\n        }\r\n\r\n        if (s._iO.onconnect) {\r\n          s._iO.onconnect.apply(s, [bSuccess]);\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._ondataerror = function(sError) {\r\n\r\n      // flash 9 wave/eq data handler\r\n      // hack: called at start, and end from flash at/after onfinish()\r\n      if (s.playState > 0) {\r\n        sm2._wD(s.id + ': Data error: ' + sError);\r\n        if (s._iO.ondataerror) {\r\n          s._iO.ondataerror.apply(s);\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    // <d>\r\n    this._debug();\r\n    // </d>\r\n\r\n  }; // SMSound()\r\n\r\n  /**\r\n   * Private SoundManager internals\r\n   * ------------------------------\r\n   */\r\n\r\n  getDocument = function() {\r\n\r\n    return (doc.body || doc.getElementsByTagName('div')[0]);\r\n\r\n  };\r\n\r\n  id = function(sID) {\r\n\r\n    return doc.getElementById(sID);\r\n\r\n  };\r\n\r\n  mixin = function(oMain, oAdd) {\r\n\r\n    // non-destructive merge\r\n    var o1 = (oMain || {}), o2, o;\r\n\r\n    // if unspecified, o2 is the default options object\r\n    o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);\r\n\r\n    for (o in o2) {\r\n\r\n      if (o2.hasOwnProperty(o) && o1[o] === _undefined) {\r\n\r\n        if (typeof o2[o] !== 'object' || o2[o] === null) {\r\n\r\n          // assign directly\r\n          o1[o] = o2[o];\r\n\r\n        } else {\r\n\r\n          // recurse through o2\r\n          o1[o] = mixin(o1[o], o2[o]);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return o1;\r\n\r\n  };\r\n\r\n  wrapCallback = function(oSound, callback) {\r\n\r\n    /**\r\n     * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue\r\n     * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).\r\n     * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.\r\n     * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.\r\n     * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player\r\n     */\r\n    if (!oSound.isHTML5 && fV === 8) {\r\n      window.setTimeout(callback, 0);\r\n    } else {\r\n      callback();\r\n    }\r\n\r\n  };\r\n\r\n  // additional soundManager properties that soundManager.setup() will accept\r\n\r\n  extraOptions = {\r\n    onready: 1,\r\n    ontimeout: 1,\r\n    defaultOptions: 1,\r\n    flash9Options: 1,\r\n    movieStarOptions: 1\r\n  };\r\n\r\n  assign = function(o, oParent) {\r\n\r\n    /**\r\n     * recursive assignment of properties, soundManager.setup() helper\r\n     * allows property assignment based on whitelist\r\n     */\r\n\r\n    var i,\r\n        result = true,\r\n        hasParent = (oParent !== _undefined),\r\n        setupOptions = sm2.setupOptions,\r\n        bonusOptions = extraOptions;\r\n\r\n    // <d>\r\n\r\n    // if soundManager.setup() called, show accepted parameters.\r\n\r\n    if (o === _undefined) {\r\n\r\n      result = [];\r\n\r\n      for (i in setupOptions) {\r\n\r\n        if (setupOptions.hasOwnProperty(i)) {\r\n          result.push(i);\r\n        }\r\n\r\n      }\r\n\r\n      for (i in bonusOptions) {\r\n\r\n        if (bonusOptions.hasOwnProperty(i)) {\r\n\r\n          if (typeof sm2[i] === 'object') {\r\n            result.push(i + ': {...}');\r\n          } else if (sm2[i] instanceof Function) {\r\n            result.push(i + ': function() {...}');\r\n          } else {\r\n            result.push(i);\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n      sm2._wD(str('setup', result.join(', ')));\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // </d>\r\n\r\n    for (i in o) {\r\n\r\n      if (o.hasOwnProperty(i)) {\r\n\r\n        // if not an {object} we want to recurse through...\r\n\r\n        if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {\r\n\r\n          // check \"allowed\" options\r\n\r\n          if (hasParent && bonusOptions[oParent] !== _undefined) {\r\n\r\n            // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }\r\n            sm2[oParent][i] = o[i];\r\n\r\n          } else if (setupOptions[i] !== _undefined) {\r\n\r\n            // special case: assign to setupOptions object, which soundManager property references\r\n            sm2.setupOptions[i] = o[i];\r\n\r\n            // assign directly to soundManager, too\r\n            sm2[i] = o[i];\r\n\r\n          } else if (bonusOptions[i] === _undefined) {\r\n\r\n            // invalid or disallowed parameter. complain.\r\n            complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n            result = false;\r\n\r\n          } else if (sm2[i] instanceof Function) {\r\n\r\n            /**\r\n             * valid extraOptions (bonusOptions) parameter.\r\n             * is it a method, like onready/ontimeout? call it.\r\n             * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});\r\n             */\r\n            sm2[i].apply(sm2, (o[i] instanceof Array ? o[i] : [o[i]]));\r\n\r\n          } else {\r\n\r\n            // good old-fashioned direct assignment\r\n            sm2[i] = o[i];\r\n\r\n          }\r\n\r\n        } else if (bonusOptions[i] === _undefined) {\r\n\r\n          // recursion case, eg., { defaultOptions: { ... } }\r\n\r\n          // invalid or disallowed parameter. complain.\r\n          complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n          result = false;\r\n\r\n        } else {\r\n\r\n          // recurse through object\r\n          return assign(o[i], i);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  function preferFlashCheck(kind) {\r\n\r\n    // whether flash should play a given type\r\n    return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));\r\n\r\n  }\r\n\r\n  /**\r\n   * Internal DOM2-level event helpers\r\n   * ---------------------------------\r\n   */\r\n\r\n  event = (function() {\r\n\r\n    // normalize event methods\r\n    var old = (window.attachEvent),\r\n    evt = {\r\n      add: (old ? 'attachEvent' : 'addEventListener'),\r\n      remove: (old ? 'detachEvent' : 'removeEventListener')\r\n    };\r\n\r\n    // normalize \"on\" event prefix, optional capture argument\r\n    function getArgs(oArgs) {\r\n\r\n      var args = slice.call(oArgs),\r\n          len = args.length;\r\n\r\n      if (old) {\r\n        // prefix\r\n        args[1] = 'on' + args[1];\r\n        if (len > 3) {\r\n          // no capture\r\n          args.pop();\r\n        }\r\n      } else if (len === 3) {\r\n        args.push(false);\r\n      }\r\n\r\n      return args;\r\n\r\n    }\r\n\r\n    function apply(args, sType) {\r\n\r\n      // normalize and call the event method, with the proper arguments\r\n      var element = args.shift(),\r\n          method = [evt[sType]];\r\n\r\n      if (old) {\r\n        // old IE can't do apply().\r\n        element[method](args[0], args[1]);\r\n      } else {\r\n        element[method].apply(element, args);\r\n      }\r\n\r\n    }\r\n\r\n    function add() {\r\n      apply(getArgs(arguments), 'add');\r\n    }\r\n\r\n    function remove() {\r\n      apply(getArgs(arguments), 'remove');\r\n    }\r\n\r\n    return {\r\n      add: add,\r\n      remove: remove\r\n    };\r\n\r\n  }());\r\n\r\n  /**\r\n   * Internal HTML5 event handling\r\n   * -----------------------------\r\n   */\r\n\r\n  function html5_event(oFn) {\r\n\r\n    // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds\r\n\r\n    return function(e) {\r\n\r\n      var s = this._s,\r\n          result;\r\n\r\n      if (!s || !s._a) {\r\n        // <d>\r\n        if (s && s.id) {\r\n          sm2._wD(s.id + ': Ignoring ' + e.type);\r\n        } else {\r\n          sm2._wD(h5 + 'Ignoring ' + e.type);\r\n        }\r\n        // </d>\r\n        result = null;\r\n      } else {\r\n        result = oFn.call(this, e);\r\n      }\r\n\r\n      return result;\r\n\r\n    };\r\n\r\n  }\r\n\r\n  html5_events = {\r\n\r\n    // HTML5 event-name-to-handler map\r\n\r\n    abort: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': abort');\r\n\r\n    }),\r\n\r\n    // enough has loaded to play\r\n\r\n    canplay: html5_event(function() {\r\n\r\n      var s = this._s,\r\n          position1K;\r\n\r\n      if (s._html5_canplay) {\r\n        // this event has already fired. ignore.\r\n        return;\r\n      }\r\n\r\n      s._html5_canplay = true;\r\n      sm2._wD(s.id + ': canplay');\r\n      s._onbufferchange(0);\r\n\r\n      // position according to instance options\r\n      position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position / msecScale : null);\r\n\r\n      // set the position if position was provided before the sound loaded\r\n      if (this.currentTime !== position1K) {\r\n        sm2._wD(s.id + ': canplay: Setting position to ' + position1K);\r\n        try {\r\n          this.currentTime = position1K;\r\n        } catch(ee) {\r\n          sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);\r\n        }\r\n      }\r\n\r\n      // hack for HTML5 from/to case\r\n      if (s._iO._oncanplay) {\r\n        s._iO._oncanplay();\r\n      }\r\n\r\n    }),\r\n\r\n    canplaythrough: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      if (!s.loaded) {\r\n        s._onbufferchange(0);\r\n        s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());\r\n        s._onload(true);\r\n      }\r\n\r\n    }),\r\n\r\n    durationchange: html5_event(function() {\r\n\r\n      // durationchange may fire at various times, probably the safest way to capture accurate/final duration.\r\n\r\n      var s = this._s,\r\n          duration;\r\n\r\n      duration = s._get_html5_duration();\r\n\r\n      if (!isNaN(duration) && duration !== s.duration) {\r\n\r\n        sm2._wD(this._s.id + ': durationchange (' + duration + ')' + (s.duration ? ', previously ' + s.duration : ''));\r\n\r\n        s.durationEstimate = s.duration = duration;\r\n\r\n      }\r\n\r\n    }),\r\n\r\n    // TODO: Reserved for potential use\r\n    /*\r\n    emptied: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': emptied');\r\n\r\n    }),\r\n    */\r\n\r\n    ended: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      sm2._wD(s.id + ': ended');\r\n\r\n      s._onfinish();\r\n\r\n    }),\r\n\r\n    error: html5_event(function() {\r\n\r\n      var description = (html5ErrorCodes[this.error.code] || null);\r\n      sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code + (description ? ' (' + description + ')' : ''));\r\n      this._s._onload(false);\r\n      this._s._onerror(this.error.code, description);\r\n\r\n    }),\r\n\r\n    loadeddata: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      sm2._wD(s.id + ': loadeddata');\r\n\r\n      // safari seems to nicely report progress events, eventually totalling 100%\r\n      if (!s._loaded && !isSafari) {\r\n        s.duration = s._get_html5_duration();\r\n      }\r\n\r\n    }),\r\n\r\n    loadedmetadata: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': loadedmetadata');\r\n\r\n    }),\r\n\r\n    loadstart: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': loadstart');\r\n      // assume buffering at first\r\n      this._s._onbufferchange(1);\r\n\r\n    }),\r\n\r\n    play: html5_event(function() {\r\n\r\n      // sm2._wD(this._s.id + ': play()');\r\n      // once play starts, no buffering\r\n      this._s._onbufferchange(0);\r\n\r\n    }),\r\n\r\n    playing: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': playing ' + String.fromCharCode(9835));\r\n      // once play starts, no buffering\r\n      this._s._onbufferchange(0);\r\n\r\n    }),\r\n\r\n    progress: html5_event(function(e) {\r\n\r\n      // note: can fire repeatedly after \"loaded\" event, due to use of HTTP range/partials\r\n\r\n      var s = this._s,\r\n          i, j, progStr, buffered = 0,\r\n          isProgress = (e.type === 'progress'),\r\n          ranges = e.target.buffered,\r\n          // firefox 3.6 implements e.loaded/total (bytes)\r\n          loaded = (e.loaded || 0),\r\n          total = (e.total || 1);\r\n\r\n      // reset the \"buffered\" (loaded byte ranges) array\r\n      s.buffered = [];\r\n\r\n      if (ranges && ranges.length) {\r\n\r\n        // if loaded is 0, try TimeRanges implementation as % of load\r\n        // https://developer.mozilla.org/en/DOM/TimeRanges\r\n\r\n        // re-build \"buffered\" array\r\n        // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.\r\n        for (i = 0, j = ranges.length; i < j; i++) {\r\n          s.buffered.push({\r\n            start: ranges.start(i) * msecScale,\r\n            end: ranges.end(i) * msecScale\r\n          });\r\n        }\r\n\r\n        // use the last value locally\r\n        buffered = (ranges.end(0) - ranges.start(0)) * msecScale;\r\n\r\n        // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges\r\n        loaded = Math.min(1, buffered / (e.target.duration * msecScale));\r\n\r\n        // <d>\r\n        if (isProgress && ranges.length > 1) {\r\n          progStr = [];\r\n          j = ranges.length;\r\n          for (i = 0; i < j; i++) {\r\n            progStr.push((e.target.buffered.start(i) * msecScale) + '-' + (e.target.buffered.end(i) * msecScale));\r\n          }\r\n          sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));\r\n        }\r\n\r\n        if (isProgress && !isNaN(loaded)) {\r\n          sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded * 100) + '% loaded');\r\n        }\r\n        // </d>\r\n\r\n      }\r\n\r\n      if (!isNaN(loaded)) {\r\n\r\n        // TODO: prevent calls with duplicate values.\r\n        s._whileloading(loaded, total, s._get_html5_duration());\r\n        if (loaded && total && loaded === total) {\r\n          // in case \"onload\" doesn't fire (eg. gecko 1.9.2)\r\n          html5_events.canplaythrough.call(this, e);\r\n        }\r\n\r\n      }\r\n\r\n    }),\r\n\r\n    ratechange: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': ratechange');\r\n\r\n    }),\r\n\r\n    suspend: html5_event(function(e) {\r\n\r\n      // download paused/stopped, may have finished (eg. onload)\r\n      var s = this._s;\r\n\r\n      sm2._wD(this._s.id + ': suspend');\r\n      html5_events.progress.call(this, e);\r\n      s._onsuspend();\r\n\r\n    }),\r\n\r\n    stalled: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': stalled');\r\n\r\n    }),\r\n\r\n    timeupdate: html5_event(function() {\r\n\r\n      this._s._onTimer();\r\n\r\n    }),\r\n\r\n    waiting: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      // see also: seeking\r\n      sm2._wD(this._s.id + ': waiting');\r\n\r\n      // playback faster than download rate, etc.\r\n      s._onbufferchange(1);\r\n\r\n    })\r\n\r\n  };\r\n\r\n  html5OK = function(iO) {\r\n\r\n    // playability test based on URL or MIME type\r\n\r\n    var result;\r\n\r\n    if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {\r\n\r\n      // nothing to check\r\n      result = false;\r\n\r\n    } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {\r\n\r\n      // RTMP, or preferring flash\r\n      result = false;\r\n\r\n    } else {\r\n\r\n      // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er\r\n      result = ((iO.type ? html5CanPlay({ type: iO.type }) : html5CanPlay({ url: iO.url }) || sm2.html5Only || iO.url.match(/data:/i)));\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  html5Unload = function(oAudio) {\r\n\r\n    /**\r\n     * Internal method: Unload media, and cancel any current/pending network requests.\r\n     * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.\r\n     * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media\r\n     * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.\r\n     * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.\r\n     */\r\n\r\n    var url;\r\n\r\n    if (oAudio) {\r\n\r\n      // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME.\r\n      // Desktop Safari complains / fails on data: URI, so it gets about:blank.\r\n      url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));\r\n\r\n      oAudio.src = url;\r\n\r\n      // reset some state, too\r\n      if (oAudio._called_unload !== _undefined) {\r\n        oAudio._called_load = false;\r\n      }\r\n\r\n    }\r\n\r\n    if (useGlobalHTML5Audio) {\r\n\r\n      // ensure URL state is trashed, also\r\n      lastGlobalHTML5URL = null;\r\n\r\n    }\r\n\r\n    return url;\r\n\r\n  };\r\n\r\n  html5CanPlay = function(o) {\r\n\r\n    /**\r\n     * Try to find MIME, test and return truthiness\r\n     * o = {\r\n     *  url: '/path/to/an.mp3',\r\n     *  type: 'audio/mp3'\r\n     * }\r\n     */\r\n\r\n    if (!sm2.useHTML5Audio || !sm2.hasHTML5) return false;\r\n\r\n    var url = (o.url || null),\r\n        mime = (o.type || null),\r\n        aF = sm2.audioFormats,\r\n        result,\r\n        offset,\r\n        fileExt,\r\n        item;\r\n\r\n    // account for known cases like audio/mp3\r\n\r\n    if (mime && sm2.html5[mime] !== _undefined) return (sm2.html5[mime] && !preferFlashCheck(mime));\r\n\r\n    if (!html5Ext) {\r\n\r\n      html5Ext = [];\r\n\r\n      for (item in aF) {\r\n\r\n        if (aF.hasOwnProperty(item)) {\r\n\r\n          html5Ext.push(item);\r\n\r\n          if (aF[item].related) {\r\n            html5Ext = html5Ext.concat(aF[item].related);\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n      html5Ext = new RegExp('\\\\.(' + html5Ext.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n    }\r\n\r\n    // TODO: Strip URL queries, etc.\r\n    fileExt = (url ? url.toLowerCase().match(html5Ext) : null);\r\n\r\n    if (!fileExt || !fileExt.length) {\r\n\r\n      if (!mime) {\r\n\r\n        result = false;\r\n\r\n      } else {\r\n\r\n        // audio/mp3 -> mp3, result should be known\r\n        offset = mime.indexOf(';');\r\n\r\n        // strip \"audio/X; codecs...\"\r\n        fileExt = (offset !== -1 ? mime.substr(0, offset) : mime).substr(6);\r\n\r\n      }\r\n\r\n    } else {\r\n\r\n      // match the raw extension name - \"mp3\", for example\r\n      fileExt = fileExt[1];\r\n\r\n    }\r\n\r\n    if (fileExt && sm2.html5[fileExt] !== _undefined) {\r\n\r\n      // result known\r\n      result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));\r\n\r\n    } else {\r\n\r\n      mime = 'audio/' + fileExt;\r\n      result = sm2.html5.canPlayType({ type: mime });\r\n\r\n      sm2.html5[fileExt] = result;\r\n\r\n      // sm2._wD('canPlayType, found result: ' + result);\r\n      result = (result && sm2.html5[mime] && !preferFlashCheck(mime));\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  testHTML5 = function() {\r\n\r\n    /**\r\n     * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on\r\n     * assigns results to html5[] and flash[].\r\n     */\r\n\r\n    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {\r\n\r\n      // without HTML5, we need Flash.\r\n      sm2.html5.usingFlash = true;\r\n      needsFlash = true;\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load \"null\" as a URL. :/\r\n    var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),\r\n        item, lookup, support = {}, aF, i;\r\n\r\n    function cp(m) {\r\n\r\n      var canPlay, j,\r\n          result = false,\r\n          isOK = false;\r\n\r\n      if (!a || typeof a.canPlayType !== 'function') return result;\r\n\r\n      if (m instanceof Array) {\r\n\r\n        // iterate through all mime types, return any successes\r\n\r\n        for (i = 0, j = m.length; i < j; i++) {\r\n\r\n          if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {\r\n\r\n            isOK = true;\r\n            sm2.html5[m[i]] = true;\r\n\r\n            // note flash support, too\r\n            sm2.flash[m[i]] = !!(m[i].match(flashMIME));\r\n\r\n          }\r\n\r\n        }\r\n\r\n        result = isOK;\r\n\r\n      } else {\r\n\r\n        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);\r\n        result = !!(canPlay && (canPlay.match(sm2.html5Test)));\r\n\r\n      }\r\n\r\n      return result;\r\n\r\n    }\r\n\r\n    // test all registered formats + codecs\r\n\r\n    aF = sm2.audioFormats;\r\n\r\n    for (item in aF) {\r\n\r\n      if (aF.hasOwnProperty(item)) {\r\n\r\n        lookup = 'audio/' + item;\r\n\r\n        support[item] = cp(aF[item].type);\r\n\r\n        // write back generic type too, eg. audio/mp3\r\n        support[lookup] = support[item];\r\n\r\n        // assign flash\r\n        if (item.match(flashMIME)) {\r\n\r\n          sm2.flash[item] = true;\r\n          sm2.flash[lookup] = true;\r\n\r\n        } else {\r\n\r\n          sm2.flash[item] = false;\r\n          sm2.flash[lookup] = false;\r\n\r\n        }\r\n\r\n        // assign result to related formats, too\r\n\r\n        if (aF[item] && aF[item].related) {\r\n\r\n          for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n\r\n            // eg. audio/m4a\r\n            support['audio/' + aF[item].related[i]] = support[item];\r\n            sm2.html5[aF[item].related[i]] = support[item];\r\n            sm2.flash[aF[item].related[i]] = support[item];\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    support.canPlayType = (a ? cp : null);\r\n    sm2.html5 = mixin(sm2.html5, support);\r\n\r\n    sm2.html5.usingFlash = featureCheck();\r\n    needsFlash = sm2.html5.usingFlash;\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  strings = {\r\n\r\n    // <d>\r\n    notReady: 'Unavailable - wait until onready() has fired.',\r\n    notOK: 'Audio support is not available.',\r\n    domError: sm + 'exception caught while appending SWF to DOM.',\r\n    spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',\r\n    swf404: smc + 'Verify that %s is a valid path.',\r\n    tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',\r\n    checkSWF: 'See SWF output for more debug info.',\r\n    localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',\r\n    waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',\r\n    waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',\r\n    waitSWF: smc + 'Waiting for 100% SWF load...',\r\n    needFunction: smc + 'Function object expected for %s',\r\n    badID: 'Sound ID \"%s\" should be a string, starting with a non-numeric character',\r\n    currentObj: smc + '_debug(): Current sound objects',\r\n    waitOnload: smc + 'Waiting for window.onload()',\r\n    docLoaded: smc + 'Document already loaded',\r\n    onload: smc + 'initComplete(): calling soundManager.onload()',\r\n    onloadOK: sm + '.onload() complete',\r\n    didInit: smc + 'init(): Already called?',\r\n    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',\r\n    badRemove: smc + 'Failed to remove Flash node.',\r\n    shutdown: sm + '.disable(): Shutting down',\r\n    queue: smc + 'Queueing %s handler',\r\n    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',\r\n    fbTimeout: 'No flash response, applying .' + swfCSS.swfTimedout + ' CSS...',\r\n    fbLoaded: 'Flash loaded',\r\n    fbHandler: smc + 'flashBlockHandler()',\r\n    manURL: 'SMSound.load(): Using manually-assigned URL',\r\n    onURL: sm + '.load(): current URL already assigned.',\r\n    badFV: sm + '.flashVersion must be 8 or 9. \"%s\" is invalid. Reverting to %s.',\r\n    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',\r\n    noNSLoop: 'Note: Looping not implemented for MovieStar formats',\r\n    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',\r\n    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',\r\n    needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',\r\n    gotFocus: smc + 'Got window focus.',\r\n    policy: 'Enabling usePolicyFile for data access',\r\n    setup: sm + '.setup(): allowed parameters: %s',\r\n    setupError: sm + '.setup(): \"%s\" cannot be assigned with this method.',\r\n    setupUndef: sm + '.setup(): Could not find option \"%s\"',\r\n    setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',\r\n    noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',\r\n    sm2Loaded: 'SoundManager 2: Ready. ' + String.fromCharCode(10003),\r\n    reset: sm + '.reset(): Removing event callbacks',\r\n    mobileUA: 'Mobile UA detected, preferring HTML5 by default.',\r\n    globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.',\r\n    ignoreMobile: 'Ignoring mobile restrictions for this device.'\r\n    // </d>\r\n\r\n  };\r\n\r\n  str = function() {\r\n\r\n    // internal string replace helper.\r\n    // arguments: o [,items to replace]\r\n    // <d>\r\n\r\n    var args,\r\n        i, j, o,\r\n        sstr;\r\n\r\n    // real array, please\r\n    args = slice.call(arguments);\r\n\r\n    // first argument\r\n    o = args.shift();\r\n\r\n    sstr = (strings && strings[o] ? strings[o] : '');\r\n\r\n    if (sstr && args && args.length) {\r\n      for (i = 0, j = args.length; i < j; i++) {\r\n        sstr = sstr.replace('%s', args[i]);\r\n      }\r\n    }\r\n\r\n    return sstr;\r\n    // </d>\r\n\r\n  };\r\n\r\n  loopFix = function(sOpt) {\r\n\r\n    // flash 8 requires stream = false for looping to work\r\n    if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {\r\n      _wDS('as2loop');\r\n      sOpt.stream = false;\r\n    }\r\n\r\n    return sOpt;\r\n\r\n  };\r\n\r\n  policyFix = function(sOpt, sPre) {\r\n\r\n    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {\r\n      sm2._wD((sPre || '') + str('policy'));\r\n      sOpt.usePolicyFile = true;\r\n    }\r\n\r\n    return sOpt;\r\n\r\n  };\r\n\r\n  complain = function(sMsg) {\r\n\r\n    // <d>\r\n    if (hasConsole && console.warn !== _undefined) {\r\n      console.warn(sMsg);\r\n    } else {\r\n      sm2._wD(sMsg);\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  doNothing = function() {\r\n\r\n    return false;\r\n\r\n  };\r\n\r\n  disableObject = function(o) {\r\n\r\n    var oProp;\r\n\r\n    for (oProp in o) {\r\n      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {\r\n        o[oProp] = doNothing;\r\n      }\r\n    }\r\n\r\n    oProp = null;\r\n\r\n  };\r\n\r\n  failSafely = function(bNoDisable) {\r\n\r\n    // general failure exception handler\r\n\r\n    if (bNoDisable === _undefined) {\r\n      bNoDisable = false;\r\n    }\r\n\r\n    if (disabled || bNoDisable) {\r\n      sm2.disable(bNoDisable);\r\n    }\r\n\r\n  };\r\n\r\n  normalizeMovieURL = function(movieURL) {\r\n\r\n    var urlParams = null, url;\r\n\r\n    if (movieURL) {\r\n\r\n      if (movieURL.match(/\\.swf(\\?.*)?$/i)) {\r\n\r\n        urlParams = movieURL.substr(movieURL.toLowerCase().lastIndexOf('.swf?') + 4);\r\n\r\n        // assume user knows what they're doing\r\n        if (urlParams) return movieURL;\r\n\r\n      } else if (movieURL.lastIndexOf('/') !== movieURL.length - 1) {\r\n\r\n        // append trailing slash, if needed\r\n        movieURL += '/';\r\n\r\n      }\r\n\r\n    }\r\n\r\n    url = (movieURL && movieURL.lastIndexOf('/') !== -1 ? movieURL.substr(0, movieURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;\r\n\r\n    if (sm2.noSWFCache) {\r\n      url += ('?ts=' + new Date().getTime());\r\n    }\r\n\r\n    return url;\r\n\r\n  };\r\n\r\n  setVersionInfo = function() {\r\n\r\n    // short-hand for internal use\r\n\r\n    fV = parseInt(sm2.flashVersion, 10);\r\n\r\n    if (fV !== 8 && fV !== 9) {\r\n      sm2._wD(str('badFV', fV, defaultFlashVersion));\r\n      sm2.flashVersion = fV = defaultFlashVersion;\r\n    }\r\n\r\n    // debug flash movie, if applicable\r\n\r\n    var isDebug = (sm2.debugMode || sm2.debugFlash ? '_debug.swf' : '.swf');\r\n\r\n    if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {\r\n      sm2._wD(str('needfl9'));\r\n      sm2.flashVersion = fV = 9;\r\n    }\r\n\r\n    sm2.version = sm2.versionNumber + (sm2.html5Only ? ' (HTML5-only mode)' : (fV === 9 ? ' (AS3/Flash 9)' : ' (AS2/Flash 8)'));\r\n\r\n    // set up default options\r\n    if (fV > 8) {\r\n\r\n      // +flash 9 base options\r\n      sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);\r\n      sm2.features.buffering = true;\r\n\r\n      // +moviestar support\r\n      sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);\r\n      sm2.filePatterns.flash9 = new RegExp('\\\\.(mp3|' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n      sm2.features.movieStar = true;\r\n\r\n    } else {\r\n\r\n      sm2.features.movieStar = false;\r\n\r\n    }\r\n\r\n    // regExp for flash canPlay(), etc.\r\n    sm2.filePattern = sm2.filePatterns[(fV !== 8 ? 'flash9' : 'flash8')];\r\n\r\n    // if applicable, use _debug versions of SWFs\r\n    sm2.movieURL = (fV === 8 ? 'soundmanager2.swf' : 'soundmanager2_flash9.swf').replace('.swf', isDebug);\r\n\r\n    sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);\r\n\r\n  };\r\n\r\n  setPolling = function(bPolling, bHighPerformance) {\r\n\r\n    if (!flash) {\r\n      return;\r\n    }\r\n\r\n    flash._setPolling(bPolling, bHighPerformance);\r\n\r\n  };\r\n\r\n  initDebug = function() {\r\n\r\n    // starts debug mode, creating output <div> for UAs without console object\r\n\r\n    // allow force of debug mode via URL\r\n    // <d>\r\n    if (sm2.debugURLParam.test(wl)) {\r\n      sm2.setupOptions.debugMode = sm2.debugMode = true;\r\n    }\r\n\r\n    if (id(sm2.debugID)) {\r\n      return;\r\n    }\r\n\r\n    var oD, oDebug, oTarget, oToggle, tmp;\r\n\r\n    if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {\r\n\r\n      oD = doc.createElement('div');\r\n      oD.id = sm2.debugID + '-toggle';\r\n\r\n      oToggle = {\r\n        position: 'fixed',\r\n        bottom: '0px',\r\n        right: '0px',\r\n        width: '1.2em',\r\n        height: '1.2em',\r\n        lineHeight: '1.2em',\r\n        margin: '2px',\r\n        textAlign: 'center',\r\n        border: '1px solid #999',\r\n        cursor: 'pointer',\r\n        background: '#fff',\r\n        color: '#333',\r\n        zIndex: 10001\r\n      };\r\n\r\n      oD.appendChild(doc.createTextNode('-'));\r\n      oD.onclick = toggleDebug;\r\n      oD.title = 'Toggle SM2 debug console';\r\n\r\n      if (ua.match(/msie 6/i)) {\r\n        oD.style.position = 'absolute';\r\n        oD.style.cursor = 'hand';\r\n      }\r\n\r\n      for (tmp in oToggle) {\r\n        if (oToggle.hasOwnProperty(tmp)) {\r\n          oD.style[tmp] = oToggle[tmp];\r\n        }\r\n      }\r\n\r\n      oDebug = doc.createElement('div');\r\n      oDebug.id = sm2.debugID;\r\n      oDebug.style.display = (sm2.debugMode ? 'block' : 'none');\r\n\r\n      if (sm2.debugMode && !id(oD.id)) {\r\n        try {\r\n          oTarget = getDocument();\r\n          oTarget.appendChild(oD);\r\n        } catch(e2) {\r\n          throw new Error(str('domError') + ' \\n' + e2.toString());\r\n        }\r\n        oTarget.appendChild(oDebug);\r\n      }\r\n\r\n    }\r\n\r\n    oTarget = null;\r\n    // </d>\r\n\r\n  };\r\n\r\n  idCheck = this.getSoundById;\r\n\r\n  // <d>\r\n  _wDS = function(o, errorLevel) {\r\n\r\n    return (!o ? '' : sm2._wD(str(o), errorLevel));\r\n\r\n  };\r\n\r\n  toggleDebug = function() {\r\n\r\n    var o = id(sm2.debugID),\r\n    oT = id(sm2.debugID + '-toggle');\r\n\r\n    if (!o) {\r\n      return;\r\n    }\r\n\r\n    if (debugOpen) {\r\n      // minimize\r\n      oT.innerHTML = '+';\r\n      o.style.display = 'none';\r\n    } else {\r\n      oT.innerHTML = '-';\r\n      o.style.display = 'block';\r\n    }\r\n\r\n    debugOpen = !debugOpen;\r\n\r\n  };\r\n\r\n  debugTS = function(sEventType, bSuccess, sMessage) {\r\n\r\n    // troubleshooter debug hooks\r\n\r\n    if (window.sm2Debugger !== _undefined) {\r\n      try {\r\n        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);\r\n      } catch(e) {\r\n        // oh well\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n  // </d>\r\n\r\n  getSWFCSS = function() {\r\n\r\n    var css = [];\r\n\r\n    if (sm2.debugMode) {\r\n      css.push(swfCSS.sm2Debug);\r\n    }\r\n\r\n    if (sm2.debugFlash) {\r\n      css.push(swfCSS.flashDebug);\r\n    }\r\n\r\n    if (sm2.useHighPerformance) {\r\n      css.push(swfCSS.highPerf);\r\n    }\r\n\r\n    return css.join(' ');\r\n\r\n  };\r\n\r\n  flashBlockHandler = function() {\r\n\r\n    // *possible* flash block situation.\r\n\r\n    var name = str('fbHandler'),\r\n        p = sm2.getMoviePercent(),\r\n        css = swfCSS,\r\n        error = {\r\n          type: 'FLASHBLOCK'\r\n        };\r\n\r\n    if (sm2.html5Only) {\r\n      // no flash, or unused\r\n      return;\r\n    }\r\n\r\n    if (!sm2.ok()) {\r\n\r\n      if (needsFlash) {\r\n        // make the movie more visible, so user can fix\r\n        sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null ? css.swfTimedout : css.swfError);\r\n        sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));\r\n      }\r\n\r\n      sm2.didFlashBlock = true;\r\n\r\n      // fire onready(), complain lightly\r\n      processOnEvents({\r\n        type: 'ontimeout',\r\n        ignoreInit: true,\r\n        error: error\r\n      });\r\n\r\n      catchError(error);\r\n\r\n    } else {\r\n\r\n      // SM2 loaded OK (or recovered)\r\n\r\n      // <d>\r\n      if (sm2.didFlashBlock) {\r\n        sm2._wD(name + ': Unblocked');\r\n      }\r\n      // </d>\r\n\r\n      if (sm2.oMC) {\r\n        sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock ? ' ' + css.swfUnblocked : '')].join(' ');\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  addOnEvent = function(sType, oMethod, oScope) {\r\n\r\n    if (on_queue[sType] === _undefined) {\r\n      on_queue[sType] = [];\r\n    }\r\n\r\n    on_queue[sType].push({\r\n      method: oMethod,\r\n      scope: (oScope || null),\r\n      fired: false\r\n    });\r\n\r\n  };\r\n\r\n  processOnEvents = function(oOptions) {\r\n\r\n    // if unspecified, assume OK/error\r\n\r\n    if (!oOptions) {\r\n      oOptions = {\r\n        type: (sm2.ok() ? 'onready' : 'ontimeout')\r\n      };\r\n    }\r\n\r\n    // not ready yet.\r\n    if (!didInit && oOptions && !oOptions.ignoreInit) return false;\r\n\r\n    // invalid case\r\n    if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) return false;\r\n\r\n    var status = {\r\n          success: (oOptions && oOptions.ignoreInit ? sm2.ok() : !disabled)\r\n        },\r\n\r\n        // queue specified by type, or none\r\n        srcQueue = (oOptions && oOptions.type ? on_queue[oOptions.type] || [] : []),\r\n\r\n        queue = [], i, j,\r\n        args = [status],\r\n        canRetry = (needsFlash && !sm2.ok());\r\n\r\n    if (oOptions.error) {\r\n      args[0].error = oOptions.error;\r\n    }\r\n\r\n    for (i = 0, j = srcQueue.length; i < j; i++) {\r\n      if (srcQueue[i].fired !== true) {\r\n        queue.push(srcQueue[i]);\r\n      }\r\n    }\r\n\r\n    if (queue.length) {\r\n\r\n      // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));\r\n      for (i = 0, j = queue.length; i < j; i++) {\r\n\r\n        if (queue[i].scope) {\r\n          queue[i].method.apply(queue[i].scope, args);\r\n        } else {\r\n          queue[i].method.apply(this, args);\r\n        }\r\n\r\n        if (!canRetry) {\r\n          // useFlashBlock and SWF timeout case doesn't count here.\r\n          queue[i].fired = true;\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  initUserOnload = function() {\r\n\r\n    window.setTimeout(function() {\r\n\r\n      if (sm2.useFlashBlock) {\r\n        flashBlockHandler();\r\n      }\r\n\r\n      processOnEvents();\r\n\r\n      // call user-defined \"onload\", scoped to window\r\n\r\n      if (typeof sm2.onload === 'function') {\r\n        _wDS('onload', 1);\r\n        sm2.onload.apply(window);\r\n        _wDS('onloadOK', 1);\r\n      }\r\n\r\n      if (sm2.waitForWindowLoad) {\r\n        event.add(window, 'load', initUserOnload);\r\n      }\r\n\r\n    }, 1);\r\n\r\n  };\r\n\r\n  detectFlash = function() {\r\n\r\n    /**\r\n     * Hat tip: Flash Detect library (BSD, (C) 2007) by Carl \"DocYes\" S. Yestrau\r\n     * http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt\r\n     */\r\n\r\n    // this work has already been done.\r\n    if (hasFlash !== _undefined) return hasFlash;\r\n\r\n    var hasPlugin = false, n = navigator, obj, type, types, AX = window.ActiveXObject;\r\n\r\n    // MS Edge 14 throws an \"Unspecified Error\" because n.plugins is inaccessible due to permissions\r\n    var nP;\r\n\r\n    try {\r\n      nP = n.plugins;\r\n    } catch(e) {\r\n      nP = undefined;\r\n    }\r\n\r\n    if (nP && nP.length) {\r\n\r\n      type = 'application/x-shockwave-flash';\r\n      types = n.mimeTypes;\r\n\r\n      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {\r\n        hasPlugin = true;\r\n      }\r\n\r\n    } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {\r\n\r\n      // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.\r\n      try {\r\n        obj = new AX('ShockwaveFlash.ShockwaveFlash');\r\n      } catch(e) {\r\n        // oh well\r\n        obj = null;\r\n      }\r\n\r\n      hasPlugin = (!!obj);\r\n\r\n      // cleanup, because it is ActiveX after all\r\n      obj = null;\r\n\r\n    }\r\n\r\n    hasFlash = hasPlugin;\r\n\r\n    return hasPlugin;\r\n\r\n  };\r\n\r\n  featureCheck = function() {\r\n\r\n    var flashNeeded,\r\n        item,\r\n        formats = sm2.audioFormats,\r\n        // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.\r\n        isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)\\s/i)));\r\n\r\n    if (isSpecial) {\r\n\r\n      // has Audio(), but is broken; let it load links directly.\r\n      sm2.hasHTML5 = false;\r\n\r\n      // ignore flash case, however\r\n      sm2.html5Only = true;\r\n\r\n      // hide the SWF, if present\r\n      if (sm2.oMC) {\r\n        sm2.oMC.style.display = 'none';\r\n      }\r\n\r\n    } else if (sm2.useHTML5Audio) {\r\n\r\n        if (!sm2.html5 || !sm2.html5.canPlayType) {\r\n          sm2._wD('SoundManager: No HTML5 Audio() support detected.');\r\n          sm2.hasHTML5 = false;\r\n        }\r\n\r\n        // <d>\r\n        if (isBadSafari) {\r\n          sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ? ' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);\r\n        }\r\n        // </d>\r\n\r\n      }\r\n\r\n    if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n\r\n      // sort out whether flash is optional, required or can be ignored.\r\n\r\n      // innocent until proven guilty.\r\n      canIgnoreFlash = true;\r\n\r\n      for (item in formats) {\r\n\r\n        if (formats.hasOwnProperty(item)) {\r\n\r\n          if (formats[item].required) {\r\n\r\n            if (!sm2.html5.canPlayType(formats[item].type)) {\r\n\r\n              // 100% HTML5 mode is not possible.\r\n              canIgnoreFlash = false;\r\n              flashNeeded = true;\r\n\r\n            } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {\r\n\r\n              // flash may be required, or preferred for this format.\r\n              flashNeeded = true;\r\n\r\n            }\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // sanity check...\r\n    if (sm2.ignoreFlash) {\r\n      flashNeeded = false;\r\n      canIgnoreFlash = true;\r\n    }\r\n\r\n    sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);\r\n\r\n    return (!sm2.html5Only);\r\n\r\n  };\r\n\r\n  parseURL = function(url) {\r\n\r\n    /**\r\n     * Internal: Finds and returns the first playable URL (or failing that, the first URL.)\r\n     * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.\r\n     */\r\n\r\n    var i, j, urlResult = 0, result;\r\n\r\n    if (url instanceof Array) {\r\n\r\n      // find the first good one\r\n      for (i = 0, j = url.length; i < j; i++) {\r\n\r\n        if (url[i] instanceof Object) {\r\n\r\n          // MIME check\r\n          if (sm2.canPlayMIME(url[i].type)) {\r\n            urlResult = i;\r\n            break;\r\n          }\r\n\r\n        } else if (sm2.canPlayURL(url[i])) {\r\n\r\n          // URL string check\r\n          urlResult = i;\r\n          break;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      // normalize to string\r\n      if (url[urlResult].url) {\r\n        url[urlResult] = url[urlResult].url;\r\n      }\r\n\r\n      result = url[urlResult];\r\n\r\n    } else {\r\n\r\n      // single URL case\r\n      result = url;\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n\r\n  startTimer = function(oSound) {\r\n\r\n    /**\r\n     * attach a timer to this sound, and start an interval if needed\r\n     */\r\n\r\n    if (!oSound._hasTimer) {\r\n\r\n      oSound._hasTimer = true;\r\n\r\n      if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n        if (h5IntervalTimer === null && h5TimerCount === 0) {\r\n\r\n          h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);\r\n\r\n        }\r\n\r\n        h5TimerCount++;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  stopTimer = function(oSound) {\r\n\r\n    /**\r\n     * detach a timer\r\n     */\r\n\r\n    if (oSound._hasTimer) {\r\n\r\n      oSound._hasTimer = false;\r\n\r\n      if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n        // interval will stop itself at next execution.\r\n\r\n        h5TimerCount--;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  timerExecute = function() {\r\n\r\n    /**\r\n     * manual polling for HTML5 progress events, ie., whileplaying()\r\n     * (can achieve greater precision than conservative default HTML5 interval)\r\n     */\r\n\r\n    var i;\r\n\r\n    if (h5IntervalTimer !== null && !h5TimerCount) {\r\n\r\n      // no active timers, stop polling interval.\r\n\r\n      clearInterval(h5IntervalTimer);\r\n\r\n      h5IntervalTimer = null;\r\n\r\n      return;\r\n\r\n    }\r\n\r\n    // check all HTML5 sounds with timers\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n\r\n      if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {\r\n        sm2.sounds[sm2.soundIDs[i]]._onTimer();\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  catchError = function(options) {\r\n\r\n    options = (options !== _undefined ? options : {});\r\n\r\n    if (typeof sm2.onerror === 'function') {\r\n      sm2.onerror.apply(window, [{\r\n        type: (options.type !== _undefined ? options.type : null)\r\n      }]);\r\n    }\r\n\r\n    if (options.fatal !== _undefined && options.fatal) {\r\n      sm2.disable();\r\n    }\r\n\r\n  };\r\n\r\n  badSafariFix = function() {\r\n\r\n    // special case: \"bad\" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4\r\n    if (!isBadSafari || !detectFlash()) {\r\n      // doesn't apply\r\n      return;\r\n    }\r\n\r\n    var aF = sm2.audioFormats, i, item;\r\n\r\n    for (item in aF) {\r\n\r\n      if (aF.hasOwnProperty(item)) {\r\n\r\n        if (item === 'mp3' || item === 'mp4') {\r\n\r\n          sm2._wD(sm + ': Using flash fallback for ' + item + ' format');\r\n          sm2.html5[item] = false;\r\n\r\n          // assign result to related formats, too\r\n          if (aF[item] && aF[item].related) {\r\n            for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n              sm2.html5[aF[item].related[i]] = false;\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   * Pseudo-private flash/ExternalInterface methods\r\n   * ----------------------------------------------\r\n   */\r\n\r\n  this._setSandboxType = function(sandboxType) {\r\n\r\n    // <d>\r\n    // Security sandbox according to Flash plugin\r\n    var sb = sm2.sandbox;\r\n\r\n    sb.type = sandboxType;\r\n    sb.description = sb.types[(sb.types[sandboxType] !== _undefined ? sandboxType : 'unknown')];\r\n\r\n    if (sb.type === 'localWithFile') {\r\n\r\n      sb.noRemote = true;\r\n      sb.noLocal = false;\r\n      _wDS('secNote', 2);\r\n\r\n    } else if (sb.type === 'localWithNetwork') {\r\n\r\n      sb.noRemote = false;\r\n      sb.noLocal = true;\r\n\r\n    } else if (sb.type === 'localTrusted') {\r\n\r\n      sb.noRemote = false;\r\n      sb.noLocal = false;\r\n\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  this._externalInterfaceOK = function(swfVersion) {\r\n\r\n    // flash callback confirming flash loaded, EI working etc.\r\n    // swfVersion: SWF build string\r\n\r\n    if (sm2.swfLoaded) {\r\n      return;\r\n    }\r\n\r\n    var e;\r\n\r\n    debugTS('swf', true);\r\n    debugTS('flashtojs', true);\r\n    sm2.swfLoaded = true;\r\n    tryInitOnFocus = false;\r\n\r\n    if (isBadSafari) {\r\n      badSafariFix();\r\n    }\r\n\r\n    // complain if JS + SWF build/version strings don't match, excluding +DEV builds\r\n    // <d>\r\n    if (!swfVersion || swfVersion.replace(/\\+dev/i, '') !== sm2.versionNumber.replace(/\\+dev/i, '')) {\r\n\r\n      e = sm + ': Fatal: JavaScript file build \"' + sm2.versionNumber + '\" does not match Flash SWF build \"' + swfVersion + '\" at ' + sm2.url + '. Ensure both are up-to-date.';\r\n\r\n      // escape flash -> JS stack so this error fires in window.\r\n      setTimeout(function() {\r\n        throw new Error(e);\r\n      }, 0);\r\n\r\n      // exit, init will fail with timeout\r\n      return;\r\n\r\n    }\r\n    // </d>\r\n\r\n    // IE needs a larger timeout\r\n    setTimeout(init, isIE ? 100 : 1);\r\n\r\n  };\r\n\r\n  /**\r\n   * Private initialization helpers\r\n   * ------------------------------\r\n   */\r\n\r\n  createMovie = function(movieID, movieURL) {\r\n\r\n    // ignore if already connected\r\n    if (didAppend && appendSuccess) return false;\r\n\r\n    function initMsg() {\r\n\r\n      // <d>\r\n\r\n      var options = [],\r\n          title,\r\n          msg = [],\r\n          delimiter = ' + ';\r\n\r\n      title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');\r\n\r\n      if (!sm2.html5Only) {\r\n\r\n        if (sm2.preferFlash) {\r\n          options.push('preferFlash');\r\n        }\r\n\r\n        if (sm2.useHighPerformance) {\r\n          options.push('useHighPerformance');\r\n        }\r\n\r\n        if (sm2.flashPollingInterval) {\r\n          options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');\r\n        }\r\n\r\n        if (sm2.html5PollingInterval) {\r\n          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n        }\r\n\r\n        if (sm2.wmode) {\r\n          options.push('wmode (' + sm2.wmode + ')');\r\n        }\r\n\r\n        if (sm2.debugFlash) {\r\n          options.push('debugFlash');\r\n        }\r\n\r\n        if (sm2.useFlashBlock) {\r\n          options.push('flashBlock');\r\n        }\r\n\r\n      } else if (sm2.html5PollingInterval) {\r\n          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n        }\r\n\r\n      if (options.length) {\r\n        msg = msg.concat([options.join(delimiter)]);\r\n      }\r\n\r\n      sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);\r\n\r\n      showSupport();\r\n\r\n      // </d>\r\n\r\n    }\r\n\r\n    if (sm2.html5Only) {\r\n\r\n      // 100% HTML5 mode\r\n      setVersionInfo();\r\n\r\n      initMsg();\r\n      sm2.oMC = id(sm2.movieID);\r\n      init();\r\n\r\n      // prevent multiple init attempts\r\n      didAppend = true;\r\n\r\n      appendSuccess = true;\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // flash path\r\n    var remoteURL = (movieURL || sm2.url),\r\n    localURL = (sm2.altURL || remoteURL),\r\n    swfTitle = 'JS/Flash audio component (SoundManager 2)',\r\n    oTarget = getDocument(),\r\n    extraClass = getSWFCSS(),\r\n    isRTL = null,\r\n    html = doc.getElementsByTagName('html')[0],\r\n    oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;\r\n\r\n    isRTL = (html && html.dir && html.dir.match(/rtl/i));\r\n    movieID = (movieID === _undefined ? sm2.id : movieID);\r\n\r\n    function param(name, value) {\r\n      return '<param name=\"' + name + '\" value=\"' + value + '\" />';\r\n    }\r\n\r\n    // safety check for legacy (change to Flash 9 URL)\r\n    setVersionInfo();\r\n    sm2.url = normalizeMovieURL(overHTTP ? remoteURL : localURL);\r\n    movieURL = sm2.url;\r\n\r\n    sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);\r\n\r\n    if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {\r\n      /**\r\n       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here\r\n       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout\r\n       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)\r\n       */\r\n      messages.push(strings.spcWmode);\r\n      sm2.wmode = null;\r\n    }\r\n\r\n    oEmbed = {\r\n      name: movieID,\r\n      id: movieID,\r\n      src: movieURL,\r\n      quality: 'high',\r\n      allowScriptAccess: sm2.allowScriptAccess,\r\n      bgcolor: sm2.bgColor,\r\n      pluginspage: http + 'www.macromedia.com/go/getflashplayer',\r\n      title: swfTitle,\r\n      type: 'application/x-shockwave-flash',\r\n      wmode: sm2.wmode,\r\n      // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\r\n      hasPriority: 'true'\r\n    };\r\n\r\n    if (sm2.debugFlash) {\r\n      oEmbed.FlashVars = 'debug=1';\r\n    }\r\n\r\n    if (!sm2.wmode) {\r\n      // don't write empty attribute\r\n      delete oEmbed.wmode;\r\n    }\r\n\r\n    if (isIE) {\r\n\r\n      // IE is \"special\".\r\n      oMovie = doc.createElement('div');\r\n      movieHTML = [\r\n        '<object id=\"' + movieID + '\" data=\"' + movieURL + '\" type=\"' + oEmbed.type + '\" title=\"' + oEmbed.title + '\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">',\r\n        param('movie', movieURL),\r\n        param('AllowScriptAccess', sm2.allowScriptAccess),\r\n        param('quality', oEmbed.quality),\r\n        (sm2.wmode ? param('wmode', sm2.wmode) : ''),\r\n        param('bgcolor', sm2.bgColor),\r\n        param('hasPriority', 'true'),\r\n        (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),\r\n        '</object>'\r\n      ].join('');\r\n\r\n    } else {\r\n\r\n      oMovie = doc.createElement('embed');\r\n      for (tmp in oEmbed) {\r\n        if (oEmbed.hasOwnProperty(tmp)) {\r\n          oMovie.setAttribute(tmp, oEmbed[tmp]);\r\n        }\r\n      }\r\n\r\n    }\r\n\r\n    initDebug();\r\n    extraClass = getSWFCSS();\r\n    oTarget = getDocument();\r\n\r\n    if (oTarget) {\r\n\r\n      sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));\r\n\r\n      if (!sm2.oMC.id) {\r\n\r\n        sm2.oMC.id = sm2.movieID;\r\n        sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;\r\n        s = null;\r\n        oEl = null;\r\n\r\n        if (!sm2.useFlashBlock) {\r\n          if (sm2.useHighPerformance) {\r\n            // on-screen at all times\r\n            s = {\r\n              position: 'fixed',\r\n              width: '8px',\r\n              height: '8px',\r\n              // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.\r\n              bottom: '0px',\r\n              left: '0px',\r\n              overflow: 'hidden'\r\n            };\r\n          } else {\r\n            // hide off-screen, lower priority\r\n            s = {\r\n              position: 'absolute',\r\n              width: '6px',\r\n              height: '6px',\r\n              top: '-9999px',\r\n              left: '-9999px'\r\n            };\r\n            if (isRTL) {\r\n              s.left = Math.abs(parseInt(s.left, 10)) + 'px';\r\n            }\r\n          }\r\n        }\r\n\r\n        if (isWebkit) {\r\n          // soundcloud-reported render/crash fix, safari 5\r\n          sm2.oMC.style.zIndex = 10000;\r\n        }\r\n\r\n        if (!sm2.debugFlash) {\r\n          for (x in s) {\r\n            if (s.hasOwnProperty(x)) {\r\n              sm2.oMC.style[x] = s[x];\r\n            }\r\n          }\r\n        }\r\n\r\n        try {\r\n\r\n          if (!isIE) {\r\n            sm2.oMC.appendChild(oMovie);\r\n          }\r\n\r\n          oTarget.appendChild(sm2.oMC);\r\n\r\n          if (isIE) {\r\n            oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n            oEl.className = swfCSS.swfBox;\r\n            oEl.innerHTML = movieHTML;\r\n          }\r\n\r\n          appendSuccess = true;\r\n\r\n        } catch(e) {\r\n\r\n          throw new Error(str('domError') + ' \\n' + e.toString());\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        // SM2 container is already in the document (eg. flashblock use case)\r\n        sClass = sm2.oMC.className;\r\n        sm2.oMC.className = (sClass ? sClass + ' ' : swfCSS.swfDefault) + (extraClass ? ' ' + extraClass : '');\r\n        sm2.oMC.appendChild(oMovie);\r\n\r\n        if (isIE) {\r\n          oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n          oEl.className = swfCSS.swfBox;\r\n          oEl.innerHTML = movieHTML;\r\n        }\r\n\r\n        appendSuccess = true;\r\n\r\n      }\r\n\r\n    }\r\n\r\n    didAppend = true;\r\n\r\n    initMsg();\r\n\r\n    // sm2._wD(sm + ': Trying to load ' + movieURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  initMovie = function() {\r\n\r\n    if (sm2.html5Only) {\r\n      createMovie();\r\n      return false;\r\n    }\r\n\r\n    // attempt to get, or create, movie (may already exist)\r\n    if (flash) return false;\r\n\r\n    if (!sm2.url) {\r\n\r\n      /**\r\n       * Something isn't right - we've reached init, but the soundManager url property has not been set.\r\n       * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.\r\n       * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.\r\n       */\r\n\r\n       _wDS('noURL');\r\n       return false;\r\n\r\n    }\r\n\r\n    // inline markup case\r\n    flash = sm2.getMovie(sm2.id);\r\n\r\n    if (!flash) {\r\n\r\n      if (!oRemoved) {\r\n\r\n        // try to create\r\n        createMovie(sm2.id, sm2.url);\r\n\r\n      } else {\r\n\r\n        // try to re-append removed movie after reboot()\r\n        if (!isIE) {\r\n          sm2.oMC.appendChild(oRemoved);\r\n        } else {\r\n          sm2.oMC.innerHTML = oRemovedHTML;\r\n        }\r\n\r\n        oRemoved = null;\r\n        didAppend = true;\r\n\r\n      }\r\n\r\n      flash = sm2.getMovie(sm2.id);\r\n\r\n    }\r\n\r\n    if (typeof sm2.oninitmovie === 'function') {\r\n      setTimeout(sm2.oninitmovie, 1);\r\n    }\r\n\r\n    // <d>\r\n    flushMessages();\r\n    // </d>\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  delayWaitForEI = function() {\r\n\r\n    setTimeout(waitForEI, 1000);\r\n\r\n  };\r\n\r\n  rebootIntoHTML5 = function() {\r\n\r\n    // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.\r\n\r\n    window.setTimeout(function() {\r\n\r\n      complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');\r\n\r\n      sm2.setup({\r\n        preferFlash: false\r\n      }).reboot();\r\n\r\n      // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.\r\n      sm2.didFlashBlock = true;\r\n\r\n      sm2.beginDelayedInit();\r\n\r\n    }, 1);\r\n\r\n  };\r\n\r\n  waitForEI = function() {\r\n\r\n    var p,\r\n        loadIncomplete = false;\r\n\r\n    if (!sm2.url) {\r\n      // No SWF url to load (noURL case) - exit for now. Will be retried when url is set.\r\n      return;\r\n    }\r\n\r\n    if (waitingForEI) {\r\n      return;\r\n    }\r\n\r\n    waitingForEI = true;\r\n    event.remove(window, 'load', delayWaitForEI);\r\n\r\n    if (hasFlash && tryInitOnFocus && !isFocused) {\r\n      // Safari won't load flash in background tabs, only when focused.\r\n      _wDS('waitFocus');\r\n      return;\r\n    }\r\n\r\n    if (!didInit) {\r\n      p = sm2.getMoviePercent();\r\n      if (p > 0 && p < 100) {\r\n        loadIncomplete = true;\r\n      }\r\n    }\r\n\r\n    setTimeout(function() {\r\n\r\n      p = sm2.getMoviePercent();\r\n\r\n      if (loadIncomplete) {\r\n        // special case: if movie *partially* loaded, retry until it's 100% before assuming failure.\r\n        waitingForEI = false;\r\n        sm2._wD(str('waitSWF'));\r\n        window.setTimeout(delayWaitForEI, 1);\r\n        return;\r\n      }\r\n\r\n      // <d>\r\n      if (!didInit) {\r\n\r\n        sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ' : '') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash ? ' ' + str('checkSWF') : ''), 2);\r\n\r\n        if (!overHTTP && p) {\r\n\r\n          _wDS('localFail', 2);\r\n\r\n          if (!sm2.debugFlash) {\r\n            _wDS('tryDebug', 2);\r\n          }\r\n\r\n        }\r\n\r\n        if (p === 0) {\r\n\r\n          // if 0 (not null), probably a 404.\r\n          sm2._wD(str('swf404', sm2.url), 1);\r\n\r\n        }\r\n\r\n        debugTS('flashtojs', false, ': Timed out' + (overHTTP ? ' (Check flash security or flash blockers)' : ' (No plugin/missing SWF?)'));\r\n\r\n      }\r\n      // </d>\r\n\r\n      // give up / time-out, depending\r\n\r\n      if (!didInit && okToDisable) {\r\n\r\n        if (p === null) {\r\n\r\n          // SWF failed to report load progress. Possibly blocked.\r\n\r\n          if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {\r\n\r\n            if (sm2.useFlashBlock) {\r\n\r\n              flashBlockHandler();\r\n\r\n            }\r\n\r\n            _wDS('waitForever');\r\n\r\n          } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n            // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.\r\n            rebootIntoHTML5();\r\n\r\n          } else {\r\n\r\n            _wDS('waitForever');\r\n\r\n            // fire any regular registered ontimeout() listeners.\r\n            processOnEvents({\r\n              type: 'ontimeout',\r\n              ignoreInit: true,\r\n              error: {\r\n                type: 'INIT_FLASHBLOCK'\r\n              }\r\n            });\r\n\r\n          }\r\n\r\n        } else if (sm2.flashLoadTimeout === 0) {\r\n\r\n          // SWF loaded? Shouldn't be a blocking issue, then.\r\n\r\n          _wDS('waitForever');\r\n\r\n        } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n          rebootIntoHTML5();\r\n\r\n        } else {\r\n\r\n          failSafely(true);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }, sm2.flashLoadTimeout);\r\n\r\n  };\r\n\r\n  handleFocus = function() {\r\n\r\n    function cleanup() {\r\n      event.remove(window, 'focus', handleFocus);\r\n    }\r\n\r\n    if (isFocused || !tryInitOnFocus) {\r\n      // already focused, or not special Safari background tab case\r\n      cleanup();\r\n      return true;\r\n    }\r\n\r\n    okToDisable = true;\r\n    isFocused = true;\r\n    _wDS('gotFocus');\r\n\r\n    // allow init to restart\r\n    waitingForEI = false;\r\n\r\n    // kick off ExternalInterface timeout, now that the SWF has started\r\n    delayWaitForEI();\r\n\r\n    cleanup();\r\n    return true;\r\n\r\n  };\r\n\r\n  flushMessages = function() {\r\n\r\n    // <d>\r\n\r\n    // SM2 pre-init debug messages\r\n    if (messages.length) {\r\n      sm2._wD('SoundManager 2: ' + messages.join(' '), 1);\r\n      messages = [];\r\n    }\r\n\r\n    // </d>\r\n\r\n  };\r\n\r\n  showSupport = function() {\r\n\r\n    // <d>\r\n\r\n    flushMessages();\r\n\r\n    var item, tests = [];\r\n\r\n    if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n      for (item in sm2.audioFormats) {\r\n        if (sm2.audioFormats.hasOwnProperty(item)) {\r\n          tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)' : (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ' : '') + 'and no flash support)' : ''))));\r\n        }\r\n      }\r\n      sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);\r\n    }\r\n\r\n    // </d>\r\n\r\n  };\r\n\r\n  initComplete = function(bNoDisable) {\r\n\r\n    if (didInit) return false;\r\n\r\n    if (sm2.html5Only) {\r\n      // all good.\r\n      _wDS('sm2Loaded', 1);\r\n      didInit = true;\r\n      initUserOnload();\r\n      debugTS('onload', true);\r\n      return true;\r\n    }\r\n\r\n    var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),\r\n        result = true,\r\n        error;\r\n\r\n    if (!wasTimeout) {\r\n      didInit = true;\r\n    }\r\n\r\n    error = {\r\n      type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')\r\n    };\r\n\r\n    sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ') ' + String.fromCharCode(disabled ? 10006 : 10003), disabled ? 2 : 1);\r\n\r\n    if (disabled || bNoDisable) {\r\n\r\n      if (sm2.useFlashBlock && sm2.oMC) {\r\n        sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null ? swfCSS.swfTimedout : swfCSS.swfError);\r\n      }\r\n\r\n      processOnEvents({\r\n        type: 'ontimeout',\r\n        error: error,\r\n        ignoreInit: true\r\n      });\r\n\r\n      debugTS('onload', false);\r\n      catchError(error);\r\n\r\n      result = false;\r\n\r\n    } else {\r\n\r\n      debugTS('onload', true);\r\n\r\n    }\r\n\r\n    if (!disabled) {\r\n\r\n      if (sm2.waitForWindowLoad && !windowLoaded) {\r\n\r\n        _wDS('waitOnload');\r\n        event.add(window, 'load', initUserOnload);\r\n\r\n      } else {\r\n\r\n        // <d>\r\n        if (sm2.waitForWindowLoad && windowLoaded) {\r\n          _wDS('docLoaded');\r\n        }\r\n        // </d>\r\n\r\n        initUserOnload();\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)\r\n   * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().\r\n   */\r\n\r\n  setProperties = function() {\r\n\r\n    var i,\r\n        o = sm2.setupOptions;\r\n\r\n    for (i in o) {\r\n\r\n      if (o.hasOwnProperty(i)) {\r\n\r\n        // assign local property if not already defined\r\n\r\n        if (sm2[i] === _undefined) {\r\n\r\n          sm2[i] = o[i];\r\n\r\n        } else if (sm2[i] !== o[i]) {\r\n\r\n          // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync\r\n          sm2.setupOptions[i] = sm2[i];\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n\r\n  init = function() {\r\n\r\n    // called after onload()\r\n\r\n    if (didInit) {\r\n      _wDS('didInit');\r\n      return false;\r\n    }\r\n\r\n    function cleanup() {\r\n      event.remove(window, 'load', sm2.beginDelayedInit);\r\n    }\r\n\r\n    if (sm2.html5Only) {\r\n\r\n      if (!didInit) {\r\n        // we don't need no steenking flash!\r\n        cleanup();\r\n        sm2.enabled = true;\r\n        initComplete();\r\n      }\r\n\r\n      return true;\r\n\r\n    }\r\n\r\n    // flash path\r\n    initMovie();\r\n\r\n    try {\r\n\r\n      // attempt to talk to Flash\r\n      flash._externalInterfaceTest(false);\r\n\r\n      /**\r\n       * Apply user-specified polling interval, OR, if \"high performance\" set, faster vs. default polling\r\n       * (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)\r\n       */\r\n      setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));\r\n\r\n      if (!sm2.debugMode) {\r\n        // stop the SWF from making debug output calls to JS\r\n        flash._disableDebug();\r\n      }\r\n\r\n      sm2.enabled = true;\r\n      debugTS('jstoflash', true);\r\n\r\n      if (!sm2.html5Only) {\r\n        // prevent browser from showing cached page state (or rather, restoring \"suspended\" page state) via back button, because flash may be dead\r\n        // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/\r\n        event.add(window, 'unload', doNothing);\r\n      }\r\n\r\n    } catch(e) {\r\n\r\n      sm2._wD('js/flash exception: ' + e.toString());\r\n\r\n      debugTS('jstoflash', false);\r\n\r\n      catchError({\r\n        type: 'JS_TO_FLASH_EXCEPTION',\r\n        fatal: true\r\n      });\r\n\r\n      // don't disable, for reboot()\r\n      failSafely(true);\r\n\r\n      initComplete();\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    initComplete();\r\n\r\n    // disconnect events\r\n    cleanup();\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  domContentLoaded = function() {\r\n\r\n    if (didDCLoaded) return false;\r\n\r\n    didDCLoaded = true;\r\n\r\n    // assign top-level soundManager properties eg. soundManager.url\r\n    setProperties();\r\n\r\n    initDebug();\r\n\r\n    if (!hasFlash && sm2.hasHTML5) {\r\n\r\n      sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);\r\n\r\n      sm2.setup({\r\n        useHTML5Audio: true,\r\n        // make sure we aren't preferring flash, either\r\n        // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.\r\n        preferFlash: false\r\n      });\r\n\r\n    }\r\n\r\n    testHTML5();\r\n\r\n    if (!hasFlash && needsFlash) {\r\n\r\n      messages.push(strings.needFlash);\r\n\r\n      // TODO: Fatal here vs. timeout approach, etc.\r\n      // hack: fail sooner.\r\n      sm2.setup({\r\n        flashLoadTimeout: 1\r\n      });\r\n\r\n    }\r\n\r\n    if (doc.removeEventListener) {\r\n      doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);\r\n    }\r\n\r\n    initMovie();\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  domContentLoadedIE = function() {\r\n\r\n    if (doc.readyState === 'complete') {\r\n      domContentLoaded();\r\n      doc.detachEvent('onreadystatechange', domContentLoadedIE);\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  winOnLoad = function() {\r\n\r\n    // catch edge case of initComplete() firing after window.load()\r\n    windowLoaded = true;\r\n\r\n    // catch case where DOMContentLoaded has been sent, but we're still in doc.readyState = 'interactive'\r\n    domContentLoaded();\r\n\r\n    event.remove(window, 'load', winOnLoad);\r\n\r\n  };\r\n\r\n  // sniff up-front\r\n  detectFlash();\r\n\r\n  // focus and window load, init (primarily flash-driven)\r\n  event.add(window, 'focus', handleFocus);\r\n  event.add(window, 'load', delayWaitForEI);\r\n  event.add(window, 'load', winOnLoad);\r\n\r\n  if (doc.addEventListener) {\r\n\r\n    doc.addEventListener('DOMContentLoaded', domContentLoaded, false);\r\n\r\n  } else if (doc.attachEvent) {\r\n\r\n    doc.attachEvent('onreadystatechange', domContentLoadedIE);\r\n\r\n  } else {\r\n\r\n    // no add/attachevent support - safe to assume no JS -> Flash either\r\n    debugTS('onload', false);\r\n    catchError({\r\n      type: 'NO_DOM2_EVENTS',\r\n      fatal: true\r\n    });\r\n\r\n  }\r\n\r\n} // SoundManager()\r\n\r\n// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading\r\n\r\nif (window.SM2_DEFER === _undefined || !SM2_DEFER) {\r\n  soundManager = new SoundManager();\r\n}\r\n\r\n/**\r\n * SoundManager public interfaces\r\n * ------------------------------\r\n */\r\n\r\nif ( true && module && typeof module.exports === 'object') {\r\n\r\n  /**\r\n   * commonJS module\r\n   */\r\n\r\n  module.exports.SoundManager = SoundManager;\r\n  module.exports.soundManager = soundManager;\r\n\r\n} else if (true) {\r\n\r\n  /**\r\n   * AMD - requireJS\r\n   * basic usage:\r\n   * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n   *   SoundManager.getInstance().setup({\r\n   *     url: '/swf/',\r\n   *     onready: function() { ... }\r\n   *   })\r\n   * });\r\n   *\r\n   * SM2_DEFER usage:\r\n   * window.SM2_DEFER = true;\r\n   * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n   *   SoundManager.getInstance(function() {\r\n   *     var soundManager = new SoundManager.constructor();\r\n   *     soundManager.setup({\r\n   *       url: '/swf/',\r\n   *       ...\r\n   *     });\r\n   *     ...\r\n   *     soundManager.beginDelayedInit();\r\n   *     return soundManager;\r\n   *   })\r\n   * });\r\n   */\r\n\r\n  !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n    /**\r\n     * Retrieve the global instance of SoundManager.\r\n     * If a global instance does not exist it can be created using a callback.\r\n     *\r\n     * @param {Function} smBuilder Optional: Callback used to create a new SoundManager instance\r\n     * @return {SoundManager} The global SoundManager instance\r\n     */\r\n    function getInstance(smBuilder) {\r\n      if (!window.soundManager && smBuilder instanceof Function) {\r\n        var instance = smBuilder(SoundManager);\r\n        if (instance instanceof SoundManager) {\r\n          window.soundManager = instance;\r\n        }\r\n      }\r\n      return window.soundManager;\r\n    }\r\n    return {\r\n      constructor: SoundManager,\r\n      getInstance: getInstance\r\n    };\r\n  }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n}\r\n\r\n// standard browser case\r\n\r\n// constructor\r\nwindow.SoundManager = SoundManager;\r\n\r\n/**\r\n * note: SM2 requires a window global due to Flash, which makes calls to window.soundManager.\r\n * Flash may not always be needed, but this is not known until async init and SM2 may even \"reboot\" into Flash mode.\r\n */\r\n\r\n// public API, flash callbacks etc.\r\nwindow.soundManager = soundManager;\r\n\r\n}(window));\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/soundmanager2/script/soundmanager2.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar isProduction = \"development\" === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n    if (condition) {\n        return;\n    }\n    if (isProduction) {\n        throw new Error(prefix);\n    }\n    throw new Error(prefix + \": \" + (message || ''));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (invariant);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar isProduction = \"development\" === 'production';\nfunction warning(condition, message) {\n  if (!isProduction) {\n    if (condition) {\n      return;\n    }\n\n    var text = \"Warning: \" + message;\n\n    if (typeof console !== 'undefined') {\n      console.warn(text);\n    }\n\n    try {\n      throw Error(text);\n    } catch (x) {}\n  }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (warning);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/to-array/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/to-array/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/to-array/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/value-equal/esm/value-equal.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/value-equal/esm/value-equal.js ***!
-  \*****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nfunction valueOf(obj) {\n  return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);\n}\n\nfunction valueEqual(a, b) {\n  // Test for strict equality first.\n  if (a === b) return true;\n\n  // Otherwise, if either of them == null they are not equal.\n  if (a == null || b == null) return false;\n\n  if (Array.isArray(a)) {\n    return (\n      Array.isArray(b) &&\n      a.length === b.length &&\n      a.every(function(item, index) {\n        return valueEqual(item, b[index]);\n      })\n    );\n  }\n\n  if (typeof a === 'object' || typeof b === 'object') {\n    var aValue = valueOf(a);\n    var bValue = valueOf(b);\n\n    if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);\n\n    return Object.keys(Object.assign({}, a, b)).every(function(key) {\n      return valueEqual(a[key], b[key]);\n    });\n  }\n\n  return false;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (valueEqual);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/value-equal/esm/value-equal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/yeast/index.js":
-/*!*************************************************!*\
-  !*** ./jaas-client/node_modules/yeast/index.js ***!
-  \*************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/yeast/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/App.css":
-/*!*********************************!*\
-  !*** ./jaas-client/src/App.css ***!
-  \*********************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("var api = __webpack_require__(/*! ../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n            var content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js!./App.css */ \"./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css\");\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};\n\n//# sourceURL=webpack:///./jaas-client/src/App.css?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/App.js":
-/*!********************************!*\
-  !*** ./jaas-client/src/App.js ***!
-  \********************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.css */ \"./jaas-client/src/App.css\");\n/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_App_css__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var _pages_index_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pages/index.jsx */ \"./jaas-client/src/pages/index.jsx\");\n/* harmony import */ var _pages_jaas_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pages/jaas.jsx */ \"./jaas-client/src/pages/jaas.jsx\");\n/* harmony import */ var _pages_404_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pages/404.jsx */ \"./jaas-client/src/pages/404.jsx\");\n/*\n  Company: Savoir-faire Linux\n  Author: Larbi Gharib <larbi.gharib@savoirfairelinux.com>\n  UI Project inspired from https://scrimba.com/p/pbNpTv/cbZBmfV\n  License: AGPL-3\n*/\n //import logo from './logo.svg';\n\n\n\n\n\n\n\nclass App extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"BrowserRouter\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Switch\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      exact: true,\n      path: \"/\",\n      component: _pages_index_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      to: \"/Jaas\",\n      component: _pages_jaas_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      exact: true,\n      path: \"/404\",\n      component: _pages_404_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Redirect\"], {\n      to: \"/404\"\n    })));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (App);\n\n//# sourceURL=webpack:///./jaas-client/src/App.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/ContactList.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/src/components/ContactList.js ***!
-  \***************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nclass ContactList extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"rooms-list\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"h3\", null, \"Liste de contacts\")));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ContactList);\n\n//# sourceURL=webpack:///./jaas-client/src/components/ContactList.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/Header.js":
-/*!**********************************************!*\
-  !*** ./jaas-client/src/components/Header.js ***!
-  \**********************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Header; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _material_ui_core_Button__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/core/Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/index.js\");\n/* harmony import */ var _material_ui_core_Menu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/core/Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js\");\n/* harmony import */ var _material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/core/MenuItem */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n\n\n\n\n\nfunction Header() {\n  const history = Object(react_router_dom__WEBPACK_IMPORTED_MODULE_4__[\"useHistory\"])();\n  const [anchorEl, setAnchorEl] = react__WEBPACK_IMPORTED_MODULE_0___default.a.useState(null);\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const disconnect = () => {\n    let path = `/`;\n    history.push(path);\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Button__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n    \"aria-controls\": \"simple-menu\",\n    \"aria-haspopup\": \"true\",\n    onClick: handleClick\n  }, \"Menu\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Menu__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n    id: \"simple-menu\",\n    anchorEl: anchorEl,\n    keepMounted: true,\n    open: Boolean(anchorEl),\n    onClose: handleClose\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: handleClose\n  }, \"Profile\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: handleClose\n  }, \"Mon compte\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: disconnect\n  }, \"D\\xE9connexion\")));\n}\n\n//# sourceURL=webpack:///./jaas-client/src/components/Header.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/Message.js":
-/*!***********************************************!*\
-  !*** ./jaas-client/src/components/Message.js ***!
-  \***********************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nfunction Message(props) {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message\"\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message-username\"\n  }, props.username), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message-text\"\n  }, props.text));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Message);\n\n//# sourceURL=webpack:///./jaas-client/src/components/Message.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/MessageList.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/src/components/MessageList.js ***!
-  \***************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Message */ \"./jaas-client/src/components/Message.js\");\n\n\n\nclass MessageList extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"message-list\"\n    }, this.props.messages.map((message, index) => {\n      /*DUMMY_DATA.map((message, index) => {*/\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Message__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n        key: index,\n        username: message.senderId,\n        text: message.text\n      });\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (MessageList);\n\n//# sourceURL=webpack:///./jaas-client/src/components/MessageList.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/NewContactForm.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/src/components/NewContactForm.js ***!
-  \******************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nclass NewContactForm extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"new-room-form\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"form\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n      type: \"text\",\n      placeholder: \"Ajouter un contact\",\n      required: true\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n      id: \"create-room-btn\",\n      type: \"submit\"\n    }, \"+\")));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (NewContactForm);\n\n//# sourceURL=webpack:///./jaas-client/src/components/NewContactForm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/SendMessageForm.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/src/components/SendMessageForm.js ***!
-  \*******************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_input_emoji__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-input-emoji */ \"./jaas-client/node_modules/react-input-emoji/dist/index.es.js\");\n\n\n\nclass SendMessageForm extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      message: ''\n    };\n    this.handleChange = this.handleChange.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleChange(e) {\n    this.setState({\n      message: e\n    });\n  }\n\n  handleSubmit(e) {\n    //e.preventDefault()\n    this.props.sendMessage(this.state.message); //this.props.sendMessage(this.state.message)\n\n    this.setState({\n      message: ''\n    });\n  }\n\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      //onSubmit={this.handleSubmit}\n      className: \"send-message-form\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_input_emoji__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n      disabled: this.props.disabled,\n      onChange: this.handleChange,\n      value: this.state.message,\n      cleanOnEnter: true,\n      onEnter: this.handleSubmit,\n      placeholder: \"\\xC9cris ton message et cliques sur Entrer\",\n      height: \"35\"\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SendMessageForm);\n\n//# sourceURL=webpack:///./jaas-client/src/components/SendMessageForm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/index.css":
-/*!***********************************!*\
-  !*** ./jaas-client/src/index.css ***!
-  \***********************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("var api = __webpack_require__(/*! ../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n            var content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js!./index.css */ \"./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css\");\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};\n\n//# sourceURL=webpack:///./jaas-client/src/index.css?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/index.js":
-/*!**********************************!*\
-  !*** ./jaas-client/src/index.js ***!
-  \**********************************/
-/*! no exports provided */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.css */ \"./jaas-client/src/index.css\");\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_index_css__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./App */ \"./jaas-client/src/App.js\");\n/* harmony import */ var _serviceWorker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./serviceWorker */ \"./jaas-client/src/serviceWorker.js\");\n\n\n\n\n\nreact_dom__WEBPACK_IMPORTED_MODULE_1___default.a.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.StrictMode, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_App__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null)), document.getElementById('root')); // If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n\n_serviceWorker__WEBPACK_IMPORTED_MODULE_4__[\"unregister\"]();\n\n//# sourceURL=webpack:///./jaas-client/src/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/pages/404.jsx":
-/*!***************************************!*\
-  !*** ./jaas-client/src/pages/404.jsx ***!
-  \***************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst NotFoundPage = () => {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"h3\", null, \"404 Page not found\"));\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (NotFoundPage);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/404.jsx?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/pages/index.jsx":
-/*!*****************************************!*\
-  !*** ./jaas-client/src/pages/index.jsx ***!
-  \*****************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _material_ui_core_Avatar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/core/Avatar */ \"./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js\");\n/* harmony import */ var _material_ui_core_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/core/Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/index.js\");\n/* harmony import */ var _material_ui_core_CssBaseline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/core/CssBaseline */ \"./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js\");\n/* harmony import */ var _material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/core/TextField */ \"./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js\");\n/* harmony import */ var _material_ui_core_FormControlLabel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/core/FormControlLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js\");\n/* harmony import */ var _material_ui_core_Checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/core/Checkbox */ \"./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js\");\n/* harmony import */ var _material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @material-ui/core/Link */ \"./jaas-client/node_modules/@material-ui/core/esm/Link/index.js\");\n/* harmony import */ var _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @material-ui/core/Grid */ \"./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js\");\n/* harmony import */ var _material_ui_core_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @material-ui/core/Box */ \"./jaas-client/node_modules/@material-ui/core/esm/Box/index.js\");\n/* harmony import */ var _material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @material-ui/icons/LockOutlined */ \"./jaas-client/node_modules/@material-ui/icons/LockOutlined.js\");\n/* harmony import */ var _material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @material-ui/core/Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n/* harmony import */ var _material_ui_core_Container__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @material-ui/core/Container */ \"./jaas-client/node_modules/@material-ui/core/esm/Container/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var _material_ui_core_CircularProgress__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @material-ui/core/CircularProgress */ \"./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js\");\n/* harmony import */ var _material_ui_core_DialogTitle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @material-ui/core/DialogTitle */ \"./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js\");\n/* harmony import */ var _material_ui_core_Dialog__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @material-ui/core/Dialog */ \"./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n //import { makeStyles } from '@material-ui/core/styles';\n\n\n\n\n\n\n\nfunction Copyright() {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n    variant: \"body2\",\n    color: \"textSecondary\",\n    align: \"center\"\n  }, 'Copyright © 2016-', new Date().getFullYear(), ' Savoir-faire Linux Inc. GNU ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n    color: \"inherit\",\n    href: \"https://jami.net/\"\n  }, \"Jami.net\"), ' ', '.');\n}\n/*const useStyles = makeStyles((theme) => ({\n    paper: {\n        marginTop: theme.spacing(8),\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n    },\n    avatar: {\n        margin: theme.spacing(1),\n        backgroundColor: theme.palette.secondary.main,\n    },\n    form: {\n        width: '100%', // Fix IE 11 issue.\n        marginTop: theme.spacing(1),\n    },\n    submit: {\n        margin: theme.spacing(3, 0, 2),\n    },\n}));*/\n\n/*function SignIn() {\n    const classes = useStyles();\n\n\n}*/\n\n/* \n    TODO:\n    Use useState to handle username password and redirect states to render this page to \n    comply with material-ui usage of useStyles\n    Src: https://blog.logrocket.com/a-guide-to-usestate-in-react-ecb9952e406c/\n*/\n\n\nclass SignInPage extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      username: '',\n      password: '',\n      redirect: false,\n      session: null,\n      submitted: false,\n      loading: false,\n      error: false,\n      open: false,\n      errorMessage: ''\n    };\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleusername(text) {\n    this.setState({\n      username: text.target.value\n    });\n  }\n\n  handlePassword(text) {\n    this.setState({\n      password: text.target.value\n    });\n  }\n\n  handleSubmit(event) {\n    event.preventDefault();\n    let obj = {};\n    obj.username = this.state.username;\n    obj.password = this.state.password;\n    this.setState({\n      submitted: true,\n      loading: true\n    });\n    fetch('/api/login?username=' + obj.username + '&password=' + obj.password, {\n      header: {\n        \"Content-Type\": \"application/json\"\n      },\n      method: \"POST\",\n      credentials: 'same-origin' //body: JSON.stringify({ obj })\n\n    }).then(res => {\n      if (res.status == '200') {\n        this.setState({\n          redirect: true\n        });\n      } else if (res.status == '401') {\n        this.setState({\n          loading: false,\n          error: true,\n          open: true,\n          errorMessage: \"Wrong credentials! Your are not allowed to connect\"\n        });\n      } //this.setState({ session: res });\n\n    }).catch(e => {\n      this.setState({\n        loading: false,\n        error: true,\n        open: true,\n        errorMessage: e.toString()\n      });\n    });\n  }\n\n  render() {\n    if (this.state.redirect) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_13__[\"Redirect\"], {\n        to: \"/jaas\"\n      });\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Container__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n      component: \"main\",\n      maxWidth: \"xs\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_CssBaseline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"\"\n      /*{classes.paper}*/\n\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n      component: \"h1\",\n      variant: \"h5\"\n    }, \"Se connecter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"form\", {\n      className: \"\"\n      /*{classes.form}*/\n      ,\n      onSubmit: this.handleSubmit\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      variant: \"outlined\",\n      margin: \"normal\",\n      required: true,\n      fullWidth: true,\n      id: \"username\",\n      label: \"LDAP Savoir-faire Linux\",\n      name: \"username\",\n      autoComplete: \"email\",\n      autoFocus: true,\n      onChange: text => {\n        this.handleusername(text);\n      }\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      variant: \"outlined\",\n      margin: \"normal\",\n      required: true,\n      fullWidth: true,\n      name: \"password\",\n      label: \"Mot de passe\",\n      type: \"password\",\n      id: \"password\",\n      autoComplete: \"current-password\",\n      onChange: text => {\n        this.handlePassword(text);\n      }\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_FormControlLabel__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n      control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Checkbox__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n        value: \"remember\",\n        color: \"primary\"\n      }),\n      label: \"Se rapeller de moi\"\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n      type: \"submit\",\n      fullWidth: true,\n      variant: \"contained\",\n      color: \"primary\",\n      className: \"\"\n      /*{classes.submit}*/\n      // onClick={() => { this.login() }}\n\n    }, \"Se connecter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      container: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      item: true,\n      xs: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n      href: \"#\",\n      variant: \"body2\"\n    }, \"Mot de passe oubli\\xE9 ?\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      item: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n      href: \"#\",\n      variant: \"body2\"\n    }, \"Tu n'as pas de compte? Inscris-toi\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n      mt: 8\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Copyright, null)), this.state.submitted && this.state.loading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_CircularProgress__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n      style: {\n        position: 'relative'\n      },\n      size: 40,\n      top: 10,\n      style: {\n        marginLeft: '50%'\n      }\n    }), this.state.error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Dialog__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n      \"aria-labelledby\": \"simple-dialog-title\",\n      open: this.state.open\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_DialogTitle__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n      id: \"simple-dialog-title\"\n    }, this.state.errorMessage)));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SignInPage);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/index.jsx?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/pages/jaas.jsx":
-/*!****************************************!*\
-  !*** ./jaas-client/src/pages/jaas.jsx ***!
-  \****************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/Header */ \"./jaas-client/src/components/Header.js\");\n/* harmony import */ var _components_ContactList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ContactList */ \"./jaas-client/src/components/ContactList.js\");\n/* harmony import */ var _components_MessageList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/MessageList */ \"./jaas-client/src/components/MessageList.js\");\n/* harmony import */ var _components_SendMessageForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/SendMessageForm */ \"./jaas-client/src/components/SendMessageForm.js\");\n/* harmony import */ var _components_NewContactForm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/NewContactForm */ \"./jaas-client/src/components/NewContactForm.js\");\n/* harmony import */ var react_sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-sound */ \"./jaas-client/node_modules/react-sound/lib/index.js\");\n/* harmony import */ var react_sound__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_sound__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! socket.io-client */ \"./jaas-client/node_modules/socket.io-client/lib/index.js\");\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(socket_io_client__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\nvar socket = socket_io_client__WEBPACK_IMPORTED_MODULE_7___default.a.connect('http://localhost:3000');\n\nclass Jaas extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      messages: [],\n      sound: false\n    };\n    socket.on('connect', () => {\n      console.log(\"Success !\");\n    }); //import io from 'socket.io-client';\n    //this.socket = socketIOClient(ENDPOINT);\n    //this.socket.on(\"FromAPI\", data => {\n    //  this.setState({\n    //    messages: [...this.state.messages, data]\n    //  })\n    //});\n\n    this.sendMessage = this.sendMessage.bind(this);\n  }\n\n  componentDidMount() {\n    socket.on('receivedMessage', data => {\n      var message = {\n        senderId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',\n        text: data\n      };\n      this.setState({\n        messages: [...this.state.messages, message],\n        sound: true\n      });\n    });\n  }\n\n  sendMessage(text) {\n    var data = {\n      senderId: 'Me',\n      destinationId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',\n      text: text\n    };\n    socket.emit(\"SendMessage\", data);\n    console.log(data.text);\n    this.setState({\n      messages: [...this.state.messages, data],\n      sound: false\n    });\n  }\n\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"app\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Header__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContactList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_MessageList__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n      messages: this.state.messages\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_SendMessageForm__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      sendMessage: this.sendMessage\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_NewContactForm__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), this.state.sound && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_sound__WEBPACK_IMPORTED_MODULE_6___default.a, {\n      url: \"stairs.mp3\"\n      /*https://notificationsounds.com/message-tones/stairs-567*/\n      ,\n      playStatus: react_sound__WEBPACK_IMPORTED_MODULE_6___default.a.status.PLAYING,\n      playFromPosition: 0\n      /* in milliseconds */\n      ,\n      onLoading: this.handleSongLoading,\n      onPlaying: this.handleSongPlaying,\n      onFinishedPlaying: this.handleSongFinishedPlaying\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Jaas);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/jaas.jsx?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/serviceWorker.js":
-/*!******************************************!*\
-  !*** ./jaas-client/src/serviceWorker.js ***!
-  \******************************************/
-/*! exports provided: register, unregister */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"register\", function() { return register; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unregister\", function() { return unregister; });\n// This optional code is used to register a service worker.\n// register() is not called by default.\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\nconst isLocalhost = Boolean(window.location.hostname === 'localhost' || // [::1] is the IPv6 localhost address.\nwindow.location.hostname === '[::1]' || // 127.0.0.0/8 are considered localhost for IPv4.\nwindow.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));\nfunction register(config) {\n  if (false) {}\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker.register(swUrl).then(registration => {\n    registration.onupdatefound = () => {\n      const installingWorker = registration.installing;\n\n      if (installingWorker == null) {\n        return;\n      }\n\n      installingWorker.onstatechange = () => {\n        if (installingWorker.state === 'installed') {\n          if (navigator.serviceWorker.controller) {\n            // At this point, the updated precached content has been fetched,\n            // but the previous service worker will still serve the older\n            // content until all client tabs are closed.\n            console.log('New content is available and will be used when all ' + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'); // Execute callback\n\n            if (config && config.onUpdate) {\n              config.onUpdate(registration);\n            }\n          } else {\n            // At this point, everything has been precached.\n            // It's the perfect time to display a\n            // \"Content is cached for offline use.\" message.\n            console.log('Content is cached for offline use.'); // Execute callback\n\n            if (config && config.onSuccess) {\n              config.onSuccess(registration);\n            }\n          }\n        }\n      };\n    };\n  }).catch(error => {\n    console.error('Error during service worker registration:', error);\n  });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: {\n      'Service-Worker': 'script'\n    }\n  }).then(response => {\n    // Ensure service worker exists, and that we really are getting a JS file.\n    const contentType = response.headers.get('content-type');\n\n    if (response.status === 404 || contentType != null && contentType.indexOf('javascript') === -1) {\n      // No service worker found. Probably a different app. Reload the page.\n      navigator.serviceWorker.ready.then(registration => {\n        registration.unregister().then(() => {\n          window.location.reload();\n        });\n      });\n    } else {\n      // Service worker found. Proceed as normal.\n      registerValidSW(swUrl, config);\n    }\n  }).catch(() => {\n    console.log('No internet connection found. App is running in offline mode.');\n  });\n}\n\nfunction unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    }).catch(error => {\n      console.error(error.message);\n    });\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/src/serviceWorker.js?");
-
-/***/ }),
-
-/***/ "./node_modules/base64-js/index.js":
-/*!*****************************************!*\
-  !*** ./node_modules/base64-js/index.js ***!
-  \*****************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n\n\n//# sourceURL=webpack:///./node_modules/base64-js/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/buffer/index.js":
-/*!**************************************!*\
-  !*** ./node_modules/buffer/index.js ***!
-  \**************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n\n\nvar base64 = __webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\")\nvar ieee754 = __webpack_require__(/*! ieee754 */ \"./node_modules/ieee754/index.js\")\nvar isArray = __webpack_require__(/*! isarray */ \"./node_modules/isarray/index.js\")\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./node_modules/buffer/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css":
-/*!***********************************************************************!*\
-  !*** ./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css ***!
-  \***********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \".App {\\n  text-align: center;\\n}\\n\\n.App-logo {\\n  height: 40vmin;\\n  pointer-events: none;\\n}\\n\\n@media (prefers-reduced-motion: no-preference) {\\n  .App-logo {\\n    animation: App-logo-spin infinite 20s linear;\\n  }\\n}\\n\\n.App-header {\\n  background-color: #282c34;\\n  min-height: 100vh;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  font-size: calc(10px + 2vmin);\\n  color: white;\\n}\\n\\n.App-link {\\n  color: #61dafb;\\n}\\n\\n@keyframes App-logo-spin {\\n  from {\\n    transform: rotate(0deg);\\n  }\\n  to {\\n    transform: rotate(360deg);\\n  }\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./jaas-client/src/App.css?./node_modules/css-loader/dist/cjs.js");
-
-/***/ }),
-
-/***/ "./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css":
-/*!*************************************************************************!*\
-  !*** ./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \":root {\\n  --main-color: #1F1F1F;\\n  --secondary-color: white;\\n  --third-color: #2F2F2F;\\n  --main-text-color: #3e5869;\\n  --secondary-text-color: #b0c7d6;\\n  --send-message-form: #F5F5F5;\\n}\\n\\nhtml, body {\\n  height: 100%;\\n  margin: 0;\\n  padding: 0;\\n  font-family: 'Open Sans', sans-serif;\\n  font-weight: 200;\\n  color: #3e5869; \\n}\\n\\n#root {\\n  height: 100%;\\n}\\n\\n.app {\\n  display: grid;\\n  height: 100%;\\n  grid-template-columns: repeat(6, 1fr);\\n  grid-template-rows: 40px 1fr 1fr 1fr 1fr 1fr 60px;\\n  grid-template-areas: \\n      \\\"h h h h h h\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"n s s s s s\\\";\\n}\\n\\n.login {\\n  background-color: var(--main-color);\\n}\\n\\n.header-section {\\n  grid-area: h;\\n}\\n\\n.new-room-form {\\n  grid-area: n;\\n}\\n\\n.rooms-list {\\n  grid-area: r;\\n}\\n\\n.message-list {\\n  grid-area: m;\\n}\\n\\n.send-message-form {\\n  grid-area: s;\\n}\\n\\n/* REST OF CSS */\\n\\n.header-section {\\n  background-color: var(--main-color);\\n\\n}\\n\\n.simple-menu {\\n  color: var(--send-message-form);\\n}\\n\\n.rooms-list {\\n  box-sizing: border-box;\\n  padding: 10px;\\n  background-color: var(--main-color);\\n  overflow: scroll;\\n  height: 100%;\\n}\\n\\n.rooms-list ul {\\n  list-style-type: none;    \\n  padding: 0;\\n  overflow: scoll;\\n}\\n\\n.rooms-list li {\\n  margin: 10px 0;\\n}\\n\\n.rooms-list h3 {\\n  margin: 5px 0;\\n  color: var(--secondary-color);\\n}\\n\\n.rooms-list .room a {\\n  color: var(--secondary-text-color);\\n  font-weight: 600;\\n  text-decoration: none;\\n  \\n}\\n\\n.rooms-list .room.active a {\\n  color: var(--secondary-color);\\n}\\n\\n.new-room-form {\\n  padding: 0 5px;\\n  background: var(--secondary-color);\\n  color: var(--main-text-color);\\n}\\n\\n.new-room-form form {\\n  height: 100%;\\n  display: flex;\\n  justify-content: space-between;\\n  align-items: center;\\n}\\n\\n.new-room-form input {\\n  width: 135px;\\n  background: var(--secondary-color);\\n}\\n\\n.new-room-form button {\\n  background: var(--secondary-color);\\n  color: var(--main-text-color);\\n  border: 0;\\n} \\n\\n.new-room-form input::placeholder {\\n  color: var(--main-text-color);\\n  font-weight: 200;\\n}\\n\\n.new-room-form input:focus {\\n  outline-width: 0;\\n}\\n\\n.new-room-form input {\\n  border: 0;\\n}\\n\\n.new-room-form button {\\n  border: 0;\\n}\\n\\n.message {\\n  margin: 15px 0;\\n}\\n\\n.message .message-username {\\n  font-size: 11px;\\n  font-weight: bold;\\n  color: var(--secondary-color);\\n  opacity: 0.9;\\n  margin-bottom: 6px;\\n}\\n.message .message-text {\\n  background: var(--third-color);\\n  color: var(--secondary-color);\\n  display: inline;\\n  padding: 4px 8px;\\n  border-radius: 8px;\\n}\\n\\n.message-list {\\n  box-sizing: border-box;\\n  padding-left: 6px;\\n  width: 100%;\\n  height: 100%;\\n  overflow: scroll;\\n  background: var(--third-color);\\n}\\n\\n.message-list .join-room {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n  height: 100%;\\n  font-size: 34px;\\n  font-weight: 300;\\n}\\n\\n.send-message-form {\\n  background: var(--send-message-form);\\n  display: flex;\\n}\\n\\n.send-message-form input {\\n  width: 100%;\\n  padding: 15px 10px;\\n  margin: 0;\\n  border-style: none;\\n  background: var(--send-message-form);\\n  font-weight: 200;\\n\\n}\\n\\n.send-message-form input:focus {\\n  outline-width: 0;\\n}\\n\\n.send-message-form input::placeholder {\\n  color: var(--main-text-color);\\n}\\n\\n.help-text {\\n  position: absolute;\\n  top: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./jaas-client/src/index.css?./node_modules/css-loader/dist/cjs.js");
-
-/***/ }),
-
-/***/ "./node_modules/css-loader/dist/runtime/api.js":
-/*!*****************************************************!*\
-  !*** ./node_modules/css-loader/dist/runtime/api.js ***!
-  \*****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item, useSourceMap);\n\n      if (item[2]) {\n        return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n      }\n\n      return content;\n    }).join('');\n  }; // import a list of modules into the list\n  // eslint-disable-next-line func-names\n\n\n  list.i = function (modules, mediaQuery, dedupe) {\n    if (typeof modules === 'string') {\n      // eslint-disable-next-line no-param-reassign\n      modules = [[null, modules, '']];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var i = 0; i < this.length; i++) {\n        // eslint-disable-next-line prefer-destructuring\n        var id = this[i][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _i = 0; _i < modules.length; _i++) {\n      var item = [].concat(modules[_i]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      if (mediaQuery) {\n        if (!item[2]) {\n          item[2] = mediaQuery;\n        } else {\n          item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n  var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n  var cssMapping = item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (useSourceMap && typeof btoa === 'function') {\n    var sourceMapping = toComment(cssMapping);\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n  }\n\n  return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n  // eslint-disable-next-line no-undef\n  var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n  var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n  return \"/*# \".concat(data, \" */\");\n}\n\n//# sourceURL=webpack:///./node_modules/css-loader/dist/runtime/api.js?");
-
-/***/ }),
-
-/***/ "./node_modules/ieee754/index.js":
-/*!***************************************!*\
-  !*** ./node_modules/ieee754/index.js ***!
-  \***************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n\n//# sourceURL=webpack:///./node_modules/ieee754/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/isarray/index.js":
-/*!***************************************!*\
-  !*** ./node_modules/isarray/index.js ***!
-  \***************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/process/browser.js":
-/*!*****************************************!*\
-  !*** ./node_modules/process/browser.js ***!
-  \*****************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n//# sourceURL=webpack:///./node_modules/process/browser.js?");
-
-/***/ }),
-
-/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
-/*!****************************************************************************!*\
-  !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce =  true ? __webpack_require__.nc : undefined;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && btoa) {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};\n\n//# sourceURL=webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js?");
-
-/***/ }),
-
-/***/ "./node_modules/webpack/buildin/global.js":
-/*!***********************************!*\
-  !*** (webpack)/buildin/global.js ***!
-  \***********************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?");
-
-/***/ }),
-
-/***/ "./node_modules/webpack/buildin/module.js":
-/*!***********************************!*\
-  !*** (webpack)/buildin/module.js ***!
-  \***********************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/module.js?");
-
-/***/ }),
-
-/***/ 0:
-/*!********************!*\
-  !*** ws (ignored) ***!
-  \********************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/* (ignored) */\n\n//# sourceURL=webpack:///ws_(ignored)?");
-
-/***/ })
-
-/******/ });
\ No newline at end of file
diff --git a/public/bundle.js b/public/bundle.js
deleted file mode 100644
index fbef4df..0000000
--- a/public/bundle.js
+++ /dev/null
@@ -1,4216 +0,0 @@
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = "./jaas-client/src/index.js");
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayLikeToArray; });\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayWithHoles; });\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayWithoutHoles; });\n/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js":
-/*!**************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***!
-  \**************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _assertThisInitialized; });\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _classCallCheck; });\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createClass; });\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _extends; });\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _inheritsLoose; });\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _iterableToArray; });\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***!
-  \*************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _iterableToArrayLimit; });\nfunction _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _nonIterableRest; });\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _nonIterableSpread; });\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js ***!
-  \****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _objectWithoutProperties; });\n/* harmony import */ var _objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = Object(_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(source, excluded);\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***!
-  \*********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _objectWithoutPropertiesLoose; });\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _slicedToArray; });\n/* harmony import */ var _arrayWithHoles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\");\n/* harmony import */ var _iterableToArrayLimit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\");\n/* harmony import */ var _unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableRest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\");\n\n\n\n\nfunction _slicedToArray(arr, i) {\n  return Object(_arrayWithHoles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || Object(_iterableToArrayLimit__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr, i) || Object(_unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr, i) || Object(_nonIterableRest__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _toConsumableArray; });\n/* harmony import */ var _arrayWithoutHoles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\");\n/* harmony import */ var _iterableToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js\");\n/* harmony import */ var _unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableSpread__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableSpread */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\");\n\n\n\n\nfunction _toConsumableArray(arr) {\n  return Object(_arrayWithoutHoles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || Object(_iterableToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr) || Object(_unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr) || Object(_nonIterableSpread__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _typeof; });\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***!
-  \*******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _unsupportedIterableToArray; });\n/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/extends.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/extends.js ***!
-  \********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("function _extends() {\n  module.exports = _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/extends.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js ***!
-  \**********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _internal_svg_icons_Person__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/svg-icons/Person */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexShrink: 0,\n      width: 40,\n      height: 40,\n      fontFamily: theme.typography.fontFamily,\n      fontSize: theme.typography.pxToRem(20),\n      lineHeight: 1,\n      borderRadius: '50%',\n      overflow: 'hidden',\n      userSelect: 'none'\n    },\n\n    /* Styles applied to the root element if not `src` or `srcSet`. */\n    colorDefault: {\n      color: theme.palette.background.default,\n      backgroundColor: theme.palette.type === 'light' ? theme.palette.grey[400] : theme.palette.grey[600]\n    },\n\n    /* Styles applied to the root element if `variant=\"circle\"`. */\n    circle: {},\n\n    /* Styles applied to the root element if `variant=\"rounded\"`. */\n    rounded: {\n      borderRadius: theme.shape.borderRadius\n    },\n\n    /* Styles applied to the root element if `variant=\"square\"`. */\n    square: {\n      borderRadius: 0\n    },\n\n    /* Styles applied to the img element if either `src` or `srcSet` is defined. */\n    img: {\n      width: '100%',\n      height: '100%',\n      textAlign: 'center',\n      // Handle non-square image. The property isn't supported by IE 11.\n      objectFit: 'cover',\n      // Hide alt text.\n      color: 'transparent',\n      // Hide the image broken icon, only works on Chrome.\n      textIndent: 10000\n    },\n\n    /* Styles applied to the fallback icon */\n    fallback: {\n      width: '75%',\n      height: '75%'\n    }\n  };\n};\n\nfunction useLoaded(_ref) {\n  var src = _ref.src,\n      srcSet = _ref.srcSet;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      loaded = _React$useState[0],\n      setLoaded = _React$useState[1];\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (!src && !srcSet) {\n      return undefined;\n    }\n\n    setLoaded(false);\n    var active = true;\n    var image = new Image();\n    image.src = src;\n    image.srcSet = srcSet;\n\n    image.onload = function () {\n      if (!active) {\n        return;\n      }\n\n      setLoaded('loaded');\n    };\n\n    image.onerror = function () {\n      if (!active) {\n        return;\n      }\n\n      setLoaded('error');\n    };\n\n    return function () {\n      active = false;\n    };\n  }, [src, srcSet]);\n  return loaded;\n}\n\nvar Avatar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Avatar(props, ref) {\n  var alt = props.alt,\n      childrenProp = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      imgProps = props.imgProps,\n      sizes = props.sizes,\n      src = props.src,\n      srcSet = props.srcSet,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'circle' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"alt\", \"children\", \"classes\", \"className\", \"component\", \"imgProps\", \"sizes\", \"src\", \"srcSet\", \"variant\"]);\n\n  var children = null; // Use a hook instead of onError on the img element to support server-side rendering.\n\n  var loaded = useLoaded({\n    src: src,\n    srcSet: srcSet\n  });\n  var hasImg = src || srcSet;\n  var hasImgNotFailing = hasImg && loaded !== 'error';\n\n  if (hasImgNotFailing) {\n    children = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"img\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      alt: alt,\n      src: src,\n      srcSet: srcSet,\n      sizes: sizes,\n      className: classes.img\n    }, imgProps));\n  } else if (childrenProp != null) {\n    children = childrenProp;\n  } else if (hasImg && alt) {\n    children = alt[0];\n  } else {\n    children = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_Person__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n      className: classes.fallback\n    });\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes.system, classes[variant], className, !hasImgNotFailing && classes.colorDefault),\n    ref: ref\n  }, other), children);\n});\n true ? Avatar.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Used in combination with `src` or `srcSet` to\n   * provide an alt attribute for the rendered `img` element.\n   */\n  alt: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Used to render icon or text elements inside the Avatar if `src` is not set.\n   * This can be an element, or just a string.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Attributes applied to the `img` element if the component is used to display an image.\n   * It can be used to listen for the loading error event.\n   */\n  imgProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The `sizes` attribute for the `img` element.\n   */\n  sizes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The `src` attribute for the `img` element.\n   */\n  src: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The `srcSet` attribute for the `img` element.\n   * Use this attribute for responsive image display.\n   */\n  srcSet: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The shape of the avatar.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['circle', 'rounded', 'square'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiAvatar'\n})(Avatar));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Avatar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Avatar */ \"./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Avatar__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    // Improve scrollable dialog support.\n    zIndex: -1,\n    position: 'fixed',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    right: 0,\n    bottom: 0,\n    top: 0,\n    left: 0,\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    WebkitTapHighlightColor: 'transparent'\n  },\n\n  /* Styles applied to the root element if `invisible={true}`. */\n  invisible: {\n    backgroundColor: 'transparent'\n  }\n};\nvar Backdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Backdrop(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$invisible = props.invisible,\n      invisible = _props$invisible === void 0 ? false : _props$invisible,\n      open = props.open,\n      transitionDuration = props.transitionDuration,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Fade__WEBPACK_IMPORTED_MODULE_6__[\"default\"] : _props$TransitionComp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"invisible\", \"open\", \"transitionDuration\", \"TransitionComponent\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    in: open,\n    timeout: transitionDuration\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, invisible && classes.invisible),\n    \"aria-hidden\": true,\n    ref: ref\n  }, children));\n});\n true ? Backdrop.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the backdrop is invisible.\n   * It can be used when rendering a popover or a custom select component.\n   */\n  invisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number\n  })])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiBackdrop'\n})(Backdrop));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Backdrop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Backdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Backdrop__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js ***!
-  \*******************************************************************/
-/*! exports provided: styleFunction, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styleFunction\", function() { return styleFunction; });\n/* harmony import */ var _material_ui_system__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/system */ \"./jaas-client/node_modules/@material-ui/system/esm/index.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles/styled */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js\");\n\n\nvar styleFunction = Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"css\"])(Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"compose\"])(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"borders\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"display\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"flexbox\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"grid\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"positions\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"palette\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"shadows\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"sizing\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"spacing\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"typography\"]));\n/**\n * @ignore - do not document.\n */\n\nvar Box = Object(_styles_styled__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('div')(styleFunction, {\n  name: 'MuiBox'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Box);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Box/index.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Box/index.js ***!
-  \*********************************************************************/
-/*! exports provided: default, styleFunction */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Box__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Box */ \"./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Box__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"styleFunction\", function() { return _Box__WEBPACK_IMPORTED_MODULE_0__[\"styleFunction\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Box/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.button, {\n      boxSizing: 'border-box',\n      minWidth: 64,\n      padding: '6px 16px',\n      borderRadius: theme.shape.borderRadius,\n      color: theme.palette.text.primary,\n      transition: theme.transitions.create(['background-color', 'box-shadow', 'border'], {\n        duration: theme.transitions.duration.short\n      }),\n      '&:hover': {\n        textDecoration: 'none',\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.text.primary, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        },\n        '&$disabled': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    }),\n\n    /* Styles applied to the span element that wraps the children. */\n    label: {\n      width: '100%',\n      // Ensure the correct width for iOS Safari\n      display: 'inherit',\n      alignItems: 'inherit',\n      justifyContent: 'inherit'\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"`. */\n    text: {\n      padding: '6px 8px'\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"` and `color=\"primary\"`. */\n    textPrimary: {\n      color: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"` and `color=\"secondary\"`. */\n    textSecondary: {\n      color: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      padding: '5px 15px',\n      border: \"1px solid \".concat(theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'),\n      '&$disabled': {\n        border: \"1px solid \".concat(theme.palette.action.disabledBackground)\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"primary\"`. */\n    outlinedPrimary: {\n      color: theme.palette.primary.main,\n      border: \"1px solid \".concat(Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, 0.5)),\n      '&:hover': {\n        border: \"1px solid \".concat(theme.palette.primary.main),\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"secondary\"`. */\n    outlinedSecondary: {\n      color: theme.palette.secondary.main,\n      border: \"1px solid \".concat(Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, 0.5)),\n      '&:hover': {\n        border: \"1px solid \".concat(theme.palette.secondary.main),\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        border: \"1px solid \".concat(theme.palette.action.disabled)\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"`. */\n    contained: {\n      color: theme.palette.getContrastText(theme.palette.grey[300]),\n      backgroundColor: theme.palette.grey[300],\n      boxShadow: theme.shadows[2],\n      '&:hover': {\n        backgroundColor: theme.palette.grey.A100,\n        boxShadow: theme.shadows[4],\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          boxShadow: theme.shadows[2],\n          backgroundColor: theme.palette.grey[300]\n        },\n        '&$disabled': {\n          backgroundColor: theme.palette.action.disabledBackground\n        }\n      },\n      '&$focusVisible': {\n        boxShadow: theme.shadows[6]\n      },\n      '&:active': {\n        boxShadow: theme.shadows[8]\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled,\n        boxShadow: theme.shadows[0],\n        backgroundColor: theme.palette.action.disabledBackground\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"` and `color=\"primary\"`. */\n    containedPrimary: {\n      color: theme.palette.primary.contrastText,\n      backgroundColor: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: theme.palette.primary.dark,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: theme.palette.primary.main\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"` and `color=\"secondary\"`. */\n    containedSecondary: {\n      color: theme.palette.secondary.contrastText,\n      backgroundColor: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: theme.palette.secondary.dark,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: theme.palette.secondary.main\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `disableElevation={true}`. */\n    disableElevation: {\n      boxShadow: 'none',\n      '&:hover': {\n        boxShadow: 'none'\n      },\n      '&$focusVisible': {\n        boxShadow: 'none'\n      },\n      '&:active': {\n        boxShadow: 'none'\n      },\n      '&$disabled': {\n        boxShadow: 'none'\n      }\n    },\n\n    /* Pseudo-class applied to the ButtonBase root element if the button is keyboard focused. */\n    focusVisible: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit',\n      borderColor: 'currentColor'\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"text\"`. */\n    textSizeSmall: {\n      padding: '4px 5px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"text\"`. */\n    textSizeLarge: {\n      padding: '8px 11px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"outlined\"`. */\n    outlinedSizeSmall: {\n      padding: '3px 9px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"outlined\"`. */\n    outlinedSizeLarge: {\n      padding: '7px 21px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"contained\"`. */\n    containedSizeSmall: {\n      padding: '4px 10px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"contained\"`. */\n    containedSizeLarge: {\n      padding: '8px 22px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"`. */\n    sizeSmall: {},\n\n    /* Styles applied to the root element if `size=\"large\"`. */\n    sizeLarge: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {\n      width: '100%'\n    },\n\n    /* Styles applied to the startIcon element if supplied. */\n    startIcon: {\n      display: 'inherit',\n      marginRight: 8,\n      marginLeft: -4,\n      '&$iconSizeSmall': {\n        marginLeft: -2\n      }\n    },\n\n    /* Styles applied to the endIcon element if supplied. */\n    endIcon: {\n      display: 'inherit',\n      marginRight: -4,\n      marginLeft: 8,\n      '&$iconSizeSmall': {\n        marginRight: -2\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"small\"`. */\n    iconSizeSmall: {\n      '& > *:first-child': {\n        fontSize: 18\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"medium\"`. */\n    iconSizeMedium: {\n      '& > *:first-child': {\n        fontSize: 20\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"large\"`. */\n    iconSizeLarge: {\n      '& > *:first-child': {\n        fontSize: 22\n      }\n    }\n  };\n};\nvar Button = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Button(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'default' : _props$color,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'button' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableElevati = props.disableElevation,\n      disableElevation = _props$disableElevati === void 0 ? false : _props$disableElevati,\n      _props$disableFocusRi = props.disableFocusRipple,\n      disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n      endIconProp = props.endIcon,\n      focusVisibleClassName = props.focusVisibleClassName,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      startIconProp = props.startIcon,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'button' : _props$type,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'text' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"disableElevation\", \"disableFocusRipple\", \"endIcon\", \"focusVisibleClassName\", \"fullWidth\", \"size\", \"startIcon\", \"type\", \"variant\"]);\n\n  var startIcon = startIconProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.startIcon, classes[\"iconSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))])\n  }, startIconProp);\n  var endIcon = endIconProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.endIcon, classes[\"iconSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))])\n  }, endIconProp);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ButtonBase__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[variant], className, color === 'inherit' ? classes.colorInherit : color !== 'default' && classes[\"\".concat(variant).concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(color))], size !== 'medium' && [classes[\"\".concat(variant, \"Size\").concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))], classes[\"size\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))]], disableElevation && classes.disableElevation, disabled && classes.disabled, fullWidth && classes.fullWidth),\n    component: component,\n    disabled: disabled,\n    focusRipple: !disableFocusRipple,\n    focusVisibleClassName: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.focusVisible, focusVisibleClassName),\n    ref: ref,\n    type: type\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: classes.label\n  }, startIcon, children, endIcon));\n});\n true ? Button.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the button.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, no elevation is used.\n   */\n  disableElevation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the  keyboard focus ripple will be disabled.\n   */\n  disableFocusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   *\n   * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n   * to highlight the element by applying separate styles with the `focusVisibleClassName`.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Element placed after the children.\n   */\n  endIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the button will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The URL to link to when the button is clicked.\n   * If defined, an `a` element will be used as the root node.\n   */\n  href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The size of the button.\n   * `small` is equivalent to the dense button styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['large', 'medium', 'small']),\n\n  /**\n   * Element placed before the children.\n   */\n  startIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['button', 'reset', 'submit']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['contained', 'outlined', 'text'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiButton'\n})(Button));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Button/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Button/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Button__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Button/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useIsFocusVisible */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js\");\n/* harmony import */ var _TouchRipple__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TouchRipple */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    position: 'relative',\n    WebkitTapHighlightColor: 'transparent',\n    backgroundColor: 'transparent',\n    // Reset default value\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0,\n    border: 0,\n    margin: 0,\n    // Remove the margin in Safari\n    borderRadius: 0,\n    padding: 0,\n    // Remove the padding in Firefox\n    cursor: 'pointer',\n    userSelect: 'none',\n    verticalAlign: 'middle',\n    '-moz-appearance': 'none',\n    // Reset\n    '-webkit-appearance': 'none',\n    // Reset\n    textDecoration: 'none',\n    // So we take precedent over the style of a native <a /> element.\n    color: 'inherit',\n    '&::-moz-focus-inner': {\n      borderStyle: 'none' // Remove Firefox dotted outline.\n\n    },\n    '&$disabled': {\n      pointerEvents: 'none',\n      // Disable link interactions\n      cursor: 'default'\n    },\n    '@media print': {\n      colorAdjust: 'exact'\n    }\n  },\n\n  /* Pseudo-class applied to the root element if `disabled={true}`. */\n  disabled: {},\n\n  /* Pseudo-class applied to the root element if keyboard focused. */\n  focusVisible: {}\n};\n/**\n * `ButtonBase` contains as few styles as possible.\n * It aims to be a simple building block for creating a button.\n * It contains a load of style reset and some focus/ripple logic.\n */\n\nvar ButtonBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function ButtonBase(props, ref) {\n  var action = props.action,\n      buttonRefProp = props.buttonRef,\n      _props$centerRipple = props.centerRipple,\n      centerRipple = _props$centerRipple === void 0 ? false : _props$centerRipple,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'button' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableRipple = props.disableRipple,\n      disableRipple = _props$disableRipple === void 0 ? false : _props$disableRipple,\n      _props$disableTouchRi = props.disableTouchRipple,\n      disableTouchRipple = _props$disableTouchRi === void 0 ? false : _props$disableTouchRi,\n      _props$focusRipple = props.focusRipple,\n      focusRipple = _props$focusRipple === void 0 ? false : _props$focusRipple,\n      focusVisibleClassName = props.focusVisibleClassName,\n      onBlur = props.onBlur,\n      onClick = props.onClick,\n      onFocus = props.onFocus,\n      onFocusVisible = props.onFocusVisible,\n      onKeyDown = props.onKeyDown,\n      onKeyUp = props.onKeyUp,\n      onMouseDown = props.onMouseDown,\n      onMouseLeave = props.onMouseLeave,\n      onMouseUp = props.onMouseUp,\n      onTouchEnd = props.onTouchEnd,\n      onTouchMove = props.onTouchMove,\n      onTouchStart = props.onTouchStart,\n      onDragLeave = props.onDragLeave,\n      _props$tabIndex = props.tabIndex,\n      tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,\n      TouchRippleProps = props.TouchRippleProps,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'button' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onClick\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"onDragLeave\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n\n  var buttonRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  function getButtonNode() {\n    // #StrictMode ready\n    return react_dom__WEBPACK_IMPORTED_MODULE_4__[\"findDOMNode\"](buttonRef.current);\n  }\n\n  var rippleRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      focusVisible = _React$useState[0],\n      setFocusVisible = _React$useState[1];\n\n  if (disabled && focusVisible) {\n    setFocusVisible(false);\n  }\n\n  var _useIsFocusVisible = Object(_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(),\n      isFocusVisible = _useIsFocusVisible.isFocusVisible,\n      onBlurVisible = _useIsFocusVisible.onBlurVisible,\n      focusVisibleRef = _useIsFocusVisible.ref;\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](action, function () {\n    return {\n      focusVisible: function focusVisible() {\n        setFocusVisible(true);\n        buttonRef.current.focus();\n      }\n    };\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (focusVisible && focusRipple && !disableRipple) {\n      rippleRef.current.pulsate();\n    }\n  }, [disableRipple, focusRipple, focusVisible]);\n\n  function useRippleHandler(rippleAction, eventCallback) {\n    var skipRippleAction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : disableTouchRipple;\n    return Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n      if (eventCallback) {\n        eventCallback(event);\n      }\n\n      var ignore = skipRippleAction;\n\n      if (!ignore && rippleRef.current) {\n        rippleRef.current[rippleAction](event);\n      }\n\n      return true;\n    });\n  }\n\n  var handleMouseDown = useRippleHandler('start', onMouseDown);\n  var handleDragLeave = useRippleHandler('stop', onDragLeave);\n  var handleMouseUp = useRippleHandler('stop', onMouseUp);\n  var handleMouseLeave = useRippleHandler('stop', function (event) {\n    if (focusVisible) {\n      event.preventDefault();\n    }\n\n    if (onMouseLeave) {\n      onMouseLeave(event);\n    }\n  });\n  var handleTouchStart = useRippleHandler('start', onTouchStart);\n  var handleTouchEnd = useRippleHandler('stop', onTouchEnd);\n  var handleTouchMove = useRippleHandler('stop', onTouchMove);\n  var handleBlur = useRippleHandler('stop', function (event) {\n    if (focusVisible) {\n      onBlurVisible(event);\n      setFocusVisible(false);\n    }\n\n    if (onBlur) {\n      onBlur(event);\n    }\n  }, false);\n  var handleFocus = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // Fix for https://github.com/facebook/react/issues/7769\n    if (!buttonRef.current) {\n      buttonRef.current = event.currentTarget;\n    }\n\n    if (isFocusVisible(event)) {\n      setFocusVisible(true);\n\n      if (onFocusVisible) {\n        onFocusVisible(event);\n      }\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n  });\n\n  var isNonNativeButton = function isNonNativeButton() {\n    var button = getButtonNode();\n    return component && component !== 'button' && !(button.tagName === 'A' && button.href);\n  };\n  /**\n   * IE 11 shim for https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat\n   */\n\n\n  var keydownRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](false);\n  var handleKeyDown = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // Check if key is already down to avoid repeats being counted as multiple activations\n    if (focusRipple && !keydownRef.current && focusVisible && rippleRef.current && event.key === ' ') {\n      keydownRef.current = true;\n      event.persist();\n      rippleRef.current.stop(event, function () {\n        rippleRef.current.start(event);\n      });\n    }\n\n    if (event.target === event.currentTarget && isNonNativeButton() && event.key === ' ') {\n      event.preventDefault();\n    }\n\n    if (onKeyDown) {\n      onKeyDown(event);\n    } // Keyboard accessibility for non interactive elements\n\n\n    if (event.target === event.currentTarget && isNonNativeButton() && event.key === 'Enter' && !disabled) {\n      event.preventDefault();\n\n      if (onClick) {\n        onClick(event);\n      }\n    }\n  });\n  var handleKeyUp = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // calling preventDefault in keyUp on a <button> will not dispatch a click event if Space is pressed\n    // https://codesandbox.io/s/button-keyup-preventdefault-dn7f0\n    if (focusRipple && event.key === ' ' && rippleRef.current && focusVisible && !event.defaultPrevented) {\n      keydownRef.current = false;\n      event.persist();\n      rippleRef.current.stop(event, function () {\n        rippleRef.current.pulsate(event);\n      });\n    }\n\n    if (onKeyUp) {\n      onKeyUp(event);\n    } // Keyboard accessibility for non interactive elements\n\n\n    if (onClick && event.target === event.currentTarget && isNonNativeButton() && event.key === ' ' && !event.defaultPrevented) {\n      onClick(event);\n    }\n  });\n  var ComponentProp = component;\n\n  if (ComponentProp === 'button' && other.href) {\n    ComponentProp = 'a';\n  }\n\n  var buttonProps = {};\n\n  if (ComponentProp === 'button') {\n    buttonProps.type = type;\n    buttonProps.disabled = disabled;\n  } else {\n    if (ComponentProp !== 'a' || !other.href) {\n      buttonProps.role = 'button';\n    }\n\n    buttonProps['aria-disabled'] = disabled;\n  }\n\n  var handleUserRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(buttonRefProp, ref);\n  var handleOwnRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(focusVisibleRef, buttonRef);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(handleUserRef, handleOwnRef);\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      mountedState = _React$useState2[0],\n      setMountedState = _React$useState2[1];\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    setMountedState(true);\n  }, []);\n  var enableTouchRipple = mountedState && !disableRipple && !disabled;\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n      if (enableTouchRipple && !rippleRef.current) {\n        console.error(['Material-UI: The `component` prop provided to ButtonBase is invalid.', 'Please make sure the children prop is rendered in this custom component.'].join('\\n'));\n      }\n    }, [enableTouchRipple]);\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](ComponentProp, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, focusVisible && [classes.focusVisible, focusVisibleClassName], disabled && classes.disabled),\n    onBlur: handleBlur,\n    onClick: onClick,\n    onFocus: handleFocus,\n    onKeyDown: handleKeyDown,\n    onKeyUp: handleKeyUp,\n    onMouseDown: handleMouseDown,\n    onMouseLeave: handleMouseLeave,\n    onMouseUp: handleMouseUp,\n    onDragLeave: handleDragLeave,\n    onTouchEnd: handleTouchEnd,\n    onTouchMove: handleTouchMove,\n    onTouchStart: handleTouchStart,\n    ref: handleRef,\n    tabIndex: disabled ? -1 : tabIndex\n  }, buttonProps, other), children, enableTouchRipple ?\n  /*#__PURE__*/\n\n  /* TouchRipple is only needed client-side, x2 boost on the server. */\n  react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_TouchRipple__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    ref: rippleRef,\n    center: centerRipple\n  }, TouchRippleProps)) : null);\n});\n true ? ButtonBase.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A ref for imperative actions.\n   * It currently only supports `focusVisible()` action.\n   */\n  action: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /**\n   * @ignore\n   *\n   * Use that prop to pass a ref to the native button component.\n   * @deprecated Use `ref` instead.\n   */\n  buttonRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /**\n   * If `true`, the ripples will be centered.\n   * They won't start at the cursor interaction position.\n   */\n  centerRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"elementTypeAcceptingRef\"],\n\n  /**\n   * If `true`, the base button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   *\n   * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n   * to highlight the element by applying separate styles with the `focusVisibleClassName`.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the touch ripple effect will be disabled.\n   */\n  disableTouchRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the base button will have a keyboard focus ripple.\n   */\n  focusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * This prop can help a person know which element has the keyboard focus.\n   * The class name will be applied when the element gain the focus through a keyboard interaction.\n   * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\n   * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/master/explainer.md).\n   * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components\n   * if needed.\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onDragLeave: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is focused with a keyboard.\n   * We trigger a `onFocus` callback too.\n   */\n  onFocusVisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseUp: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchEnd: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchMove: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchStart: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Props applied to the `TouchRipple` element.\n   */\n  TouchRippleProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['button', 'reset', 'submit']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(styles, {\n  name: 'MuiButtonBase'\n})(ButtonBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n\n\n\n\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"];\n/**\n * @ignore - internal component.\n */\n\nfunction Ripple(props) {\n  var classes = props.classes,\n      _props$pulsate = props.pulsate,\n      pulsate = _props$pulsate === void 0 ? false : _props$pulsate,\n      rippleX = props.rippleX,\n      rippleY = props.rippleY,\n      rippleSize = props.rippleSize,\n      inProp = props.in,\n      _props$onExited = props.onExited,\n      onExited = _props$onExited === void 0 ? function () {} : _props$onExited,\n      timeout = props.timeout;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](false),\n      leaving = _React$useState[0],\n      setLeaving = _React$useState[1];\n\n  var rippleClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.ripple, classes.rippleVisible, pulsate && classes.ripplePulsate);\n  var rippleStyles = {\n    width: rippleSize,\n    height: rippleSize,\n    top: -(rippleSize / 2) + rippleY,\n    left: -(rippleSize / 2) + rippleX\n  };\n  var childClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.child, leaving && classes.childLeaving, pulsate && classes.childPulsate);\n  var handleExited = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(onExited); // Ripple is used for user feedback (e.g. click or press) so we want to apply styles with the highest priority\n\n  useEnhancedEffect(function () {\n    if (!inProp) {\n      // react-transition-group#onExit\n      setLeaving(true); // react-transition-group#onExited\n\n      var timeoutId = setTimeout(handleExited, timeout);\n      return function () {\n        clearTimeout(timeoutId);\n      };\n    }\n\n    return undefined;\n  }, [handleExited, inProp, timeout]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n    className: rippleClassName,\n    style: rippleStyles\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n    className: childClassName\n  }));\n}\n\n true ? Ripple.propTypes = {\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n\n  /**\n   * @ignore - injected from TransitionGroup\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n  /**\n   * @ignore - injected from TransitionGroup\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n\n  /**\n   * If `true`, the ripple pulsates, typically indicating the keyboard focus state of an element.\n   */\n  pulsate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n  /**\n   * Diameter of the ripple.\n   */\n  rippleSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * Horizontal position of the ripple center.\n   */\n  rippleX: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * Vertical position of the ripple center.\n   */\n  rippleY: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * exit delay\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Ripple);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js ***!
-  \**********************************************************************************/
-/*! exports provided: DELAY_RIPPLE, styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DELAY_RIPPLE\", function() { return DELAY_RIPPLE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Ripple__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Ripple */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js\");\n\n\n\n\n\n\n\n\n\nvar DURATION = 550;\nvar DELAY_RIPPLE = 80;\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      overflow: 'hidden',\n      pointerEvents: 'none',\n      position: 'absolute',\n      zIndex: 0,\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      borderRadius: 'inherit'\n    },\n\n    /* Styles applied to the internal `Ripple` components `ripple` class. */\n    ripple: {\n      opacity: 0,\n      position: 'absolute'\n    },\n\n    /* Styles applied to the internal `Ripple` components `rippleVisible` class. */\n    rippleVisible: {\n      opacity: 0.3,\n      transform: 'scale(1)',\n      animation: \"$enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n    },\n\n    /* Styles applied to the internal `Ripple` components `ripplePulsate` class. */\n    ripplePulsate: {\n      animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n    },\n\n    /* Styles applied to the internal `Ripple` components `child` class. */\n    child: {\n      opacity: 1,\n      display: 'block',\n      width: '100%',\n      height: '100%',\n      borderRadius: '50%',\n      backgroundColor: 'currentColor'\n    },\n\n    /* Styles applied to the internal `Ripple` components `childLeaving` class. */\n    childLeaving: {\n      opacity: 0,\n      animation: \"$exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n    },\n\n    /* Styles applied to the internal `Ripple` components `childPulsate` class. */\n    childPulsate: {\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      animation: \"$pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\")\n    },\n    '@keyframes enter': {\n      '0%': {\n        transform: 'scale(0)',\n        opacity: 0.1\n      },\n      '100%': {\n        transform: 'scale(1)',\n        opacity: 0.3\n      }\n    },\n    '@keyframes exit': {\n      '0%': {\n        opacity: 1\n      },\n      '100%': {\n        opacity: 0\n      }\n    },\n    '@keyframes pulsate': {\n      '0%': {\n        transform: 'scale(1)'\n      },\n      '50%': {\n        transform: 'scale(0.92)'\n      },\n      '100%': {\n        transform: 'scale(1)'\n      }\n    }\n  };\n};\n/**\n * @ignore - internal component.\n *\n * TODO v5: Make private\n */\n\nvar TouchRipple = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function TouchRipple(props, ref) {\n  var _props$center = props.center,\n      centerProp = _props$center === void 0 ? false : _props$center,\n      classes = props.classes,\n      className = props.className,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"center\", \"classes\", \"className\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__[\"useState\"]([]),\n      ripples = _React$useState[0],\n      setRipples = _React$useState[1];\n\n  var nextKey = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](0);\n  var rippleCallback = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (rippleCallback.current) {\n      rippleCallback.current();\n      rippleCallback.current = null;\n    }\n  }, [ripples]); // Used to filter out mouse emulated events on mobile.\n\n  var ignoringMouseDown = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](false); // We use a timer in order to only show the ripples for touch \"click\" like events.\n  // We don't want to display the ripple for touch scroll events.\n\n  var startTimer = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null); // This is the hook called once the previous timeout is ready.\n\n  var startTimerCommit = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var container = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    return function () {\n      clearTimeout(startTimer.current);\n    };\n  }, []);\n  var startCommit = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (params) {\n    var pulsate = params.pulsate,\n        rippleX = params.rippleX,\n        rippleY = params.rippleY,\n        rippleSize = params.rippleSize,\n        cb = params.cb;\n    setRipples(function (oldRipples) {\n      return [].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(oldRipples), [/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_Ripple__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n        key: nextKey.current,\n        classes: classes,\n        timeout: DURATION,\n        pulsate: pulsate,\n        rippleX: rippleX,\n        rippleY: rippleY,\n        rippleSize: rippleSize\n      })]);\n    });\n    nextKey.current += 1;\n    rippleCallback.current = cb;\n  }, [classes]);\n  var start = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function () {\n    var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var cb = arguments.length > 2 ? arguments[2] : undefined;\n    var _options$pulsate = options.pulsate,\n        pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n        _options$center = options.center,\n        center = _options$center === void 0 ? centerProp || options.pulsate : _options$center,\n        _options$fakeElement = options.fakeElement,\n        fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n\n    if (event.type === 'mousedown' && ignoringMouseDown.current) {\n      ignoringMouseDown.current = false;\n      return;\n    }\n\n    if (event.type === 'touchstart') {\n      ignoringMouseDown.current = true;\n    }\n\n    var element = fakeElement ? null : container.current;\n    var rect = element ? element.getBoundingClientRect() : {\n      width: 0,\n      height: 0,\n      left: 0,\n      top: 0\n    }; // Get the size of the ripple\n\n    var rippleX;\n    var rippleY;\n    var rippleSize;\n\n    if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n      rippleX = Math.round(rect.width / 2);\n      rippleY = Math.round(rect.height / 2);\n    } else {\n      var _ref = event.touches ? event.touches[0] : event,\n          clientX = _ref.clientX,\n          clientY = _ref.clientY;\n\n      rippleX = Math.round(clientX - rect.left);\n      rippleY = Math.round(clientY - rect.top);\n    }\n\n    if (center) {\n      rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n      if (rippleSize % 2 === 0) {\n        rippleSize += 1;\n      }\n    } else {\n      var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n      var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n      rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n    } // Touche devices\n\n\n    if (event.touches) {\n      // check that this isn't another touchstart due to multitouch\n      // otherwise we will only clear a single timer when unmounting while two\n      // are running\n      if (startTimerCommit.current === null) {\n        // Prepare the ripple effect.\n        startTimerCommit.current = function () {\n          startCommit({\n            pulsate: pulsate,\n            rippleX: rippleX,\n            rippleY: rippleY,\n            rippleSize: rippleSize,\n            cb: cb\n          });\n        }; // Delay the execution of the ripple effect.\n\n\n        startTimer.current = setTimeout(function () {\n          if (startTimerCommit.current) {\n            startTimerCommit.current();\n            startTimerCommit.current = null;\n          }\n        }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n      }\n    } else {\n      startCommit({\n        pulsate: pulsate,\n        rippleX: rippleX,\n        rippleY: rippleY,\n        rippleSize: rippleSize,\n        cb: cb\n      });\n    }\n  }, [centerProp, startCommit]);\n  var pulsate = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function () {\n    start({}, {\n      pulsate: true\n    });\n  }, [start]);\n  var stop = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (event, cb) {\n    clearTimeout(startTimer.current); // The touch interaction occurs too quickly.\n    // We still want to show ripple effect.\n\n    if (event.type === 'touchend' && startTimerCommit.current) {\n      event.persist();\n      startTimerCommit.current();\n      startTimerCommit.current = null;\n      startTimer.current = setTimeout(function () {\n        stop(event, cb);\n      });\n      return;\n    }\n\n    startTimerCommit.current = null;\n    setRipples(function (oldRipples) {\n      if (oldRipples.length > 0) {\n        return oldRipples.slice(1);\n      }\n\n      return oldRipples;\n    });\n    rippleCallback.current = cb;\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useImperativeHandle\"](ref, function () {\n    return {\n      pulsate: pulsate,\n      start: start,\n      stop: stop\n    };\n  }, [pulsate, start, stop]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(classes.root, className),\n    ref: container\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"TransitionGroup\"], {\n    component: null,\n    exit: true\n  }, ripples));\n});\n true ? TouchRipple.propTypes = {\n  /**\n   * If `true`, the ripple starts at the center of the component\n   * rather than at the point of interaction.\n   */\n  center: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  flip: false,\n  name: 'MuiTouchRipple'\n})( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"memo\"](TouchRipple)));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ButtonBase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _internal_SwitchBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/SwitchBase */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js\");\n/* harmony import */ var _internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../internal/svg-icons/CheckBoxOutlineBlank */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js\");\n/* harmony import */ var _internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/svg-icons/CheckBox */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../internal/svg-icons/IndeterminateCheckBox */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      color: theme.palette.text.secondary\n    },\n\n    /* Pseudo-class applied to the root element if `checked={true}`. */\n    checked: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `indeterminate={true}`. */\n    indeterminate: {},\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      '&$checked': {\n        color: theme.palette.primary.main,\n        '&:hover': {\n          backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n          // Reset on touch devices, it doesn't add specificity\n          '@media (hover: none)': {\n            backgroundColor: 'transparent'\n          }\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      '&$checked': {\n        color: theme.palette.secondary.main,\n        '&:hover': {\n          backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n          // Reset on touch devices, it doesn't add specificity\n          '@media (hover: none)': {\n            backgroundColor: 'transparent'\n          }\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    }\n  };\n};\nvar defaultCheckedIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null);\nvar defaultIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null);\nvar defaultIndeterminateIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null);\nvar Checkbox = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Checkbox(props, ref) {\n  var _props$checkedIcon = props.checkedIcon,\n      checkedIcon = _props$checkedIcon === void 0 ? defaultCheckedIcon : _props$checkedIcon,\n      classes = props.classes,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'secondary' : _props$color,\n      _props$icon = props.icon,\n      iconProp = _props$icon === void 0 ? defaultIcon : _props$icon,\n      _props$indeterminate = props.indeterminate,\n      indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate,\n      _props$indeterminateI = props.indeterminateIcon,\n      indeterminateIconProp = _props$indeterminateI === void 0 ? defaultIndeterminateIcon : _props$indeterminateI,\n      inputProps = props.inputProps,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"checkedIcon\", \"classes\", \"color\", \"icon\", \"indeterminate\", \"indeterminateIcon\", \"inputProps\", \"size\"]);\n\n  var icon = indeterminate ? indeterminateIconProp : iconProp;\n  var indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_SwitchBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    type: \"checkbox\",\n    classes: {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(color))], indeterminate && classes.indeterminate),\n      checked: classes.checked,\n      disabled: classes.disabled\n    },\n    color: color,\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      'data-indeterminate': indeterminate\n    }, inputProps),\n    icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](icon, {\n      fontSize: icon.props.fontSize === undefined && size === \"small\" ? size : icon.props.fontSize\n    }),\n    checkedIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](indeterminateIcon, {\n      fontSize: indeterminateIcon.props.fontSize === undefined && size === \"small\" ? size : indeterminateIcon.props.fontSize\n    }),\n    ref: ref\n  }, other));\n});\n true ? Checkbox.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the component is checked.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is checked.\n   */\n  checkedIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the checkbox will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is unchecked.\n   */\n  icon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the component appears indeterminate.\n   * This does not set the native input element to indeterminate due\n   * to inconsistent behavior across browsers.\n   * However, we set a `data-indeterminate` attribute on the input.\n   */\n  indeterminate: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is indeterminate.\n   */\n  indeterminateIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The size of the checkbox.\n   * `small` is equivalent to the dense checkbox styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * The value of the component. The DOM API casts this to a string.\n   * The browser uses \"on\" as the default value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_12__[\"default\"])(styles, {\n  name: 'MuiCheckbox'\n})(Checkbox));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Checkbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Checkbox */ \"./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Checkbox__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js ***!
-  \*********************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\nvar SIZE = 44;\n\nfunction getRelativeValue(value, min, max) {\n  return (Math.min(Math.max(min, value), max) - min) / (max - min);\n}\n\nfunction easeOut(t) {\n  t = getRelativeValue(t, 0, 1); // https://gist.github.com/gre/1650294\n\n  t = (t -= 1) * t * t + 1;\n  return t;\n}\n\nfunction easeIn(t) {\n  return t * t;\n}\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'inline-block'\n    },\n\n    /* Styles applied to the root element if `variant=\"static\"`. */\n    static: {\n      transition: theme.transitions.create('transform')\n    },\n\n    /* Styles applied to the root element if `variant=\"indeterminate\"`. */\n    indeterminate: {\n      animation: '$circular-rotate 1.4s linear infinite'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the `svg` element. */\n    svg: {\n      display: 'block' // Keeps the progress centered\n\n    },\n\n    /* Styles applied to the `circle` svg path. */\n    circle: {\n      stroke: 'currentColor' // Use butt to follow the specification, by chance, it's already the default CSS value.\n      // strokeLinecap: 'butt',\n\n    },\n\n    /* Styles applied to the `circle` svg path if `variant=\"static\"`. */\n    circleStatic: {\n      transition: theme.transitions.create('stroke-dashoffset')\n    },\n\n    /* Styles applied to the `circle` svg path if `variant=\"indeterminate\"`. */\n    circleIndeterminate: {\n      animation: '$circular-dash 1.4s ease-in-out infinite',\n      // Some default value that looks fine waiting for the animation to kicks in.\n      strokeDasharray: '80px, 200px',\n      strokeDashoffset: '0px' // Add the unit to fix a Edge 16 and below bug.\n\n    },\n    '@keyframes circular-rotate': {\n      '0%': {\n        // Fix IE 11 wobbly\n        transformOrigin: '50% 50%'\n      },\n      '100%': {\n        transform: 'rotate(360deg)'\n      }\n    },\n    '@keyframes circular-dash': {\n      '0%': {\n        strokeDasharray: '1px, 200px',\n        strokeDashoffset: '0px'\n      },\n      '50%': {\n        strokeDasharray: '100px, 200px',\n        strokeDashoffset: '-15px'\n      },\n      '100%': {\n        strokeDasharray: '100px, 200px',\n        strokeDashoffset: '-125px'\n      }\n    },\n\n    /* Styles applied to the `circle` svg path if `disableShrink={true}`. */\n    circleDisableShrink: {\n      animation: 'none'\n    }\n  };\n};\n/**\n * ## ARIA\n *\n * If the progress bar is describing the loading progress of a particular region of a page,\n * you should use `aria-describedby` to point to the progress bar, and set the `aria-busy`\n * attribute to `true` on that region until it has finished loading.\n */\n\nvar CircularProgress = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function CircularProgress(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$disableShrink = props.disableShrink,\n      disableShrink = _props$disableShrink === void 0 ? false : _props$disableShrink,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 40 : _props$size,\n      style = props.style,\n      _props$thickness = props.thickness,\n      thickness = _props$thickness === void 0 ? 3.6 : _props$thickness,\n      _props$value = props.value,\n      value = _props$value === void 0 ? 0 : _props$value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'indeterminate' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"color\", \"disableShrink\", \"size\", \"style\", \"thickness\", \"value\", \"variant\"]);\n\n  var circleStyle = {};\n  var rootStyle = {};\n  var rootProps = {};\n\n  if (variant === 'determinate' || variant === 'static') {\n    var circumference = 2 * Math.PI * ((SIZE - thickness) / 2);\n    circleStyle.strokeDasharray = circumference.toFixed(3);\n    rootProps['aria-valuenow'] = Math.round(value);\n\n    if (variant === 'static') {\n      circleStyle.strokeDashoffset = \"\".concat(((100 - value) / 100 * circumference).toFixed(3), \"px\");\n      rootStyle.transform = 'rotate(-90deg)';\n    } else {\n      circleStyle.strokeDashoffset = \"\".concat((easeIn((100 - value) / 100) * circumference).toFixed(3), \"px\");\n      rootStyle.transform = \"rotate(\".concat((easeOut(value / 70) * 270).toFixed(3), \"deg)\");\n    }\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'inherit' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(color))], {\n      'indeterminate': classes.indeterminate,\n      'static': classes.static\n    }[variant]),\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      width: size,\n      height: size\n    }, rootStyle, style),\n    ref: ref,\n    role: \"progressbar\"\n  }, rootProps, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"svg\", {\n    className: classes.svg,\n    viewBox: \"\".concat(SIZE / 2, \" \").concat(SIZE / 2, \" \").concat(SIZE, \" \").concat(SIZE)\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"circle\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.circle, disableShrink && classes.circleDisableShrink, {\n      'indeterminate': classes.circleIndeterminate,\n      'static': classes.circleStatic\n    }[variant]),\n    style: circleStyle,\n    cx: SIZE,\n    cy: SIZE,\n    r: (SIZE - thickness) / 2,\n    fill: \"none\",\n    strokeWidth: thickness\n  })));\n});\n true ? CircularProgress.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['inherit', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the shrink animation is disabled.\n   * This only works if variant is `indeterminate`.\n   */\n  disableShrink: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, function (props) {\n    if (props.disableShrink && props.variant && props.variant !== 'indeterminate') {\n      return new Error('Material-UI: You have provided the `disableShrink` prop ' + 'with a variant other than `indeterminate`. This will have no effect.');\n    }\n\n    return null;\n  }),\n\n  /**\n   * The size of the circle.\n   * If using a number, the pixel unit is assumed.\n   * If using a string, you need to provide the CSS unit, e.g '3rem'.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The thickness of the circle.\n   */\n  thickness: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * The value of the progress indicator for the determinate and static variants.\n   * Value between 0 and 100.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * The variant to use.\n   * Use indeterminate when there is no progress value.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['determinate', 'indeterminate', 'static'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiCircularProgress',\n  flip: false\n})(CircularProgress));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CircularProgress__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CircularProgress */ \"./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _CircularProgress__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      width: '100%',\n      marginLeft: 'auto',\n      boxSizing: 'border-box',\n      marginRight: 'auto',\n      paddingLeft: theme.spacing(2),\n      paddingRight: theme.spacing(2),\n      display: 'block'\n    }, theme.breakpoints.up('sm'), {\n      paddingLeft: theme.spacing(3),\n      paddingRight: theme.spacing(3)\n    }),\n\n    /* Styles applied to the root element if `disableGutters={true}`. */\n    disableGutters: {\n      paddingLeft: 0,\n      paddingRight: 0\n    },\n\n    /* Styles applied to the root element if `fixed={true}`. */\n    fixed: Object.keys(theme.breakpoints.values).reduce(function (acc, breakpoint) {\n      var value = theme.breakpoints.values[breakpoint];\n\n      if (value !== 0) {\n        acc[theme.breakpoints.up(breakpoint)] = {\n          maxWidth: value\n        };\n      }\n\n      return acc;\n    }, {}),\n\n    /* Styles applied to the root element if `maxWidth=\"xs\"`. */\n    maxWidthXs: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('xs'), {\n      maxWidth: Math.max(theme.breakpoints.values.xs, 444)\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"sm\"`. */\n    maxWidthSm: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('sm'), {\n      maxWidth: theme.breakpoints.values.sm\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"md\"`. */\n    maxWidthMd: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('md'), {\n      maxWidth: theme.breakpoints.values.md\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"lg\"`. */\n    maxWidthLg: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('lg'), {\n      maxWidth: theme.breakpoints.values.lg\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"xl\"`. */\n    maxWidthXl: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('xl'), {\n      maxWidth: theme.breakpoints.values.xl\n    })\n  };\n};\nvar Container = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Container(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      _props$fixed = props.fixed,\n      fixed = _props$fixed === void 0 ? false : _props$fixed,\n      _props$maxWidth = props.maxWidth,\n      maxWidth = _props$maxWidth === void 0 ? 'lg' : _props$maxWidth,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"disableGutters\", \"fixed\", \"maxWidth\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, fixed && classes.fixed, disableGutters && classes.disableGutters, maxWidth !== false && classes[\"maxWidth\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(String(maxWidth)))]),\n    ref: ref\n  }, other));\n});\n true ? Container.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Set the max-width to match the min-width of the current breakpoint.\n   * This is useful if you'd prefer to design for a fixed set of sizes\n   * instead of trying to accommodate a fully fluid viewport.\n   * It's fluid by default.\n   */\n  fixed: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Determine the max-width of the container.\n   * The container width grows with the size of the screen.\n   * Set to `false` to disable `maxWidth`.\n   */\n  maxWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['lg', 'md', 'sm', 'xl', 'xs', false])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiContainer'\n})(Container));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Container/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Container/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Container */ \"./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Container__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Container/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js ***!
-  \***********************************************************************************/
-/*! exports provided: html, body, styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"html\", function() { return html; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"body\", function() { return body; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n\n\n\nvar html = {\n  WebkitFontSmoothing: 'antialiased',\n  // Antialiasing.\n  MozOsxFontSmoothing: 'grayscale',\n  // Antialiasing.\n  // Change from `box-sizing: content-box` so that `width`\n  // is not affected by `padding` or `border`.\n  boxSizing: 'border-box'\n};\nvar body = function body(theme) {\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    color: theme.palette.text.primary\n  }, theme.typography.body2, {\n    backgroundColor: theme.palette.background.default,\n    '@media print': {\n      // Save printer ink.\n      backgroundColor: theme.palette.common.white\n    }\n  });\n};\nvar styles = function styles(theme) {\n  return {\n    '@global': {\n      html: html,\n      '*, *::before, *::after': {\n        boxSizing: 'inherit'\n      },\n      'strong, b': {\n        fontWeight: theme.typography.fontWeightBold\n      },\n      body: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        margin: 0\n      }, body(theme), {\n        // Add support for document.body.requestFullScreen().\n        // Other elements, if background transparent, are not supported.\n        '&::backdrop': {\n          backgroundColor: theme.palette.background.default\n        }\n      })\n    }\n  };\n};\n/**\n * Kickstart an elegant, consistent, and simple baseline to build upon.\n */\n\nfunction CssBaseline(props) {\n  /* eslint-disable no-unused-vars */\n  var _props$children = props.children,\n      children = _props$children === void 0 ? null : _props$children,\n      classes = props.classes;\n  /* eslint-enable no-unused-vars */\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_1__[\"Fragment\"], null, children);\n}\n\n true ? CssBaseline.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * You can wrap a node.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  CssBaseline['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"exactProp\"])(CssBaseline.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(styles, {\n  name: 'MuiCssBaseline'\n})(CssBaseline));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CssBaseline__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CssBaseline */ \"./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _CssBaseline__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js\");\n/* harmony import */ var _Backdrop__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Backdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js\");\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js\");\n/* harmony import */ var _styles_transitions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      '@media print': {\n        // Use !important to override the Modal inline-style.\n        position: 'absolute !important'\n      }\n    },\n\n    /* Styles applied to the container element if `scroll=\"paper\"`. */\n    scrollPaper: {\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n\n    /* Styles applied to the container element if `scroll=\"body\"`. */\n    scrollBody: {\n      overflowY: 'auto',\n      overflowX: 'hidden',\n      textAlign: 'center',\n      '&:after': {\n        content: '\"\"',\n        display: 'inline-block',\n        verticalAlign: 'middle',\n        height: '100%',\n        width: '0'\n      }\n    },\n\n    /* Styles applied to the container element. */\n    container: {\n      height: '100%',\n      '@media print': {\n        height: 'auto'\n      },\n      // We disable the focus ring for mouse, touch and keyboard users.\n      outline: 0\n    },\n\n    /* Styles applied to the `Paper` component. */\n    paper: {\n      margin: 32,\n      position: 'relative',\n      overflowY: 'auto',\n      // Fix IE 11 issue, to remove at some point.\n      '@media print': {\n        overflowY: 'visible',\n        boxShadow: 'none'\n      }\n    },\n\n    /* Styles applied to the `Paper` component if `scroll=\"paper\"`. */\n    paperScrollPaper: {\n      display: 'flex',\n      flexDirection: 'column',\n      maxHeight: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `scroll=\"body\"`. */\n    paperScrollBody: {\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      textAlign: 'left' // 'initial' doesn't work on IE 11\n\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=false`. */\n    paperWidthFalse: {\n      maxWidth: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"xs\"`. */\n    paperWidthXs: {\n      maxWidth: Math.max(theme.breakpoints.values.xs, 444),\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(Math.max(theme.breakpoints.values.xs, 444) + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"sm\"`. */\n    paperWidthSm: {\n      maxWidth: theme.breakpoints.values.sm,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.sm + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"md\"`. */\n    paperWidthMd: {\n      maxWidth: theme.breakpoints.values.md,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.md + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"lg\"`. */\n    paperWidthLg: {\n      maxWidth: theme.breakpoints.values.lg,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.lg + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"xl\"`. */\n    paperWidthXl: {\n      maxWidth: theme.breakpoints.values.xl,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.xl + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `fullWidth={true}`. */\n    paperFullWidth: {\n      width: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `fullScreen={true}`. */\n    paperFullScreen: {\n      margin: 0,\n      width: '100%',\n      maxWidth: '100%',\n      height: '100%',\n      maxHeight: 'none',\n      borderRadius: 0,\n      '&$paperScrollBody': {\n        margin: 0,\n        maxWidth: '100%'\n      }\n    }\n  };\n};\nvar defaultTransitionDuration = {\n  enter: _styles_transitions__WEBPACK_IMPORTED_MODULE_11__[\"duration\"].enteringScreen,\n  exit: _styles_transitions__WEBPACK_IMPORTED_MODULE_11__[\"duration\"].leavingScreen\n};\n/**\n * Dialogs are overlaid modal paper based components with a backdrop.\n */\n\nvar Dialog = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Dialog(props, ref) {\n  var BackdropProps = props.BackdropProps,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$disableBackdro = props.disableBackdropClick,\n      disableBackdropClick = _props$disableBackdro === void 0 ? false : _props$disableBackdro,\n      _props$disableEscapeK = props.disableEscapeKeyDown,\n      disableEscapeKeyDown = _props$disableEscapeK === void 0 ? false : _props$disableEscapeK,\n      _props$fullScreen = props.fullScreen,\n      fullScreen = _props$fullScreen === void 0 ? false : _props$fullScreen,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$maxWidth = props.maxWidth,\n      maxWidth = _props$maxWidth === void 0 ? 'sm' : _props$maxWidth,\n      onBackdropClick = props.onBackdropClick,\n      onClose = props.onClose,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onEscapeKeyDown = props.onEscapeKeyDown,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      open = props.open,\n      _props$PaperComponent = props.PaperComponent,\n      PaperComponent = _props$PaperComponent === void 0 ? _Paper__WEBPACK_IMPORTED_MODULE_12__[\"default\"] : _props$PaperComponent,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      _props$scroll = props.scroll,\n      scroll = _props$scroll === void 0 ? 'paper' : _props$scroll,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Fade__WEBPACK_IMPORTED_MODULE_10__[\"default\"] : _props$TransitionComp,\n      _props$transitionDura = props.transitionDuration,\n      transitionDuration = _props$transitionDura === void 0 ? defaultTransitionDuration : _props$transitionDura,\n      TransitionProps = props.TransitionProps,\n      ariaDescribedby = props['aria-describedby'],\n      ariaLabelledby = props['aria-labelledby'],\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"BackdropProps\", \"children\", \"classes\", \"className\", \"disableBackdropClick\", \"disableEscapeKeyDown\", \"fullScreen\", \"fullWidth\", \"maxWidth\", \"onBackdropClick\", \"onClose\", \"onEnter\", \"onEntered\", \"onEntering\", \"onEscapeKeyDown\", \"onExit\", \"onExited\", \"onExiting\", \"open\", \"PaperComponent\", \"PaperProps\", \"scroll\", \"TransitionComponent\", \"transitionDuration\", \"TransitionProps\", \"aria-describedby\", \"aria-labelledby\"]);\n\n  var mouseDownTarget = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n\n  var handleMouseDown = function handleMouseDown(event) {\n    mouseDownTarget.current = event.target;\n  };\n\n  var handleBackdropClick = function handleBackdropClick(event) {\n    // Ignore the events not coming from the \"backdrop\"\n    // We don't want to close the dialog when clicking the dialog content.\n    if (event.target !== event.currentTarget) {\n      return;\n    } // Make sure the event starts and ends on the same DOM element.\n\n\n    if (event.target !== mouseDownTarget.current) {\n      return;\n    }\n\n    mouseDownTarget.current = null;\n\n    if (onBackdropClick) {\n      onBackdropClick(event);\n    }\n\n    if (!disableBackdropClick && onClose) {\n      onClose(event, 'backdropClick');\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_Modal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n    BackdropComponent: _Backdrop__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n    BackdropProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      transitionDuration: transitionDuration\n    }, BackdropProps),\n    closeAfterTransition: true,\n    disableBackdropClick: disableBackdropClick,\n    disableEscapeKeyDown: disableEscapeKeyDown,\n    onEscapeKeyDown: onEscapeKeyDown,\n    onClose: onClose,\n    open: open,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: open,\n    timeout: transitionDuration,\n    onEnter: onEnter,\n    onEntering: onEntering,\n    onEntered: onEntered,\n    onExit: onExit,\n    onExiting: onExiting,\n    onExited: onExited,\n    role: \"none presentation\"\n  }, TransitionProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"div\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.container, classes[\"scroll\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(scroll))]),\n    onMouseUp: handleBackdropClick,\n    onMouseDown: handleMouseDown\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](PaperComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    elevation: 24,\n    role: \"dialog\",\n    \"aria-describedby\": ariaDescribedby,\n    \"aria-labelledby\": ariaLabelledby\n  }, PaperProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.paper, classes[\"paperScroll\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(scroll))], classes[\"paperWidth\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(String(maxWidth)))], PaperProps.className, fullScreen && classes.paperFullScreen, fullWidth && classes.paperFullWidth)\n  }), children))));\n});\n true ? Dialog.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The id(s) of the element(s) that describe the dialog.\n   */\n  'aria-describedby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The id(s) of the element(s) that label the dialog.\n   */\n  'aria-labelledby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  BackdropProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Dialog children, usually the included sub-components.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, clicking the backdrop will not fire the `onClose` callback.\n   */\n  disableBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, hitting escape will not fire the `onClose` callback.\n   */\n  disableEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the dialog will be full-screen\n   */\n  fullScreen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the dialog stretches to `maxWidth`.\n   *\n   * Notice that the dialog width grow is limited by the default margin.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Determine the max-width of the dialog.\n   * The dialog width grows with the size of the screen.\n   * Set to `false` to disable `maxWidth`.\n   */\n  maxWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['lg', 'md', 'sm', 'xl', 'xs', false]),\n\n  /**\n   * Callback fired when the backdrop is clicked.\n   */\n  onBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the dialog enters.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the escape key is pressed,\n   * `disableKeyboard` is false and the modal is in focus.\n   */\n  onEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the dialog exits.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the Dialog is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * The component used to render the body of the dialog.\n   */\n  PaperComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * Props applied to the [`Paper`](/api/paper/) element.\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Determine the container for scrolling the dialog.\n   */\n  scroll: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['body', 'paper']),\n\n  /**\n   * The component used for the transition.\n   * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n   */\n  TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })]),\n\n  /**\n   * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.\n   */\n  TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiDialog'\n})(Dialog));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Dialog */ \"./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Dialog__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js ***!
-  \***********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    margin: 0,\n    padding: '16px 24px',\n    flex: '0 0 auto'\n  }\n};\nvar DialogTitle = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function DialogTitle(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$disableTypogra = props.disableTypography,\n      disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"disableTypography\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n    ref: ref\n  }, other), disableTypography ? children : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n    component: \"h2\",\n    variant: \"h6\"\n  }, children));\n});\n true ? DialogTitle.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the children won't be wrapped by a typography component.\n   * For instance, this can be useful to render an h4 instead of the default h2.\n   */\n  disableTypography: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiDialogTitle'\n})(DialogTitle));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _DialogTitle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DialogTitle */ \"./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _DialogTitle__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var _styles_transitions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _transitions_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../transitions/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  entering: {\n    opacity: 1\n  },\n  entered: {\n    opacity: 1\n  }\n};\nvar defaultTimeout = {\n  enter: _styles_transitions__WEBPACK_IMPORTED_MODULE_6__[\"duration\"].enteringScreen,\n  exit: _styles_transitions__WEBPACK_IMPORTED_MODULE_6__[\"duration\"].leavingScreen\n};\n/**\n * The Fade transition is used by the [Modal](/components/modal/) component.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nvar Fade = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Fade(props, ref) {\n  var children = props.children,\n      _props$disableStrictM = props.disableStrictModeCompat,\n      disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,\n      inProp = props.in,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      style = props.style,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"Transition\"] : _props$TransitionComp,\n      _props$timeout = props.timeout,\n      timeout = _props$timeout === void 0 ? defaultTimeout : _props$timeout,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"disableStrictModeCompat\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"TransitionComponent\", \"timeout\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;\n  var nodeRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var foreignRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(children.ref, ref);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(enableStrictModeCompat ? nodeRef : undefined, foreignRef);\n\n  var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {\n    return function (nodeOrAppearing, maybeAppearing) {\n      if (callback) {\n        var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],\n            _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, 2),\n            node = _ref2[0],\n            isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n\n        if (isAppearing === undefined) {\n          callback(node);\n        } else {\n          callback(node, isAppearing);\n        }\n      }\n    };\n  };\n\n  var handleEntering = normalizedTransitionCallback(onEntering);\n  var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {\n    Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"reflow\"])(node); // So the animation always start from the start.\n\n    var transitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'enter'\n    });\n    node.style.webkitTransition = theme.transitions.create('opacity', transitionProps);\n    node.style.transition = theme.transitions.create('opacity', transitionProps);\n\n    if (onEnter) {\n      onEnter(node, isAppearing);\n    }\n  });\n  var handleEntered = normalizedTransitionCallback(onEntered);\n  var handleExiting = normalizedTransitionCallback(onExiting);\n  var handleExit = normalizedTransitionCallback(function (node) {\n    var transitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'exit'\n    });\n    node.style.webkitTransition = theme.transitions.create('opacity', transitionProps);\n    node.style.transition = theme.transitions.create('opacity', transitionProps);\n\n    if (onExit) {\n      onExit(node);\n    }\n  });\n  var handleExited = normalizedTransitionCallback(onExited);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: inProp,\n    nodeRef: enableStrictModeCompat ? nodeRef : undefined,\n    onEnter: handleEnter,\n    onEntered: handleEntered,\n    onEntering: handleEntering,\n    onExit: handleExit,\n    onExited: handleExited,\n    onExiting: handleExiting,\n    timeout: timeout\n  }, other), function (state, childProps) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"cloneElement\"](children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        opacity: 0,\n        visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n      }, styles[state], style, children.props.style),\n      ref: handleRef\n    }, childProps));\n  });\n});\n true ? Fade.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.element,\n\n  /**\n   * Enable this prop if you encounter 'Function components cannot be given refs',\n   * use `unstable_createStrictModeTheme`,\n   * and can't forward the ref in the child component.\n   */\n  disableStrictModeCompat: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the component will transition in.\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Fade);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Fade__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js ***!
-  \***********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';\n  var backgroundColor = light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      backgroundColor: backgroundColor,\n      borderTopLeftRadius: theme.shape.borderRadius,\n      borderTopRightRadius: theme.shape.borderRadius,\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shorter,\n        easing: theme.transitions.easing.easeOut\n      }),\n      '&:hover': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.13)' : 'rgba(255, 255, 255, 0.13)',\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: backgroundColor\n        }\n      },\n      '&$focused': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)'\n      },\n      '&$disabled': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.12)' : 'rgba(255, 255, 255, 0.12)'\n      }\n    },\n\n    /* Styles applied to the root element if color secondary. */\n    colorSecondary: {\n      '&$underline:after': {\n        borderBottomColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if `disableUnderline={false}`. */\n    underline: {\n      '&:after': {\n        borderBottom: \"2px solid \".concat(theme.palette.primary.main),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\"',\n        position: 'absolute',\n        right: 0,\n        transform: 'scaleX(0)',\n        transition: theme.transitions.create('transform', {\n          duration: theme.transitions.duration.shorter,\n          easing: theme.transitions.easing.easeOut\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&$focused:after': {\n        transform: 'scaleX(1)'\n      },\n      '&$error:after': {\n        borderBottomColor: theme.palette.error.main,\n        transform: 'scaleX(1)' // error is always underlined in red\n\n      },\n      '&:before': {\n        borderBottom: \"1px solid \".concat(bottomLineColor),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\\\\00a0\"',\n        position: 'absolute',\n        right: 0,\n        transition: theme.transitions.create('border-bottom-color', {\n          duration: theme.transitions.duration.shorter\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&:hover:before': {\n        borderBottom: \"1px solid \".concat(theme.palette.text.primary)\n      },\n      '&$disabled:before': {\n        borderBottomStyle: 'dotted'\n      }\n    },\n\n    /* Pseudo-class applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {\n      paddingLeft: 12\n    },\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {\n      paddingRight: 12\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: '27px 12px 10px',\n      '&$marginDense': {\n        paddingTop: 23,\n        paddingBottom: 6\n      }\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      padding: '27px 12px 10px',\n      '&:-webkit-autofill': {\n        WebkitBoxShadow: theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\n        WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\n        caretColor: theme.palette.type === 'light' ? null : '#fff',\n        borderTopLeftRadius: 'inherit',\n        borderTopRightRadius: 'inherit'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 23,\n      paddingBottom: 6\n    },\n\n    /* Styles applied to the `input` if in `<FormControl hiddenLabel />`. */\n    inputHiddenLabel: {\n      paddingTop: 18,\n      paddingBottom: 19,\n      '&$inputMarginDense': {\n        paddingTop: 10,\n        paddingBottom: 11\n      }\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {\n      paddingLeft: 0\n    },\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {\n      paddingRight: 0\n    }\n  };\n};\nvar FilledInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FilledInput(props, ref) {\n  var disableUnderline = props.disableUnderline,\n      classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"disableUnderline\", \"classes\", \"fullWidth\", \"inputComponent\", \"multiline\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, !disableUnderline && classes.underline),\n      underline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? FilledInput.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will not have an underline.\n   */\n  disableUnderline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nFilledInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFilledInput'\n})(FilledInput));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FilledInput__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js ***!
-  \***********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _InputBase_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../InputBase/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js\");\n/* harmony import */ var _FormControlContext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    display: 'inline-flex',\n    flexDirection: 'column',\n    position: 'relative',\n    // Reset fieldset default style.\n    minWidth: 0,\n    padding: 0,\n    margin: 0,\n    border: 0,\n    verticalAlign: 'top' // Fix alignment issue on Safari.\n\n  },\n\n  /* Styles applied to the root element if `margin=\"normal\"`. */\n  marginNormal: {\n    marginTop: 16,\n    marginBottom: 8\n  },\n\n  /* Styles applied to the root element if `margin=\"dense\"`. */\n  marginDense: {\n    marginTop: 8,\n    marginBottom: 4\n  },\n\n  /* Styles applied to the root element if `fullWidth={true}`. */\n  fullWidth: {\n    width: '100%'\n  }\n};\n/**\n * Provides context such as filled/focused/error/required for form inputs.\n * Relying on the context provides high flexibility and ensures that the state always stays\n * consistent across the children of the `FormControl`.\n * This context is used by the following components:\n *\n *  - FormLabel\n *  - FormHelperText\n *  - Input\n *  - InputLabel\n *\n * You can find one composition example below and more going to [the demos](/components/text-fields/#components).\n *\n * ```jsx\n * <FormControl>\n *   <InputLabel htmlFor=\"my-input\">Email address</InputLabel>\n *   <Input id=\"my-input\" aria-describedby=\"my-helper-text\" />\n *   <FormHelperText id=\"my-helper-text\">We'll never share your email.</FormHelperText>\n * </FormControl>\n * ```\n *\n * ⚠️Only one input can be used within a FormControl.\n */\n\nvar FormControl = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormControl(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$error = props.error,\n      error = _props$error === void 0 ? false : _props$error,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      visuallyFocused = props.focused,\n      _props$hiddenLabel = props.hiddenLabel,\n      hiddenLabel = _props$hiddenLabel === void 0 ? false : _props$hiddenLabel,\n      _props$margin = props.margin,\n      margin = _props$margin === void 0 ? 'none' : _props$margin,\n      _props$required = props.required,\n      required = _props$required === void 0 ? false : _props$required,\n      size = props.size,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"error\", \"fullWidth\", \"focused\", \"hiddenLabel\", \"margin\", \"required\", \"size\", \"variant\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](function () {\n    // We need to iterate through the children and find the Input in order\n    // to fully support server-side rendering.\n    var initialAdornedStart = false;\n\n    if (children) {\n      react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child) {\n        if (!Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Input', 'Select'])) {\n          return;\n        }\n\n        var input = Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Select']) ? child.props.input : child;\n\n        if (input && Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_5__[\"isAdornedStart\"])(input.props)) {\n          initialAdornedStart = true;\n        }\n      });\n    }\n\n    return initialAdornedStart;\n  }),\n      adornedStart = _React$useState[0],\n      setAdornedStart = _React$useState[1];\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](function () {\n    // We need to iterate through the children and find the Input in order\n    // to fully support server-side rendering.\n    var initialFilled = false;\n\n    if (children) {\n      react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child) {\n        if (!Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Input', 'Select'])) {\n          return;\n        }\n\n        if (Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_5__[\"isFilled\"])(child.props, true)) {\n          initialFilled = true;\n        }\n      });\n    }\n\n    return initialFilled;\n  }),\n      filled = _React$useState2[0],\n      setFilled = _React$useState2[1];\n\n  var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      _focused = _React$useState3[0],\n      setFocused = _React$useState3[1];\n\n  var focused = visuallyFocused !== undefined ? visuallyFocused : _focused;\n\n  if (disabled && focused) {\n    setFocused(false);\n  }\n\n  var registerEffect;\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    var registeredInput = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](false);\n\n    registerEffect = function registerEffect() {\n      if (registeredInput.current) {\n        console.error(['Material-UI: There are multiple InputBase components inside a FormControl.', 'This is not supported. It might cause infinite rendering loops.', 'Only use one InputBase.'].join('\\n'));\n      }\n\n      registeredInput.current = true;\n      return function () {\n        registeredInput.current = false;\n      };\n    };\n  }\n\n  var onFilled = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    setFilled(true);\n  }, []);\n  var onEmpty = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    setFilled(false);\n  }, []);\n  var childContext = {\n    adornedStart: adornedStart,\n    setAdornedStart: setAdornedStart,\n    color: color,\n    disabled: disabled,\n    error: error,\n    filled: filled,\n    focused: focused,\n    fullWidth: fullWidth,\n    hiddenLabel: hiddenLabel,\n    margin: (size === 'small' ? 'dense' : undefined) || margin,\n    onBlur: function onBlur() {\n      setFocused(false);\n    },\n    onEmpty: onEmpty,\n    onFilled: onFilled,\n    onFocus: function onFocus() {\n      setFocused(true);\n    },\n    registerEffect: registerEffect,\n    required: required,\n    variant: variant\n  };\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormControlContext__WEBPACK_IMPORTED_MODULE_9__[\"default\"].Provider, {\n    value: childContext\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, margin !== 'none' && classes[\"margin\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(margin))], fullWidth && classes.fullWidth),\n    ref: ref\n  }, other), children));\n});\n true ? FormControl.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The contents of the form control.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the label, input and helper text should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will be displayed in focused state.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be hidden.\n   * This is used to increase density for a `FilledInput`.\n   * Be sure to add `aria-label` to the `input` element.\n   */\n  hiddenLabel: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense` or `normal`, will adjust vertical spacing of this and contained components.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none', 'normal']),\n\n  /**\n   * If `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The size of the text field.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiFormControl'\n})(FormControl));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js ***!
-  \******************************************************************************************/
-/*! exports provided: useFormControl, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useFormControl\", function() { return useFormControl; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * @ignore - internal component.\n */\n\nvar FormControlContext = react__WEBPACK_IMPORTED_MODULE_0__[\"createContext\"]();\n\nif (true) {\n  FormControlContext.displayName = 'FormControlContext';\n}\n\nfunction useFormControl() {\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"](FormControlContext);\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (FormControlContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js ***!
-  \****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return formControlState; });\nfunction formControlState(_ref) {\n  var props = _ref.props,\n      states = _ref.states,\n      muiFormControl = _ref.muiFormControl;\n  return states.reduce(function (acc, state) {\n    acc[state] = props[state];\n\n    if (muiFormControl) {\n      if (typeof props[state] === 'undefined') {\n        acc[state] = muiFormControl[state];\n      }\n    }\n\n    return acc;\n  }, {});\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default, useFormControl */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormControl__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _useFormControl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useFormControl\", function() { return _useFormControl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js":
-/*!**************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js ***!
-  \**************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useFormControl; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _FormControlContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n\n\nfunction useFormControl() {\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"](_FormControlContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js ***!
-  \*********************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'inline-flex',\n      alignItems: 'center',\n      cursor: 'pointer',\n      // For correct alignment with the text.\n      verticalAlign: 'middle',\n      WebkitTapHighlightColor: 'transparent',\n      marginLeft: -11,\n      marginRight: 16,\n      // used for row presentation of radio/checkbox\n      '&$disabled': {\n        cursor: 'default'\n      }\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"start\"`. */\n    labelPlacementStart: {\n      flexDirection: 'row-reverse',\n      marginLeft: 16,\n      // used for row presentation of radio/checkbox\n      marginRight: -11\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"top\"`. */\n    labelPlacementTop: {\n      flexDirection: 'column-reverse',\n      marginLeft: 16\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"bottom\"`. */\n    labelPlacementBottom: {\n      flexDirection: 'column',\n      marginLeft: 16\n    },\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the label's Typography component. */\n    label: {\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      }\n    }\n  };\n};\n/**\n * Drop in replacement of the `Radio`, `Switch` and `Checkbox` component.\n * Use this component if you want to display an extra label.\n */\n\nvar FormControlLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormControlLabel(props, ref) {\n  var checked = props.checked,\n      classes = props.classes,\n      className = props.className,\n      control = props.control,\n      disabledProp = props.disabled,\n      inputRef = props.inputRef,\n      label = props.label,\n      _props$labelPlacement = props.labelPlacement,\n      labelPlacement = _props$labelPlacement === void 0 ? 'end' : _props$labelPlacement,\n      name = props.name,\n      onChange = props.onChange,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"checked\", \"classes\", \"className\", \"control\", \"disabled\", \"inputRef\", \"label\", \"labelPlacement\", \"name\", \"onChange\", \"value\"]);\n\n  var muiFormControl = Object(_FormControl__WEBPACK_IMPORTED_MODULE_6__[\"useFormControl\"])();\n  var disabled = disabledProp;\n\n  if (typeof disabled === 'undefined' && typeof control.props.disabled !== 'undefined') {\n    disabled = control.props.disabled;\n  }\n\n  if (typeof disabled === 'undefined' && muiFormControl) {\n    disabled = muiFormControl.disabled;\n  }\n\n  var controlProps = {\n    disabled: disabled\n  };\n  ['checked', 'name', 'onChange', 'value', 'inputRef'].forEach(function (key) {\n    if (typeof control.props[key] === 'undefined' && typeof props[key] !== 'undefined') {\n      controlProps[key] = props[key];\n    }\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"label\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, labelPlacement !== 'end' && classes[\"labelPlacement\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(labelPlacement))], disabled && classes.disabled),\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](control, controlProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n    component: \"span\",\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.label, disabled && classes.disabled)\n  }, label));\n});\n true ? FormControlLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the component appears selected.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * A control element. For instance, it can be be a `Radio`, a `Switch` or a `Checkbox`.\n   */\n  control: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element.isRequired,\n\n  /**\n   * If `true`, the control will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The text to be used in an enclosing label element.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The position of the label.\n   */\n  labelPlacement: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'end', 'start', 'top']),\n\n  /**\n   * @ignore\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The value of the component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFormControlLabel'\n})(FormControlLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormControlLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormControlLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormControlLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js":
-/*!*****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js ***!
-  \*****************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      color: theme.palette.text.secondary\n    }, theme.typography.caption, {\n      textAlign: 'left',\n      marginTop: 3,\n      margin: 0,\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      },\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }),\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `margin=\"dense\"`. */\n    marginDense: {\n      marginTop: 4\n    },\n\n    /* Styles applied to the root element if `variant=\"filled\"` or `variant=\"outlined\"`. */\n    contained: {\n      marginLeft: 14,\n      marginRight: 14\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `filled={true}`. */\n    filled: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {}\n  };\n};\nvar FormHelperText = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormHelperText(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'p' : _props$component,\n      disabled = props.disabled,\n      error = props.error,\n      filled = props.filled,\n      focused = props.focused,\n      margin = props.margin,\n      required = props.required,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"component\", \"disabled\", \"error\", \"filled\", \"focused\", \"margin\", \"required\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant', 'margin', 'disabled', 'error', 'filled', 'focused', 'required']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, (fcs.variant === 'filled' || fcs.variant === 'outlined') && classes.contained, className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required, fcs.margin === 'dense' && classes.marginDense),\n    ref: ref\n  }, other), children === ' ' ?\n  /*#__PURE__*/\n  // eslint-disable-next-line react/no-danger\n  react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  }) : children);\n});\n true ? FormHelperText.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   *\n   * If `' '` is provided, the component reserves one line height for displaying a future message.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the helper text should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, helper text should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the helper text should use filled classes key.\n   */\n  filled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the helper text should use focused classes key.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense']),\n\n  /**\n   * If `true`, the helper text should use required classes key.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFormHelperText'\n})(FormHelperText));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormHelperText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormHelperText */ \"./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormHelperText__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      color: theme.palette.text.secondary\n    }, theme.typography.body1, {\n      lineHeight: 1,\n      padding: 0,\n      '&$focused': {\n        color: theme.palette.primary.main\n      },\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      },\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }),\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {\n      '&$focused': {\n        color: theme.palette.secondary.main\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `filled={true}`. */\n    filled: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {},\n\n    /* Styles applied to the asterisk element. */\n    asterisk: {\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }\n  };\n};\nvar FormLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormLabel(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      color = props.color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'label' : _props$component,\n      disabled = props.disabled,\n      error = props.error,\n      filled = props.filled,\n      focused = props.focused,\n      required = props.required,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"error\", \"filled\", \"focused\", \"required\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['color', 'required', 'focused', 'disabled', 'error', 'filled']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(fcs.color || 'primary'))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required),\n    ref: ref\n  }, other), children, fcs.required && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    \"aria-hidden\": true,\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.asterisk, fcs.error && classes.error)\n  }, \"\\u2009\", '*'));\n});\n true ? FormLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the label should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should use filled classes key.\n   */\n  filled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input of this label is focused (used by `FormGroup` components).\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiFormLabel'\n})(FormLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_requirePropFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/requirePropFactory */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js\");\n\n\n// A grid component using the following libs as inspiration.\n//\n// For the implementation:\n// - https://getbootstrap.com/docs/4.3/layout/grid/\n// - https://github.com/kristoferjoseph/flexboxgrid/blob/master/src/css/flexboxgrid.css\n// - https://github.com/roylee0704/react-flexbox-grid\n// - https://material.angularjs.org/latest/layout/introduction\n//\n// Follow this flexbox Guide to better understand the underlying model:\n// - https://css-tricks.com/snippets/css/a-guide-to-flexbox/\n\n\n\n\n\nvar SPACINGS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar GRID_SIZES = ['auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n\nfunction generateGrid(globalStyles, theme, breakpoint) {\n  var styles = {};\n  GRID_SIZES.forEach(function (size) {\n    var key = \"grid-\".concat(breakpoint, \"-\").concat(size);\n\n    if (size === true) {\n      // For the auto layouting\n      styles[key] = {\n        flexBasis: 0,\n        flexGrow: 1,\n        maxWidth: '100%'\n      };\n      return;\n    }\n\n    if (size === 'auto') {\n      styles[key] = {\n        flexBasis: 'auto',\n        flexGrow: 0,\n        maxWidth: 'none'\n      };\n      return;\n    } // Keep 7 significant numbers.\n\n\n    var width = \"\".concat(Math.round(size / 12 * 10e7) / 10e5, \"%\"); // Close to the bootstrap implementation:\n    // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41\n\n    styles[key] = {\n      flexBasis: width,\n      flexGrow: 0,\n      maxWidth: width\n    };\n  }); // No need for a media query for the first size.\n\n  if (breakpoint === 'xs') {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(globalStyles, styles);\n  } else {\n    globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n  }\n}\n\nfunction getOffset(val) {\n  var div = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var parse = parseFloat(val);\n  return \"\".concat(parse / div).concat(String(val).replace(String(parse), '') || 'px');\n}\n\nfunction generateGutter(theme, breakpoint) {\n  var styles = {};\n  SPACINGS.forEach(function (spacing) {\n    var themeSpacing = theme.spacing(spacing);\n\n    if (themeSpacing === 0) {\n      return;\n    }\n\n    styles[\"spacing-\".concat(breakpoint, \"-\").concat(spacing)] = {\n      margin: \"-\".concat(getOffset(themeSpacing, 2)),\n      width: \"calc(100% + \".concat(getOffset(themeSpacing), \")\"),\n      '& > $item': {\n        padding: getOffset(themeSpacing, 2)\n      }\n    };\n  });\n  return styles;\n} // Default CSS values\n// flex: '0 1 auto',\n// flexDirection: 'row',\n// alignItems: 'flex-start',\n// flexWrap: 'nowrap',\n// justifyContent: 'flex-start',\n\n\nvar styles = function styles(theme) {\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    /* Styles applied to the root element. */\n    root: {},\n\n    /* Styles applied to the root element if `container={true}`. */\n    container: {\n      boxSizing: 'border-box',\n      display: 'flex',\n      flexWrap: 'wrap',\n      width: '100%'\n    },\n\n    /* Styles applied to the root element if `item={true}`. */\n    item: {\n      boxSizing: 'border-box',\n      margin: '0' // For instance, it's useful when used with a `figure` element.\n\n    },\n\n    /* Styles applied to the root element if `zeroMinWidth={true}`. */\n    zeroMinWidth: {\n      minWidth: 0\n    },\n\n    /* Styles applied to the root element if `direction=\"column\"`. */\n    'direction-xs-column': {\n      flexDirection: 'column'\n    },\n\n    /* Styles applied to the root element if `direction=\"column-reverse\"`. */\n    'direction-xs-column-reverse': {\n      flexDirection: 'column-reverse'\n    },\n\n    /* Styles applied to the root element if `direction=\"row-reverse\"`. */\n    'direction-xs-row-reverse': {\n      flexDirection: 'row-reverse'\n    },\n\n    /* Styles applied to the root element if `wrap=\"nowrap\"`. */\n    'wrap-xs-nowrap': {\n      flexWrap: 'nowrap'\n    },\n\n    /* Styles applied to the root element if `wrap=\"reverse\"`. */\n    'wrap-xs-wrap-reverse': {\n      flexWrap: 'wrap-reverse'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"center\"`. */\n    'align-items-xs-center': {\n      alignItems: 'center'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"flex-start\"`. */\n    'align-items-xs-flex-start': {\n      alignItems: 'flex-start'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"flex-end\"`. */\n    'align-items-xs-flex-end': {\n      alignItems: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"baseline\"`. */\n    'align-items-xs-baseline': {\n      alignItems: 'baseline'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"center\"`. */\n    'align-content-xs-center': {\n      alignContent: 'center'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"flex-start\"`. */\n    'align-content-xs-flex-start': {\n      alignContent: 'flex-start'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"flex-end\"`. */\n    'align-content-xs-flex-end': {\n      alignContent: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"space-between\"`. */\n    'align-content-xs-space-between': {\n      alignContent: 'space-between'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"space-around\"`. */\n    'align-content-xs-space-around': {\n      alignContent: 'space-around'\n    },\n\n    /* Styles applied to the root element if `justify=\"center\"`. */\n    'justify-xs-center': {\n      justifyContent: 'center'\n    },\n\n    /* Styles applied to the root element if `justify=\"flex-end\"`. */\n    'justify-xs-flex-end': {\n      justifyContent: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-between\"`. */\n    'justify-xs-space-between': {\n      justifyContent: 'space-between'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-around\"`. */\n    'justify-xs-space-around': {\n      justifyContent: 'space-around'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-evenly\"`. */\n    'justify-xs-space-evenly': {\n      justifyContent: 'space-evenly'\n    }\n  }, generateGutter(theme, 'xs'), theme.breakpoints.keys.reduce(function (accumulator, key) {\n    // Use side effect over immutability for better performance.\n    generateGrid(accumulator, theme, key);\n    return accumulator;\n  }, {}));\n};\nvar Grid = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Grid(props, ref) {\n  var _props$alignContent = props.alignContent,\n      alignContent = _props$alignContent === void 0 ? 'stretch' : _props$alignContent,\n      _props$alignItems = props.alignItems,\n      alignItems = _props$alignItems === void 0 ? 'stretch' : _props$alignItems,\n      classes = props.classes,\n      classNameProp = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$container = props.container,\n      container = _props$container === void 0 ? false : _props$container,\n      _props$direction = props.direction,\n      direction = _props$direction === void 0 ? 'row' : _props$direction,\n      _props$item = props.item,\n      item = _props$item === void 0 ? false : _props$item,\n      _props$justify = props.justify,\n      justify = _props$justify === void 0 ? 'flex-start' : _props$justify,\n      _props$lg = props.lg,\n      lg = _props$lg === void 0 ? false : _props$lg,\n      _props$md = props.md,\n      md = _props$md === void 0 ? false : _props$md,\n      _props$sm = props.sm,\n      sm = _props$sm === void 0 ? false : _props$sm,\n      _props$spacing = props.spacing,\n      spacing = _props$spacing === void 0 ? 0 : _props$spacing,\n      _props$wrap = props.wrap,\n      wrap = _props$wrap === void 0 ? 'wrap' : _props$wrap,\n      _props$xl = props.xl,\n      xl = _props$xl === void 0 ? false : _props$xl,\n      _props$xs = props.xs,\n      xs = _props$xs === void 0 ? false : _props$xs,\n      _props$zeroMinWidth = props.zeroMinWidth,\n      zeroMinWidth = _props$zeroMinWidth === void 0 ? false : _props$zeroMinWidth,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"item\", \"justify\", \"lg\", \"md\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\", \"zeroMinWidth\"]);\n\n  var className = Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classNameProp, container && [classes.container, spacing !== 0 && classes[\"spacing-xs-\".concat(String(spacing))]], item && classes.item, zeroMinWidth && classes.zeroMinWidth, direction !== 'row' && classes[\"direction-xs-\".concat(String(direction))], wrap !== 'wrap' && classes[\"wrap-xs-\".concat(String(wrap))], alignItems !== 'stretch' && classes[\"align-items-xs-\".concat(String(alignItems))], alignContent !== 'stretch' && classes[\"align-content-xs-\".concat(String(alignContent))], justify !== 'flex-start' && classes[\"justify-xs-\".concat(String(justify))], xs !== false && classes[\"grid-xs-\".concat(String(xs))], sm !== false && classes[\"grid-sm-\".concat(String(sm))], md !== false && classes[\"grid-md-\".concat(String(md))], lg !== false && classes[\"grid-lg-\".concat(String(lg))], xl !== false && classes[\"grid-xl-\".concat(String(xl))]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: className,\n    ref: ref\n  }, other));\n});\n true ? Grid.propTypes = {\n  /**\n   * Defines the `align-content` style property.\n   * It's applied for all screen sizes.\n   */\n  alignContent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['stretch', 'center', 'flex-start', 'flex-end', 'space-between', 'space-around']),\n\n  /**\n   * Defines the `align-items` style property.\n   * It's applied for all screen sizes.\n   */\n  alignItems: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center', 'flex-end', 'stretch', 'baseline']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the component will have the flex *container* behavior.\n   * You should be wrapping *items* with a *container*.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Defines the `flex-direction` style property.\n   * It is applied for all screen sizes.\n   */\n  direction: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n\n  /**\n   * If `true`, the component will have the flex *item* behavior.\n   * You should be wrapping *items* with a *container*.\n   */\n  item: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Defines the `justify-content` style property.\n   * It is applied for all screen sizes.\n   */\n  justify: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around', 'space-evenly']),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `lg` breakpoint and wider screens if not overridden.\n   */\n  lg: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `md` breakpoint and wider screens if not overridden.\n   */\n  md: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `sm` breakpoint and wider screens if not overridden.\n   */\n  sm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the space between the type `item` component.\n   * It can only be used on a type `container` component.\n   */\n  spacing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(SPACINGS),\n\n  /**\n   * Defines the `flex-wrap` style property.\n   * It's applied for all screen sizes.\n   */\n  wrap: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['nowrap', 'wrap', 'wrap-reverse']),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `xl` breakpoint and wider screens.\n   */\n  xl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for all the screen sizes with the lowest priority.\n   */\n  xs: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * If `true`, it sets `min-width: 0` on the item.\n   * Refer to the limitations section of the documentation to better understand the use case.\n   */\n  zeroMinWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\nvar StyledGrid = Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiGrid'\n})(Grid);\n\nif (true) {\n  var requireProp = Object(_utils_requirePropFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"])('Grid');\n  StyledGrid.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, StyledGrid.propTypes, {\n    alignContent: requireProp('container'),\n    alignItems: requireProp('container'),\n    direction: requireProp('container'),\n    justify: requireProp('container'),\n    lg: requireProp('item'),\n    md: requireProp('item'),\n    sm: requireProp('item'),\n    spacing: requireProp('container'),\n    wrap: requireProp('container'),\n    xs: requireProp('item'),\n    zeroMinWidth: requireProp('item')\n  });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (StyledGrid);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Grid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grid */ \"./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Grid__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _transitions_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../transitions/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\nfunction getScale(value) {\n  return \"scale(\".concat(value, \", \").concat(Math.pow(value, 2), \")\");\n}\n\nvar styles = {\n  entering: {\n    opacity: 1,\n    transform: getScale(1)\n  },\n  entered: {\n    opacity: 1,\n    transform: 'none'\n  }\n};\n/**\n * The Grow transition is used by the [Tooltip](/components/tooltips/) and\n * [Popover](/components/popover/) components.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nvar Grow = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Grow(props, ref) {\n  var children = props.children,\n      _props$disableStrictM = props.disableStrictModeCompat,\n      disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,\n      inProp = props.in,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      style = props.style,\n      _props$timeout = props.timeout,\n      timeout = _props$timeout === void 0 ? 'auto' : _props$timeout,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"Transition\"] : _props$TransitionComp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"disableStrictModeCompat\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"timeout\", \"TransitionComponent\"]);\n\n  var timer = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var autoTimeout = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;\n  var nodeRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var foreignRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(children.ref, ref);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(enableStrictModeCompat ? nodeRef : undefined, foreignRef);\n\n  var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {\n    return function (nodeOrAppearing, maybeAppearing) {\n      if (callback) {\n        var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],\n            _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, 2),\n            node = _ref2[0],\n            isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n\n        if (isAppearing === undefined) {\n          callback(node);\n        } else {\n          callback(node, isAppearing);\n        }\n      }\n    };\n  };\n\n  var handleEntering = normalizedTransitionCallback(onEntering);\n  var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {\n    Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"reflow\"])(node); // So the animation always start from the start.\n\n    var _getTransitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'enter'\n    }),\n        transitionDuration = _getTransitionProps.duration,\n        delay = _getTransitionProps.delay;\n\n    var duration;\n\n    if (timeout === 'auto') {\n      duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n      autoTimeout.current = duration;\n    } else {\n      duration = transitionDuration;\n    }\n\n    node.style.transition = [theme.transitions.create('opacity', {\n      duration: duration,\n      delay: delay\n    }), theme.transitions.create('transform', {\n      duration: duration * 0.666,\n      delay: delay\n    })].join(',');\n\n    if (onEnter) {\n      onEnter(node, isAppearing);\n    }\n  });\n  var handleEntered = normalizedTransitionCallback(onEntered);\n  var handleExiting = normalizedTransitionCallback(onExiting);\n  var handleExit = normalizedTransitionCallback(function (node) {\n    var _getTransitionProps2 = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'exit'\n    }),\n        transitionDuration = _getTransitionProps2.duration,\n        delay = _getTransitionProps2.delay;\n\n    var duration;\n\n    if (timeout === 'auto') {\n      duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n      autoTimeout.current = duration;\n    } else {\n      duration = transitionDuration;\n    }\n\n    node.style.transition = [theme.transitions.create('opacity', {\n      duration: duration,\n      delay: delay\n    }), theme.transitions.create('transform', {\n      duration: duration * 0.666,\n      delay: delay || duration * 0.333\n    })].join(',');\n    node.style.opacity = '0';\n    node.style.transform = getScale(0.75);\n\n    if (onExit) {\n      onExit(node);\n    }\n  });\n  var handleExited = normalizedTransitionCallback(onExited);\n\n  var addEndListener = function addEndListener(nodeOrNext, maybeNext) {\n    var next = enableStrictModeCompat ? nodeOrNext : maybeNext;\n\n    if (timeout === 'auto') {\n      timer.current = setTimeout(next, autoTimeout.current || 0);\n    }\n  };\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    return function () {\n      clearTimeout(timer.current);\n    };\n  }, []);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: inProp,\n    nodeRef: enableStrictModeCompat ? nodeRef : undefined,\n    onEnter: handleEnter,\n    onEntered: handleEntered,\n    onEntering: handleEntering,\n    onExit: handleExit,\n    onExited: handleExited,\n    onExiting: handleExiting,\n    addEndListener: addEndListener,\n    timeout: timeout === 'auto' ? null : timeout\n  }, other), function (state, childProps) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"cloneElement\"](children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        opacity: 0,\n        transform: getScale(0.75),\n        visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n      }, styles[state], style, children.props.style),\n      ref: handleRef\n    }, childProps));\n  });\n});\n true ? Grow.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.element,\n\n  /**\n   * Enable this prop if you encounter 'Function components cannot be given refs',\n   * use `unstable_createStrictModeTheme`,\n   * and can't forward the ref in the child component.\n   */\n  disableStrictModeCompat: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, show the component; triggers the enter or exit animation.\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   *\n   * Set to 'auto' to automatically calculate transition time based on height.\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })])\n} : undefined;\nGrow.muiSupportAuto = true;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Grow);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Grow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grow */ \"./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Grow__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      textAlign: 'center',\n      flex: '0 0 auto',\n      fontSize: theme.typography.pxToRem(24),\n      padding: 12,\n      borderRadius: '50%',\n      overflow: 'visible',\n      // Explicitly set the default value to solve a bug on IE 11.\n      color: theme.palette.action.active,\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shortest\n      }),\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.action.active, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        backgroundColor: 'transparent',\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if `edge=\"start\"`. */\n    edgeStart: {\n      marginLeft: -12,\n      '$sizeSmall&': {\n        marginLeft: -3\n      }\n    },\n\n    /* Styles applied to the root element if `edge=\"end\"`. */\n    edgeEnd: {\n      marginRight: -12,\n      '$sizeSmall&': {\n        marginRight: -3\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `size=\"small\"`. */\n    sizeSmall: {\n      padding: 3,\n      fontSize: theme.typography.pxToRem(18)\n    },\n\n    /* Styles applied to the children container element. */\n    label: {\n      width: '100%',\n      display: 'flex',\n      alignItems: 'inherit',\n      justifyContent: 'inherit'\n    }\n  };\n};\n/**\n * Refer to the [Icons](/components/icons/) section of the documentation\n * regarding the available icon options.\n */\n\nvar IconButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function IconButton(props, ref) {\n  var _props$edge = props.edge,\n      edge = _props$edge === void 0 ? false : _props$edge,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'default' : _props$color,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableFocusRi = props.disableFocusRipple,\n      disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"edge\", \"children\", \"classes\", \"className\", \"color\", \"disabled\", \"disableFocusRipple\", \"size\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ButtonBase__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'default' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(color))], disabled && classes.disabled, size === \"small\" && classes[\"size\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(size))], {\n      'start': classes.edgeStart,\n      'end': classes.edgeEnd\n    }[edge]),\n    centerRipple: true,\n    focusRipple: !disableFocusRipple,\n    disabled: disabled,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: classes.label\n  }, children));\n});\n true ? IconButton.propTypes = {\n  /**\n   * The icon element.\n   */\n  children: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, function (props) {\n    var found = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(props.children).some(function (child) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child) && child.props.onClick;\n    });\n\n    if (found) {\n      return new Error(['Material-UI: You are providing an onClick event listener ' + 'to a child of a button element.', 'Firefox will never trigger the event.', 'You should move the onClick listener to the parent button element.', 'https://github.com/mui-org/material-ui/issues/13957'].join('\\n'));\n    }\n\n    return null;\n  }),\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the  keyboard focus ripple will be disabled.\n   */\n  disableFocusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If given, uses a negative margin to counteract the padding on one\n   * side (this is often helpful for aligning the left or right\n   * side of the icon with content above or below, without ruining the border\n   * size and shape).\n   */\n  edge: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['start', 'end', false]),\n\n  /**\n   * The size of the button.\n   * `small` is equivalent to the dense button styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['small', 'medium'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiIconButton'\n})(IconButton));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IconButton */ \"./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _IconButton__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js ***!
-  \***********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative'\n    },\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {\n      'label + &': {\n        marginTop: 16\n      }\n    },\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if color secondary. */\n    colorSecondary: {\n      '&$underline:after': {\n        borderBottomColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if `disableUnderline={false}`. */\n    underline: {\n      '&:after': {\n        borderBottom: \"2px solid \".concat(theme.palette.primary.main),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\"',\n        position: 'absolute',\n        right: 0,\n        transform: 'scaleX(0)',\n        transition: theme.transitions.create('transform', {\n          duration: theme.transitions.duration.shorter,\n          easing: theme.transitions.easing.easeOut\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&$focused:after': {\n        transform: 'scaleX(1)'\n      },\n      '&$error:after': {\n        borderBottomColor: theme.palette.error.main,\n        transform: 'scaleX(1)' // error is always underlined in red\n\n      },\n      '&:before': {\n        borderBottom: \"1px solid \".concat(bottomLineColor),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\\\\00a0\"',\n        position: 'absolute',\n        right: 0,\n        transition: theme.transitions.create('border-bottom-color', {\n          duration: theme.transitions.duration.shorter\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&:hover:not($disabled):before': {\n        borderBottom: \"2px solid \".concat(theme.palette.text.primary),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          borderBottom: \"1px solid \".concat(bottomLineColor)\n        }\n      },\n      '&$disabled:before': {\n        borderBottomStyle: 'dotted'\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {},\n\n    /* Styles applied to the `input` element. */\n    input: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {},\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {},\n\n    /* Styles applied to the `input` element if `type=\"search\"`. */\n    inputTypeSearch: {}\n  };\n};\nvar Input = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Input(props, ref) {\n  var disableUnderline = props.disableUnderline,\n      classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"disableUnderline\", \"classes\", \"fullWidth\", \"inputComponent\", \"multiline\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, !disableUnderline && classes.underline),\n      underline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? Input.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will not have an underline.\n   */\n  disableUnderline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiInput'\n})(Input));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Input/index.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Input/index.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Input__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Input/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _TextareaAutosize__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../TextareaAutosize */ \"./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n\n\n\n\n/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var placeholder = {\n    color: 'currentColor',\n    opacity: light ? 0.42 : 0.5,\n    transition: theme.transitions.create('opacity', {\n      duration: theme.transitions.duration.shorter\n    })\n  };\n  var placeholderHidden = {\n    opacity: '0 !important'\n  };\n  var placeholderVisible = {\n    opacity: light ? 0.42 : 0.5\n  };\n  return {\n    '@global': {\n      '@keyframes mui-auto-fill': {},\n      '@keyframes mui-auto-fill-cancel': {}\n    },\n\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.body1, {\n      color: theme.palette.text.primary,\n      lineHeight: '1.1876em',\n      // Reset (19px), match the native input line-height\n      boxSizing: 'border-box',\n      // Prevent padding issue with fullWidth.\n      position: 'relative',\n      cursor: 'text',\n      display: 'inline-flex',\n      alignItems: 'center',\n      '&$disabled': {\n        color: theme.palette.text.disabled,\n        cursor: 'default'\n      }\n    }),\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {},\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {},\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: \"\".concat(8 - 2, \"px 0 \").concat(8 - 1, \"px\"),\n      '&$marginDense': {\n        paddingTop: 4 - 1\n      }\n    },\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {\n      width: '100%'\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      font: 'inherit',\n      letterSpacing: 'inherit',\n      color: 'currentColor',\n      padding: \"\".concat(8 - 2, \"px 0 \").concat(8 - 1, \"px\"),\n      border: 0,\n      boxSizing: 'content-box',\n      background: 'none',\n      height: '1.1876em',\n      // Reset (19px), match the native input line-height\n      margin: 0,\n      // Reset for Safari\n      WebkitTapHighlightColor: 'transparent',\n      display: 'block',\n      // Make the flex item shrink with Firefox\n      minWidth: 0,\n      width: '100%',\n      // Fix IE 11 width issue\n      animationName: 'mui-auto-fill-cancel',\n      animationDuration: '10ms',\n      '&::-webkit-input-placeholder': placeholder,\n      '&::-moz-placeholder': placeholder,\n      // Firefox 19+\n      '&:-ms-input-placeholder': placeholder,\n      // IE 11\n      '&::-ms-input-placeholder': placeholder,\n      // Edge\n      '&:focus': {\n        outline: 0\n      },\n      // Reset Firefox invalid required input style\n      '&:invalid': {\n        boxShadow: 'none'\n      },\n      '&::-webkit-search-decoration': {\n        // Remove the padding when type=search.\n        '-webkit-appearance': 'none'\n      },\n      // Show and hide the placeholder logic\n      'label[data-shrink=false] + $formControl &': {\n        '&::-webkit-input-placeholder': placeholderHidden,\n        '&::-moz-placeholder': placeholderHidden,\n        // Firefox 19+\n        '&:-ms-input-placeholder': placeholderHidden,\n        // IE 11\n        '&::-ms-input-placeholder': placeholderHidden,\n        // Edge\n        '&:focus::-webkit-input-placeholder': placeholderVisible,\n        '&:focus::-moz-placeholder': placeholderVisible,\n        // Firefox 19+\n        '&:focus:-ms-input-placeholder': placeholderVisible,\n        // IE 11\n        '&:focus::-ms-input-placeholder': placeholderVisible // Edge\n\n      },\n      '&$disabled': {\n        opacity: 1 // Reset iOS opacity\n\n      },\n      '&:-webkit-autofill': {\n        animationDuration: '5000s',\n        animationName: 'mui-auto-fill'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 4 - 1\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      height: 'auto',\n      resize: 'none',\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `type=\"search\"`. */\n    inputTypeSearch: {\n      // Improve type search style.\n      '-moz-appearance': 'textfield',\n      '-webkit-appearance': 'textfield'\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {},\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {},\n\n    /* Styles applied to the `input` element if `hiddenLabel={true}`. */\n    inputHiddenLabel: {}\n  };\n};\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_3__[\"useLayoutEffect\"];\n/**\n * `InputBase` contains as few styles as possible.\n * It aims to be a simple building block for creating an input.\n * It contains a load of style reset and some state logic.\n */\n\nvar InputBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function InputBase(props, ref) {\n  var ariaDescribedby = props['aria-describedby'],\n      autoComplete = props.autoComplete,\n      autoFocus = props.autoFocus,\n      classes = props.classes,\n      className = props.className,\n      color = props.color,\n      defaultValue = props.defaultValue,\n      disabled = props.disabled,\n      endAdornment = props.endAdornment,\n      error = props.error,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      id = props.id,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$inputProps = props.inputProps,\n      inputPropsProp = _props$inputProps === void 0 ? {} : _props$inputProps,\n      inputRefProp = props.inputRef,\n      margin = props.margin,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onClick = props.onClick,\n      onFocus = props.onFocus,\n      onKeyDown = props.onKeyDown,\n      onKeyUp = props.onKeyUp,\n      placeholder = props.placeholder,\n      readOnly = props.readOnly,\n      renderSuffix = props.renderSuffix,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      rowsMin = props.rowsMin,\n      startAdornment = props.startAdornment,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      valueProp = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"aria-describedby\", \"autoComplete\", \"autoFocus\", \"classes\", \"className\", \"color\", \"defaultValue\", \"disabled\", \"endAdornment\", \"error\", \"fullWidth\", \"id\", \"inputComponent\", \"inputProps\", \"inputRef\", \"margin\", \"multiline\", \"name\", \"onBlur\", \"onChange\", \"onClick\", \"onFocus\", \"onKeyDown\", \"onKeyUp\", \"placeholder\", \"readOnly\", \"renderSuffix\", \"rows\", \"rowsMax\", \"rowsMin\", \"startAdornment\", \"type\", \"value\"]);\n\n  var value = inputPropsProp.value != null ? inputPropsProp.value : valueProp;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](value != null),\n      isControlled = _React$useRef.current;\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var handleInputRefWarning = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (instance) {\n    if (true) {\n      if (instance && instance.nodeName !== 'INPUT' && !instance.focus) {\n        console.error(['Material-UI: You have provided a `inputComponent` to the input component', 'that does not correctly handle the `inputRef` prop.', 'Make sure the `inputRef` prop is called with a HTMLInputElement.'].join('\\n'));\n      }\n    }\n  }, []);\n  var handleInputPropsRefProp = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputPropsProp.ref, handleInputRefWarning);\n  var handleInputRefProp = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputRefProp, handleInputPropsRefProp);\n  var handleInputRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputRef, handleInputRefProp);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__[\"useState\"](false),\n      focused = _React$useState[0],\n      setFocused = _React$useState[1];\n\n  var muiFormControl = Object(_FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__[\"useFormControl\"])();\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n      if (muiFormControl) {\n        return muiFormControl.registerEffect();\n      }\n\n      return undefined;\n    }, [muiFormControl]);\n  }\n\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['color', 'disabled', 'error', 'hiddenLabel', 'margin', 'required', 'filled']\n  });\n  fcs.focused = muiFormControl ? muiFormControl.focused : focused; // The blur won't fire when the disabled state is set on a focused input.\n  // We need to book keep the focused state manually.\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (!muiFormControl && disabled && focused) {\n      setFocused(false);\n\n      if (onBlur) {\n        onBlur();\n      }\n    }\n  }, [muiFormControl, disabled, focused, onBlur]);\n  var onFilled = muiFormControl && muiFormControl.onFilled;\n  var onEmpty = muiFormControl && muiFormControl.onEmpty;\n  var checkDirty = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (obj) {\n    if (Object(_utils__WEBPACK_IMPORTED_MODULE_12__[\"isFilled\"])(obj)) {\n      if (onFilled) {\n        onFilled();\n      }\n    } else if (onEmpty) {\n      onEmpty();\n    }\n  }, [onFilled, onEmpty]);\n  useEnhancedEffect(function () {\n    if (isControlled) {\n      checkDirty({\n        value: value\n      });\n    }\n  }, [value, checkDirty, isControlled]);\n\n  var handleFocus = function handleFocus(event) {\n    // Fix a bug with IE 11 where the focus/blur events are triggered\n    // while the input is disabled.\n    if (fcs.disabled) {\n      event.stopPropagation();\n      return;\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n\n    if (inputPropsProp.onFocus) {\n      inputPropsProp.onFocus(event);\n    }\n\n    if (muiFormControl && muiFormControl.onFocus) {\n      muiFormControl.onFocus(event);\n    } else {\n      setFocused(true);\n    }\n  };\n\n  var handleBlur = function handleBlur(event) {\n    if (onBlur) {\n      onBlur(event);\n    }\n\n    if (inputPropsProp.onBlur) {\n      inputPropsProp.onBlur(event);\n    }\n\n    if (muiFormControl && muiFormControl.onBlur) {\n      muiFormControl.onBlur(event);\n    } else {\n      setFocused(false);\n    }\n  };\n\n  var handleChange = function handleChange(event) {\n    if (!isControlled) {\n      var element = event.target || inputRef.current;\n\n      if (element == null) {\n        throw new Error( true ? \"Material-UI: Expected valid input target. Did you use a custom `inputComponent` and forget to forward refs? See https://material-ui.com/r/input-component-ref-interface for more info.\" : undefined);\n      }\n\n      checkDirty({\n        value: element.value\n      });\n    }\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    if (inputPropsProp.onChange) {\n      inputPropsProp.onChange.apply(inputPropsProp, [event].concat(args));\n    } // Perform in the willUpdate\n\n\n    if (onChange) {\n      onChange.apply(void 0, [event].concat(args));\n    }\n  }; // Check the input state on mount, in case it was filled by the user\n  // or auto filled by the browser before the hydration (for SSR).\n\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    checkDirty(inputRef.current);\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  var handleClick = function handleClick(event) {\n    if (inputRef.current && event.currentTarget === event.target) {\n      inputRef.current.focus();\n    }\n\n    if (onClick) {\n      onClick(event);\n    }\n  };\n\n  var InputComponent = inputComponent;\n\n  var inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inputPropsProp, {\n    ref: handleInputRef\n  });\n\n  if (typeof InputComponent !== 'string') {\n    inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      // Rename ref to inputRef as we don't know the\n      // provided `inputComponent` structure.\n      inputRef: handleInputRef,\n      type: type\n    }, inputProps, {\n      ref: null\n    });\n  } else if (multiline) {\n    if (rows && !rowsMax && !rowsMin) {\n      InputComponent = 'textarea';\n    } else {\n      inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        rows: rows,\n        rowsMax: rowsMax\n      }, inputProps);\n      InputComponent = _TextareaAutosize__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\n    }\n  } else {\n    inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      type: type\n    }, inputProps);\n  }\n\n  var handleAutoFill = function handleAutoFill(event) {\n    // Provide a fake value as Chrome might not let you access it for security reasons.\n    checkDirty(event.animationName === 'mui-auto-fill-cancel' ? inputRef.current : {\n      value: 'x'\n    });\n  };\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (muiFormControl) {\n      muiFormControl.setAdornedStart(Boolean(startAdornment));\n    }\n  }, [muiFormControl, startAdornment]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(fcs.color || 'primary'))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fullWidth && classes.fullWidth, fcs.focused && classes.focused, muiFormControl && classes.formControl, multiline && classes.multiline, startAdornment && classes.adornedStart, endAdornment && classes.adornedEnd, fcs.margin === 'dense' && classes.marginDense),\n    onClick: handleClick,\n    ref: ref\n  }, other), startAdornment, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n    value: null\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    \"aria-invalid\": fcs.error,\n    \"aria-describedby\": ariaDescribedby,\n    autoComplete: autoComplete,\n    autoFocus: autoFocus,\n    defaultValue: defaultValue,\n    disabled: fcs.disabled,\n    id: id,\n    onAnimationStart: handleAutoFill,\n    name: name,\n    placeholder: placeholder,\n    readOnly: readOnly,\n    required: fcs.required,\n    rows: rows,\n    value: value,\n    onKeyDown: onKeyDown,\n    onKeyUp: onKeyUp\n  }, inputProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.input, inputPropsProp.className, fcs.disabled && classes.disabled, multiline && classes.inputMultiline, fcs.hiddenLabel && classes.inputHiddenLabel, startAdornment && classes.inputAdornedStart, endAdornment && classes.inputAdornedEnd, type === 'search' && classes.inputTypeSearch, fcs.margin === 'dense' && classes.inputMarginDense),\n    onBlur: handleBlur,\n    onChange: handleChange,\n    onFocus: handleFocus\n  }))), endAdornment, renderSuffix ? renderSuffix(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, fcs, {\n    startAdornment: startAdornment\n  })) : null);\n});\n true ? InputBase.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  'aria-describedby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * Callback fired when the input is blurred.\n   *\n   * Notice that the first argument (event) might be undefined.\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  renderSuffix: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Minimum number of rows to display when multiline option is set to true.\n   */\n  rowsMin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiInputBase'\n})(InputBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _InputBase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js ***!
-  \***************************************************************************/
-/*! exports provided: hasValue, isFilled, isAdornedStart */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasValue\", function() { return hasValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFilled\", function() { return isFilled; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isAdornedStart\", function() { return isAdornedStart; });\n// Supports determination of isControlled().\n// Controlled input accepts its current value as a prop.\n//\n// @see https://facebook.github.io/react/docs/forms.html#controlled-components\n// @param value\n// @returns {boolean} true if string (including '') or number (including zero)\nfunction hasValue(value) {\n  return value != null && !(Array.isArray(value) && value.length === 0);\n} // Determine if field is empty or filled.\n// Response determines if label is presented above field or as placeholder.\n//\n// @param obj\n// @param SSR\n// @returns {boolean} False when not present or empty string.\n//                    True when any number or string with length.\n\nfunction isFilled(obj) {\n  var SSR = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  return obj && (hasValue(obj.value) && obj.value !== '' || SSR && hasValue(obj.defaultValue) && obj.defaultValue !== '');\n} // Determine if an Input is adorned on start.\n// It's corresponding to the left with LTR.\n//\n// @param obj\n// @returns {boolean} False when no adornments.\n//                    True when adorned at the start.\n\nfunction isAdornedStart(obj) {\n  return obj.startAdornment;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _FormLabel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'block',\n      transformOrigin: 'top left'\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {},\n\n    /* Pseudo-class applied to the asterisk element. */\n    asterisk: {},\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      // slight alteration to spec spacing to match visual spec result\n      transform: 'translate(0, 24px) scale(1)'\n    },\n\n    /* Styles applied to the root element if `margin=\"dense\"`. */\n    marginDense: {\n      // Compensation for the `Input.inputDense` style.\n      transform: 'translate(0, 21px) scale(1)'\n    },\n\n    /* Styles applied to the `input` element if `shrink={true}`. */\n    shrink: {\n      transform: 'translate(0, 1.5px) scale(0.75)',\n      transformOrigin: 'top left'\n    },\n\n    /* Styles applied to the `input` element if `disableAnimation={false}`. */\n    animated: {\n      transition: theme.transitions.create(['color', 'transform'], {\n        duration: theme.transitions.duration.shorter,\n        easing: theme.transitions.easing.easeOut\n      })\n    },\n\n    /* Styles applied to the root element if `variant=\"filled\"`. */\n    filled: {\n      // Chrome's autofill feature gives the input field a yellow background.\n      // Since the input field is behind the label in the HTML tree,\n      // the input field is drawn last and hides the label with an opaque background color.\n      // zIndex: 1 will raise the label above opaque background-colors of input.\n      zIndex: 1,\n      pointerEvents: 'none',\n      transform: 'translate(12px, 20px) scale(1)',\n      '&$marginDense': {\n        transform: 'translate(12px, 17px) scale(1)'\n      },\n      '&$shrink': {\n        transform: 'translate(12px, 10px) scale(0.75)',\n        '&$marginDense': {\n          transform: 'translate(12px, 7px) scale(0.75)'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      // see comment above on filled.zIndex\n      zIndex: 1,\n      pointerEvents: 'none',\n      transform: 'translate(14px, 20px) scale(1)',\n      '&$marginDense': {\n        transform: 'translate(14px, 12px) scale(1)'\n      },\n      '&$shrink': {\n        transform: 'translate(14px, -6px) scale(0.75)'\n      }\n    }\n  };\n};\nvar InputLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function InputLabel(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$disableAnimati = props.disableAnimation,\n      disableAnimation = _props$disableAnimati === void 0 ? false : _props$disableAnimati,\n      margin = props.margin,\n      shrinkProp = props.shrink,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"disableAnimation\", \"margin\", \"shrink\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var shrink = shrinkProp;\n\n  if (typeof shrink === 'undefined' && muiFormControl) {\n    shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;\n  }\n\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['margin', 'variant']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormLabel__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"data-shrink\": shrink,\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, muiFormControl && classes.formControl, !disableAnimation && classes.animated, shrink && classes.shrink, fcs.margin === 'dense' && classes.marginDense, {\n      'filled': classes.filled,\n      'outlined': classes.outlined\n    }[fcs.variant]),\n    classes: {\n      focused: classes.focused,\n      disabled: classes.disabled,\n      error: classes.error,\n      required: classes.required,\n      asterisk: classes.asterisk\n    },\n    ref: ref\n  }, other));\n});\n true ? InputLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The contents of the `InputLabel`.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * If `true`, the transition animation is disabled.\n   */\n  disableAnimation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, apply disabled class.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input of this label is focused.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense']),\n\n  /**\n   * if `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label is shrunk.\n   */\n  shrink: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiInputLabel'\n})(InputLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _InputLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./InputLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _InputLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useIsFocusVisible */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {},\n\n  /* Styles applied to the root element if `underline=\"none\"`. */\n  underlineNone: {\n    textDecoration: 'none'\n  },\n\n  /* Styles applied to the root element if `underline=\"hover\"`. */\n  underlineHover: {\n    textDecoration: 'none',\n    '&:hover': {\n      textDecoration: 'underline'\n    }\n  },\n\n  /* Styles applied to the root element if `underline=\"always\"`. */\n  underlineAlways: {\n    textDecoration: 'underline'\n  },\n  // Same reset as ButtonBase.root\n\n  /* Styles applied to the root element if `component=\"button\"`. */\n  button: {\n    position: 'relative',\n    WebkitTapHighlightColor: 'transparent',\n    backgroundColor: 'transparent',\n    // Reset default value\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0,\n    border: 0,\n    margin: 0,\n    // Remove the margin in Safari\n    borderRadius: 0,\n    padding: 0,\n    // Remove the padding in Firefox\n    cursor: 'pointer',\n    userSelect: 'none',\n    verticalAlign: 'middle',\n    '-moz-appearance': 'none',\n    // Reset\n    '-webkit-appearance': 'none',\n    // Reset\n    '&::-moz-focus-inner': {\n      borderStyle: 'none' // Remove Firefox dotted outline.\n\n    },\n    '&$focusVisible': {\n      outline: 'auto'\n    }\n  },\n\n  /* Pseudo-class applied to the root element if the link is keyboard focused. */\n  focusVisible: {}\n};\nvar Link = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Link(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'a' : _props$component,\n      onBlur = props.onBlur,\n      onFocus = props.onFocus,\n      TypographyClasses = props.TypographyClasses,\n      _props$underline = props.underline,\n      underline = _props$underline === void 0 ? 'hover' : _props$underline,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'inherit' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"color\", \"component\", \"onBlur\", \"onFocus\", \"TypographyClasses\", \"underline\", \"variant\"]);\n\n  var _useIsFocusVisible = Object(_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(),\n      isFocusVisible = _useIsFocusVisible.isFocusVisible,\n      onBlurVisible = _useIsFocusVisible.onBlurVisible,\n      focusVisibleRef = _useIsFocusVisible.ref;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      focusVisible = _React$useState[0],\n      setFocusVisible = _React$useState[1];\n\n  var handlerRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(ref, focusVisibleRef);\n\n  var handleBlur = function handleBlur(event) {\n    if (focusVisible) {\n      onBlurVisible();\n      setFocusVisible(false);\n    }\n\n    if (onBlur) {\n      onBlur(event);\n    }\n  };\n\n  var handleFocus = function handleFocus(event) {\n    if (isFocusVisible(event)) {\n      setFocusVisible(true);\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"underline\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(underline))], className, focusVisible && classes.focusVisible, component === 'button' && classes.button),\n    classes: TypographyClasses,\n    color: color,\n    component: component,\n    onBlur: handleBlur,\n    onFocus: handleFocus,\n    ref: handlerRef,\n    variant: variant\n  }, other));\n});\n true ? Link.propTypes = {\n  /**\n   * The content of the link.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the link.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_7__[\"elementTypeAcceptingRef\"],\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * `classes` prop applied to the [`Typography`](/api/typography/) element.\n   */\n  TypographyClasses: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Controls when the link should have an underline.\n   */\n  underline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['none', 'hover', 'always']),\n\n  /**\n   * Applies the theme typography styles.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiLink'\n})(Link));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Link/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Link/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Link__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Link */ \"./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Link__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Link/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/List.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/List.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ListContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ListContext */ \"./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    listStyle: 'none',\n    margin: 0,\n    padding: 0,\n    position: 'relative'\n  },\n\n  /* Styles applied to the root element if `disablePadding={false}`. */\n  padding: {\n    paddingTop: 8,\n    paddingBottom: 8\n  },\n\n  /* Styles applied to the root element if dense. */\n  dense: {},\n\n  /* Styles applied to the root element if a `subheader` is provided. */\n  subheader: {\n    paddingTop: 0\n  }\n};\nvar List = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function List(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'ul' : _props$component,\n      _props$dense = props.dense,\n      dense = _props$dense === void 0 ? false : _props$dense,\n      _props$disablePadding = props.disablePadding,\n      disablePadding = _props$disablePadding === void 0 ? false : _props$disablePadding,\n      subheader = props.subheader,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\"]);\n\n  var context = react__WEBPACK_IMPORTED_MODULE_2__[\"useMemo\"](function () {\n    return {\n      dense: dense\n    };\n  }, [dense]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ListContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n    value: context\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, dense && classes.dense, !disablePadding && classes.padding, subheader && classes.subheader),\n    ref: ref\n  }, other), subheader, children));\n});\n true ? List.propTypes = {\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used for\n   * the list and list items.\n   * The prop is available to descendant components as the `dense` context.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, vertical padding will be removed from the list.\n   */\n  disablePadding: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the subheader, normally `ListSubheader`.\n   */\n  subheader: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiList'\n})(List));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/List.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * @ignore - internal component.\n */\n\nvar ListContext = react__WEBPACK_IMPORTED_MODULE_0__[\"createContext\"]({});\n\nif (true) {\n  ListContext.displayName = 'ListContext';\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ListContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./List */ \"./jaas-client/node_modules/@material-ui/core/esm/List/List.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _List__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _List_ListContext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../List/ListContext */ \"./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the (normally root) `component` element. May be wrapped by a `container`. */\n    root: {\n      display: 'flex',\n      justifyContent: 'flex-start',\n      alignItems: 'center',\n      position: 'relative',\n      textDecoration: 'none',\n      width: '100%',\n      boxSizing: 'border-box',\n      textAlign: 'left',\n      paddingTop: 8,\n      paddingBottom: 8,\n      '&$focusVisible': {\n        backgroundColor: theme.palette.action.selected\n      },\n      '&$selected, &$selected:hover': {\n        backgroundColor: theme.palette.action.selected\n      },\n      '&$disabled': {\n        opacity: 0.5\n      }\n    },\n\n    /* Styles applied to the `container` element if `children` includes `ListItemSecondaryAction`. */\n    container: {\n      position: 'relative'\n    },\n\n    /* Pseudo-class applied to the `component`'s `focusVisibleClassName` prop if `button={true}`. */\n    focusVisible: {},\n\n    /* Styles applied to the `component` element if dense. */\n    dense: {\n      paddingTop: 4,\n      paddingBottom: 4\n    },\n\n    /* Styles applied to the `component` element if `alignItems=\"flex-start\"`. */\n    alignItemsFlexStart: {\n      alignItems: 'flex-start'\n    },\n\n    /* Pseudo-class applied to the inner `component` element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the inner `component` element if `divider={true}`. */\n    divider: {\n      borderBottom: \"1px solid \".concat(theme.palette.divider),\n      backgroundClip: 'padding-box'\n    },\n\n    /* Styles applied to the inner `component` element if `disableGutters={false}`. */\n    gutters: {\n      paddingLeft: 16,\n      paddingRight: 16\n    },\n\n    /* Styles applied to the inner `component` element if `button={true}`. */\n    button: {\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shortest\n      }),\n      '&:hover': {\n        textDecoration: 'none',\n        backgroundColor: theme.palette.action.hover,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the `component` element if `children` includes `ListItemSecondaryAction`. */\n    secondaryAction: {\n      // Add some space to avoid collision as `ListItemSecondaryAction`\n      // is absolutely positioned.\n      paddingRight: 48\n    },\n\n    /* Pseudo-class applied to the root element if `selected={true}`. */\n    selected: {}\n  };\n};\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"];\n/**\n * Uses an additional container component if `ListItemSecondaryAction` is the last child.\n */\n\nvar ListItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function ListItem(props, ref) {\n  var _props$alignItems = props.alignItems,\n      alignItems = _props$alignItems === void 0 ? 'center' : _props$alignItems,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      _props$button = props.button,\n      button = _props$button === void 0 ? false : _props$button,\n      childrenProp = props.children,\n      classes = props.classes,\n      className = props.className,\n      componentProp = props.component,\n      _props$ContainerCompo = props.ContainerComponent,\n      ContainerComponent = _props$ContainerCompo === void 0 ? 'li' : _props$ContainerCompo,\n      _props$ContainerProps = props.ContainerProps;\n  _props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;\n\n  var ContainerClassName = _props$ContainerProps.className,\n      ContainerProps = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_props$ContainerProps, [\"className\"]),\n      _props$dense = props.dense,\n      dense = _props$dense === void 0 ? false : _props$dense,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      _props$divider = props.divider,\n      divider = _props$divider === void 0 ? false : _props$divider,\n      focusVisibleClassName = props.focusVisibleClassName,\n      _props$selected = props.selected,\n      selected = _props$selected === void 0 ? false : _props$selected,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"alignItems\", \"autoFocus\", \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\"]);\n\n  var context = react__WEBPACK_IMPORTED_MODULE_2__[\"useContext\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\n  var childContext = {\n    dense: dense || context.dense || false,\n    alignItems: alignItems\n  };\n  var listItemRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  useEnhancedEffect(function () {\n    if (autoFocus) {\n      if (listItemRef.current) {\n        listItemRef.current.focus();\n      } else if (true) {\n        console.error('Material-UI: Unable to set focus to a ListItem whose component has not been rendered.');\n      }\n    }\n  }, [autoFocus]);\n  var children = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(childrenProp);\n  var hasSecondaryAction = children.length && Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(children[children.length - 1], ['ListItemSecondaryAction']);\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    listItemRef.current = react_dom__WEBPACK_IMPORTED_MODULE_11__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleOwnRef, ref);\n\n  var componentProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, childContext.dense && classes.dense, !disableGutters && classes.gutters, divider && classes.divider, disabled && classes.disabled, button && classes.button, alignItems !== \"center\" && classes.alignItemsFlexStart, hasSecondaryAction && classes.secondaryAction, selected && classes.selected),\n    disabled: disabled\n  }, other);\n\n  var Component = componentProp || 'li';\n\n  if (button) {\n    componentProps.component = componentProp || 'div';\n    componentProps.focusVisibleClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.focusVisible, focusVisibleClassName);\n    Component = _ButtonBase__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\n  }\n\n  if (hasSecondaryAction) {\n    // Use div by default.\n    Component = !componentProps.component && !componentProp ? 'div' : Component; // Avoid nesting of li > li.\n\n    if (ContainerComponent === 'li') {\n      if (Component === 'li') {\n        Component = 'div';\n      } else if (componentProps.component === 'li') {\n        componentProps.component = 'div';\n      }\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Provider, {\n      value: childContext\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](ContainerComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.container, ContainerClassName),\n      ref: handleRef\n    }, ContainerProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, componentProps, children), children.pop()));\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Provider, {\n    value: childContext\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    ref: handleRef\n  }, componentProps), children));\n});\n true ? ListItem.propTypes = {\n  /**\n   * Defines the `align-items` style property.\n   */\n  alignItems: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center']),\n\n  /**\n   * If `true`, the list item will be focused during the first mount.\n   * Focus will also be triggered if the value changes from false to true.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the list item will be a button (using `ButtonBase`). Props intended\n   * for `ButtonBase` can then be applied to `ListItem`.\n   */\n  button: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the component. If a `ListItemSecondaryAction` is used it must\n   * be the last child.\n   */\n  children: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, function (props) {\n    var children = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(props.children); // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)\n\n    var secondaryActionIndex = -1;\n\n    for (var i = children.length - 1; i >= 0; i -= 1) {\n      var child = children[i];\n\n      if (Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['ListItemSecondaryAction'])) {\n        secondaryActionIndex = i;\n        break;\n      }\n    } //  is ListItemSecondaryAction the last child of ListItem\n\n\n    if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {\n      return new Error('Material-UI: You used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + 'you must pass it as the last child to ListItem.');\n    }\n\n    return null;\n  }),\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   * By default, it's a `li` when `button` is `false` and a `div` when `button` is `true`.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * The container component used when a `ListItemSecondaryAction` is the last child.\n   */\n  ContainerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * Props applied to the container component if used.\n   */\n  ContainerProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the list item will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, a 1px light border is added to the bottom of the list item.\n   */\n  divider: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Use to apply selected styling.\n   */\n  selected: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiListItem'\n})(ListItem));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ListItem */ \"./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ListItem__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js ***!
-  \*********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Popover */ \"./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js\");\n/* harmony import */ var _MenuList__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../MenuList */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _utils_setRef__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar RTL_ORIGIN = {\n  vertical: 'top',\n  horizontal: 'right'\n};\nvar LTR_ORIGIN = {\n  vertical: 'top',\n  horizontal: 'left'\n};\nvar styles = {\n  /* Styles applied to the `Paper` component. */\n  paper: {\n    // specZ: The maximum height of a simple menu should be one or more rows less than the view\n    // height. This ensures a tapable area outside of the simple menu with which to dismiss\n    // the menu.\n    maxHeight: 'calc(100% - 96px)',\n    // Add iOS momentum scrolling.\n    WebkitOverflowScrolling: 'touch'\n  },\n\n  /* Styles applied to the `List` component via `MenuList`. */\n  list: {\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0\n  }\n};\nvar Menu = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Menu(props, ref) {\n  var _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus,\n      children = props.children,\n      classes = props.classes,\n      _props$disableAutoFoc = props.disableAutoFocusItem,\n      disableAutoFocusItem = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$MenuListProps = props.MenuListProps,\n      MenuListProps = _props$MenuListProps === void 0 ? {} : _props$MenuListProps,\n      onClose = props.onClose,\n      onEntering = props.onEntering,\n      open = props.open,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      PopoverClasses = props.PopoverClasses,\n      _props$transitionDura = props.transitionDuration,\n      transitionDuration = _props$transitionDura === void 0 ? 'auto' : _props$transitionDura,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'selectedMenu' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoFocus\", \"children\", \"classes\", \"disableAutoFocusItem\", \"MenuListProps\", \"onClose\", \"onEntering\", \"open\", \"PaperProps\", \"PopoverClasses\", \"transitionDuration\", \"variant\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_12__[\"default\"])();\n  var autoFocusItem = autoFocus && !disableAutoFocusItem && open;\n  var menuListActionsRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var contentAnchorRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  var getContentAnchorEl = function getContentAnchorEl() {\n    return contentAnchorRef.current;\n  };\n\n  var handleEntering = function handleEntering(element, isAppearing) {\n    if (menuListActionsRef.current) {\n      menuListActionsRef.current.adjustStyleForScrollbar(element, theme);\n    }\n\n    if (onEntering) {\n      onEntering(element, isAppearing);\n    }\n  };\n\n  var handleListKeyDown = function handleListKeyDown(event) {\n    if (event.key === 'Tab') {\n      event.preventDefault();\n\n      if (onClose) {\n        onClose(event, 'tabKeyDown');\n      }\n    }\n  };\n  /**\n   * the index of the item should receive focus\n   * in a `variant=\"selectedMenu\"` it's the first `selected` item\n   * otherwise it's the very first item.\n   */\n\n\n  var activeItemIndex = -1; // since we inject focus related props into children we have to do a lookahead\n  // to check if there is a `selected` item. We're looking for the last `selected`\n  // item and use the first valid item as a fallback\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child)) {\n      return;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_3__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Menu component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    if (!child.props.disabled) {\n      if (variant !== \"menu\" && child.props.selected) {\n        activeItemIndex = index;\n      } else if (activeItemIndex === -1) {\n        activeItemIndex = index;\n      }\n    }\n  });\n  var items = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (index === activeItemIndex) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](child, {\n        ref: function ref(instance) {\n          // #StrictMode ready\n          contentAnchorRef.current = react_dom__WEBPACK_IMPORTED_MODULE_10__[\"findDOMNode\"](instance);\n          Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(child.ref, instance);\n        }\n      });\n    }\n\n    return child;\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Popover__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    getContentAnchorEl: getContentAnchorEl,\n    classes: PopoverClasses,\n    onClose: onClose,\n    onEntering: handleEntering,\n    anchorOrigin: theme.direction === 'rtl' ? RTL_ORIGIN : LTR_ORIGIN,\n    transformOrigin: theme.direction === 'rtl' ? RTL_ORIGIN : LTR_ORIGIN,\n    PaperProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, PaperProps, {\n      classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, PaperProps.classes, {\n        root: classes.paper\n      })\n    }),\n    open: open,\n    ref: ref,\n    transitionDuration: transitionDuration\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_MenuList__WEBPACK_IMPORTED_MODULE_9__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    onKeyDown: handleListKeyDown,\n    actions: menuListActionsRef,\n    autoFocus: autoFocus && (activeItemIndex === -1 || disableAutoFocusItem),\n    autoFocusItem: autoFocusItem,\n    variant: variant\n  }, MenuListProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.list, MenuListProps.className)\n  }), items));\n});\n true ? Menu.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A HTML element, or a function that returns it.\n   * It's used to set the position of the menu.\n   */\n  anchorEl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n  /**\n   * If `true` (Default) will focus the `[role=\"menu\"]` if no focusable child is found. Disabled\n   * children are not focusable. If you set this prop to `false` focus will be placed\n   * on the parent modal container. This has severe accessibility implications\n   * and should only be considered if you manage focus otherwise.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Menu contents, normally `MenuItem`s.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * When opening the menu will not focus the active item but the `[role=\"menu\"]`\n   * unless `autoFocus` is also set to `false`. Not using the default means not\n   * following WAI-ARIA authoring practices. Please be considerate about possible\n   * accessibility implications.\n   */\n  disableAutoFocusItem: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Props applied to the [`MenuList`](/api/menu-list/) element.\n   */\n  MenuListProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`, `\"tabKeyDown\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the Menu enters.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the Menu exits.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the menu is visible.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * @ignore\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * `classes` prop applied to the [`Popover`](/api/popover/) element.\n   */\n  PopoverClasses: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The length of the transition in `ms`, or 'auto'\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })]),\n\n  /**\n   * The variant to use. Use `menu` to prevent selected items from impacting the initial focus\n   * and the vertical alignment relative to the anchor element.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['menu', 'selectedMenu'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiMenu'\n})(Menu));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Menu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Menu__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js ***!
-  \*****************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ListItem */ \"./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.typography.body1, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      minHeight: 48,\n      paddingTop: 6,\n      paddingBottom: 6,\n      boxSizing: 'border-box',\n      width: 'auto',\n      overflow: 'hidden',\n      whiteSpace: 'nowrap'\n    }, theme.breakpoints.up('sm'), {\n      minHeight: 'auto'\n    })),\n    // TODO v5: remove\n\n    /* Styles applied to the root element if `disableGutters={false}`. */\n    gutters: {},\n\n    /* Styles applied to the root element if `selected={true}`. */\n    selected: {},\n\n    /* Styles applied to the root element if dense. */\n    dense: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.typography.body2, {\n      minHeight: 'auto'\n    })\n  };\n};\nvar MenuItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function MenuItem(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'li' : _props$component,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      ListItemClasses = props.ListItemClasses,\n      _props$role = props.role,\n      role = _props$role === void 0 ? 'menuitem' : _props$role,\n      selected = props.selected,\n      tabIndexProp = props.tabIndex,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"disableGutters\", \"ListItemClasses\", \"role\", \"selected\", \"tabIndex\"]);\n\n  var tabIndex;\n\n  if (!props.disabled) {\n    tabIndex = tabIndexProp !== undefined ? tabIndexProp : -1;\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_ListItem__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n    button: true,\n    role: role,\n    tabIndex: tabIndex,\n    component: component,\n    selected: selected,\n    disableGutters: disableGutters,\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      dense: classes.dense\n    }, ListItemClasses),\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, selected && classes.selected, !disableGutters && classes.gutters),\n    ref: ref\n  }, other));\n});\n true ? MenuItem.propTypes = {\n  /**\n   * Menu item contents.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * `classes` prop applied to the [`ListItem`](/api/list-item/) element.\n   */\n  ListItemClasses: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  role: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  selected: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiMenuItem'\n})(MenuItem));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MenuItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MenuItem */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _MenuItem__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../List */ \"./jaas-client/node_modules/@material-ui/core/esm/List/index.js\");\n/* harmony import */ var _utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/getScrollbarSize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\n\nfunction nextItem(list, item, disableListWrap) {\n  if (list === item) {\n    return list.firstChild;\n  }\n\n  if (item && item.nextElementSibling) {\n    return item.nextElementSibling;\n  }\n\n  return disableListWrap ? null : list.firstChild;\n}\n\nfunction previousItem(list, item, disableListWrap) {\n  if (list === item) {\n    return disableListWrap ? list.firstChild : list.lastChild;\n  }\n\n  if (item && item.previousElementSibling) {\n    return item.previousElementSibling;\n  }\n\n  return disableListWrap ? null : list.lastChild;\n}\n\nfunction textCriteriaMatches(nextFocus, textCriteria) {\n  if (textCriteria === undefined) {\n    return true;\n  }\n\n  var text = nextFocus.innerText;\n\n  if (text === undefined) {\n    // jsdom doesn't support innerText\n    text = nextFocus.textContent;\n  }\n\n  text = text.trim().toLowerCase();\n\n  if (text.length === 0) {\n    return false;\n  }\n\n  if (textCriteria.repeating) {\n    return text[0] === textCriteria.keys[0];\n  }\n\n  return text.indexOf(textCriteria.keys.join('')) === 0;\n}\n\nfunction moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, traversalFunction, textCriteria) {\n  var wrappedOnce = false;\n  var nextFocus = traversalFunction(list, currentFocus, currentFocus ? disableListWrap : false);\n\n  while (nextFocus) {\n    // Prevent infinite loop.\n    if (nextFocus === list.firstChild) {\n      if (wrappedOnce) {\n        return;\n      }\n\n      wrappedOnce = true;\n    } // Same logic as useAutocomplete.js\n\n\n    var nextFocusDisabled = disabledItemsFocusable ? false : nextFocus.disabled || nextFocus.getAttribute('aria-disabled') === 'true';\n\n    if (!nextFocus.hasAttribute('tabindex') || !textCriteriaMatches(nextFocus, textCriteria) || nextFocusDisabled) {\n      // Move to the next element.\n      nextFocus = traversalFunction(list, nextFocus, disableListWrap);\n    } else {\n      nextFocus.focus();\n      return;\n    }\n  }\n}\n\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"];\n/**\n * A permanently displayed menu following https://www.w3.org/TR/wai-aria-practices/#menubutton.\n * It's exposed to help customization of the [`Menu`](/api/menu/) component. If you\n * use it separately you need to move focus into the component manually. Once\n * the focus is placed inside the component it is fully keyboard accessible.\n */\n\nvar MenuList = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function MenuList(props, ref) {\n  var actions = props.actions,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      _props$autoFocusItem = props.autoFocusItem,\n      autoFocusItem = _props$autoFocusItem === void 0 ? false : _props$autoFocusItem,\n      children = props.children,\n      className = props.className,\n      _props$disabledItemsF = props.disabledItemsFocusable,\n      disabledItemsFocusable = _props$disabledItemsF === void 0 ? false : _props$disabledItemsF,\n      _props$disableListWra = props.disableListWrap,\n      disableListWrap = _props$disableListWra === void 0 ? false : _props$disableListWra,\n      onKeyDown = props.onKeyDown,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'selectedMenu' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"actions\", \"autoFocus\", \"autoFocusItem\", \"children\", \"className\", \"disabledItemsFocusable\", \"disableListWrap\", \"onKeyDown\", \"variant\"]);\n\n  var listRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var textCriteriaRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"]({\n    keys: [],\n    repeating: true,\n    previousKeyMatched: true,\n    lastTime: null\n  });\n  useEnhancedEffect(function () {\n    if (autoFocus) {\n      listRef.current.focus();\n    }\n  }, [autoFocus]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](actions, function () {\n    return {\n      adjustStyleForScrollbar: function adjustStyleForScrollbar(containerElement, theme) {\n        // Let's ignore that piece of logic if users are already overriding the width\n        // of the menu.\n        var noExplicitWidth = !listRef.current.style.width;\n\n        if (containerElement.clientHeight < listRef.current.clientHeight && noExplicitWidth) {\n          var scrollbarSize = \"\".concat(Object(_utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(true), \"px\");\n          listRef.current.style[theme.direction === 'rtl' ? 'paddingLeft' : 'paddingRight'] = scrollbarSize;\n          listRef.current.style.width = \"calc(100% + \".concat(scrollbarSize, \")\");\n        }\n\n        return listRef.current;\n      }\n    };\n  }, []);\n\n  var handleKeyDown = function handleKeyDown(event) {\n    var list = listRef.current;\n    var key = event.key;\n    /**\n     * @type {Element} - will always be defined since we are in a keydown handler\n     * attached to an element. A keydown event is either dispatched to the activeElement\n     * or document.body or document.documentElement. Only the first case will\n     * trigger this specific handler.\n     */\n\n    var currentFocus = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(list).activeElement;\n\n    if (key === 'ArrowDown') {\n      // Prevent scroll of the page\n      event.preventDefault();\n      moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, nextItem);\n    } else if (key === 'ArrowUp') {\n      event.preventDefault();\n      moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, previousItem);\n    } else if (key === 'Home') {\n      event.preventDefault();\n      moveFocus(list, null, disableListWrap, disabledItemsFocusable, nextItem);\n    } else if (key === 'End') {\n      event.preventDefault();\n      moveFocus(list, null, disableListWrap, disabledItemsFocusable, previousItem);\n    } else if (key.length === 1) {\n      var criteria = textCriteriaRef.current;\n      var lowerKey = key.toLowerCase();\n      var currTime = performance.now();\n\n      if (criteria.keys.length > 0) {\n        // Reset\n        if (currTime - criteria.lastTime > 500) {\n          criteria.keys = [];\n          criteria.repeating = true;\n          criteria.previousKeyMatched = true;\n        } else if (criteria.repeating && lowerKey !== criteria.keys[0]) {\n          criteria.repeating = false;\n        }\n      }\n\n      criteria.lastTime = currTime;\n      criteria.keys.push(lowerKey);\n      var keepFocusOnCurrent = currentFocus && !criteria.repeating && textCriteriaMatches(currentFocus, criteria);\n\n      if (criteria.previousKeyMatched && (keepFocusOnCurrent || moveFocus(list, currentFocus, false, disabledItemsFocusable, nextItem, criteria))) {\n        event.preventDefault();\n      } else {\n        criteria.previousKeyMatched = false;\n      }\n    }\n\n    if (onKeyDown) {\n      onKeyDown(event);\n    }\n  };\n\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    listRef.current = react_dom__WEBPACK_IMPORTED_MODULE_5__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleOwnRef, ref);\n  /**\n   * the index of the item should receive focus\n   * in a `variant=\"selectedMenu\"` it's the first `selected` item\n   * otherwise it's the very first item.\n   */\n\n  var activeItemIndex = -1; // since we inject focus related props into children we have to do a lookahead\n  // to check if there is a `selected` item. We're looking for the last `selected`\n  // item and use the first valid item as a fallback\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child, index) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child)) {\n      return;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_3__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Menu component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    if (!child.props.disabled) {\n      if (variant === 'selectedMenu' && child.props.selected) {\n        activeItemIndex = index;\n      } else if (activeItemIndex === -1) {\n        activeItemIndex = index;\n      }\n    }\n  });\n  var items = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (index === activeItemIndex) {\n      var newChildProps = {};\n\n      if (autoFocusItem) {\n        newChildProps.autoFocus = true;\n      }\n\n      if (child.props.tabIndex === undefined && variant === 'selectedMenu') {\n        newChildProps.tabIndex = 0;\n      }\n\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](child, newChildProps);\n    }\n\n    return child;\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    role: \"menu\",\n    ref: handleRef,\n    className: className,\n    onKeyDown: handleKeyDown,\n    tabIndex: autoFocus ? 0 : -1\n  }, other), items);\n});\n true ? MenuList.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, will focus the `[role=\"menu\"]` container and move into tab order.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, will focus the first menuitem if `variant=\"menu\"` or selected item\n   * if `variant=\"selectedMenu\"`.\n   */\n  autoFocusItem: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * MenuList contents, normally `MenuItem`s.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, will allow focus on disabled items.\n   */\n  disabledItemsFocusable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the menu items will not wrap focus.\n   */\n  disableListWrap: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * The variant to use. Use `menu` to prevent selected items from impacting the initial focus\n   * and the vertical alignment relative to the anchor element.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['menu', 'selectedMenu'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (MenuList);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MenuList__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MenuList */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _MenuList__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js ***!
-  \***********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Portal */ \"./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js\");\n/* harmony import */ var _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n/* harmony import */ var _styles_zIndex__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/zIndex */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js\");\n/* harmony import */ var _ModalManager__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ModalManager */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js\");\n/* harmony import */ var _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Unstable_TrapFocus */ \"./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js\");\n/* harmony import */ var _SimpleBackdrop__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./SimpleBackdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getContainer(container) {\n  container = typeof container === 'function' ? container() : container;\n  return react_dom__WEBPACK_IMPORTED_MODULE_3__[\"findDOMNode\"](container);\n}\n\nfunction getHasTransition(props) {\n  return props.children ? props.children.props.hasOwnProperty('in') : false;\n} // A modal manager used to track and manage the state of open Modals.\n// Modals don't open on the server so this won't conflict with concurrent requests.\n\n\nvar defaultManager = new _ModalManager__WEBPACK_IMPORTED_MODULE_13__[\"default\"]();\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'fixed',\n      zIndex: theme.zIndex.modal,\n      right: 0,\n      bottom: 0,\n      top: 0,\n      left: 0\n    },\n\n    /* Styles applied to the root element if the `Modal` has exited. */\n    hidden: {\n      visibility: 'hidden'\n    }\n  };\n};\n/**\n * Modal is a lower-level construct that is leveraged by the following components:\n *\n * - [Dialog](/api/dialog/)\n * - [Drawer](/api/drawer/)\n * - [Menu](/api/menu/)\n * - [Popover](/api/popover/)\n *\n * If you are creating a modal dialog, you probably want to use the [Dialog](/api/dialog/) component\n * rather than directly using Modal.\n *\n * This component shares many concepts with [react-overlays](https://react-bootstrap.github.io/react-overlays/#modals).\n */\n\nvar Modal = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Modal(inProps, ref) {\n  var theme = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_5__[\"useTheme\"])();\n  var props = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_5__[\"getThemeProps\"])({\n    name: 'MuiModal',\n    props: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inProps),\n    theme: theme\n  });\n\n  var _props$BackdropCompon = props.BackdropComponent,\n      BackdropComponent = _props$BackdropCompon === void 0 ? _SimpleBackdrop__WEBPACK_IMPORTED_MODULE_15__[\"default\"] : _props$BackdropCompon,\n      BackdropProps = props.BackdropProps,\n      children = props.children,\n      _props$closeAfterTran = props.closeAfterTransition,\n      closeAfterTransition = _props$closeAfterTran === void 0 ? false : _props$closeAfterTran,\n      container = props.container,\n      _props$disableAutoFoc = props.disableAutoFocus,\n      disableAutoFocus = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$disableBackdro = props.disableBackdropClick,\n      disableBackdropClick = _props$disableBackdro === void 0 ? false : _props$disableBackdro,\n      _props$disableEnforce = props.disableEnforceFocus,\n      disableEnforceFocus = _props$disableEnforce === void 0 ? false : _props$disableEnforce,\n      _props$disableEscapeK = props.disableEscapeKeyDown,\n      disableEscapeKeyDown = _props$disableEscapeK === void 0 ? false : _props$disableEscapeK,\n      _props$disablePortal = props.disablePortal,\n      disablePortal = _props$disablePortal === void 0 ? false : _props$disablePortal,\n      _props$disableRestore = props.disableRestoreFocus,\n      disableRestoreFocus = _props$disableRestore === void 0 ? false : _props$disableRestore,\n      _props$disableScrollL = props.disableScrollLock,\n      disableScrollLock = _props$disableScrollL === void 0 ? false : _props$disableScrollL,\n      _props$hideBackdrop = props.hideBackdrop,\n      hideBackdrop = _props$hideBackdrop === void 0 ? false : _props$hideBackdrop,\n      _props$keepMounted = props.keepMounted,\n      keepMounted = _props$keepMounted === void 0 ? false : _props$keepMounted,\n      _props$manager = props.manager,\n      manager = _props$manager === void 0 ? defaultManager : _props$manager,\n      onBackdropClick = props.onBackdropClick,\n      onClose = props.onClose,\n      onEscapeKeyDown = props.onEscapeKeyDown,\n      onRendered = props.onRendered,\n      open = props.open,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"BackdropComponent\", \"BackdropProps\", \"children\", \"closeAfterTransition\", \"container\", \"disableAutoFocus\", \"disableBackdropClick\", \"disableEnforceFocus\", \"disableEscapeKeyDown\", \"disablePortal\", \"disableRestoreFocus\", \"disableScrollLock\", \"hideBackdrop\", \"keepMounted\", \"manager\", \"onBackdropClick\", \"onClose\", \"onEscapeKeyDown\", \"onRendered\", \"open\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](true),\n      exited = _React$useState[0],\n      setExited = _React$useState[1];\n\n  var modal = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"]({});\n  var mountNodeRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var modalRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(modalRef, ref);\n  var hasTransition = getHasTransition(props);\n\n  var getDoc = function getDoc() {\n    return Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(mountNodeRef.current);\n  };\n\n  var getModal = function getModal() {\n    modal.current.modalRef = modalRef.current;\n    modal.current.mountNode = mountNodeRef.current;\n    return modal.current;\n  };\n\n  var handleMounted = function handleMounted() {\n    manager.mount(getModal(), {\n      disableScrollLock: disableScrollLock\n    }); // Fix a bug on Chrome where the scroll isn't initially 0.\n\n    modalRef.current.scrollTop = 0;\n  };\n\n  var handleOpen = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(function () {\n    var resolvedContainer = getContainer(container) || getDoc().body;\n    manager.add(getModal(), resolvedContainer); // The element was already mounted.\n\n    if (modalRef.current) {\n      handleMounted();\n    }\n  });\n  var isTopModal = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    return manager.isTopModal(getModal());\n  }, [manager]);\n  var handlePortalRef = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(function (node) {\n    mountNodeRef.current = node;\n\n    if (!node) {\n      return;\n    }\n\n    if (onRendered) {\n      onRendered();\n    }\n\n    if (open && isTopModal()) {\n      handleMounted();\n    } else {\n      Object(_ModalManager__WEBPACK_IMPORTED_MODULE_13__[\"ariaHidden\"])(modalRef.current, true);\n    }\n  });\n  var handleClose = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    manager.remove(getModal());\n  }, [manager]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    return function () {\n      handleClose();\n    };\n  }, [handleClose]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (open) {\n      handleOpen();\n    } else if (!hasTransition || !closeAfterTransition) {\n      handleClose();\n    }\n  }, [open, handleClose, hasTransition, closeAfterTransition, handleOpen]);\n\n  if (!keepMounted && !open && (!hasTransition || exited)) {\n    return null;\n  }\n\n  var handleEnter = function handleEnter() {\n    setExited(false);\n  };\n\n  var handleExited = function handleExited() {\n    setExited(true);\n\n    if (closeAfterTransition) {\n      handleClose();\n    }\n  };\n\n  var handleBackdropClick = function handleBackdropClick(event) {\n    if (event.target !== event.currentTarget) {\n      return;\n    }\n\n    if (onBackdropClick) {\n      onBackdropClick(event);\n    }\n\n    if (!disableBackdropClick && onClose) {\n      onClose(event, 'backdropClick');\n    }\n  };\n\n  var handleKeyDown = function handleKeyDown(event) {\n    // The handler doesn't take event.defaultPrevented into account:\n    //\n    // event.preventDefault() is meant to stop default behaviours like\n    // clicking a checkbox to check it, hitting a button to submit a form,\n    // and hitting left arrow to move the cursor in a text input etc.\n    // Only special HTML elements have these default behaviors.\n    if (event.key !== 'Escape' || !isTopModal()) {\n      return;\n    }\n\n    if (onEscapeKeyDown) {\n      onEscapeKeyDown(event);\n    }\n\n    if (!disableEscapeKeyDown) {\n      // Swallow the event, in case someone is listening for the escape key on the body.\n      event.stopPropagation();\n\n      if (onClose) {\n        onClose(event, 'escapeKeyDown');\n      }\n    }\n  };\n\n  var inlineStyle = styles(theme || {\n    zIndex: _styles_zIndex__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n  });\n  var childProps = {};\n\n  if (children.props.tabIndex === undefined) {\n    childProps.tabIndex = children.props.tabIndex || '-1';\n  } // It's a Transition like component\n\n\n  if (hasTransition) {\n    childProps.onEnter = Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleEnter, children.props.onEnter);\n    childProps.onExited = Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleExited, children.props.onExited);\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Portal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n    ref: handlePortalRef,\n    container: container,\n    disablePortal: disablePortal\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    ref: handleRef,\n    onKeyDown: handleKeyDown,\n    role: \"presentation\"\n  }, other, {\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inlineStyle.root, !open && exited ? inlineStyle.hidden : {}, other.style)\n  }), hideBackdrop ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](BackdropComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    open: open,\n    onClick: handleBackdropClick\n  }, BackdropProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n    disableEnforceFocus: disableEnforceFocus,\n    disableAutoFocus: disableAutoFocus,\n    disableRestoreFocus: disableRestoreFocus,\n    getDoc: getDoc,\n    isEnabled: isTopModal,\n    open: open\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](children, childProps))));\n});\n true ? Modal.propTypes = {\n  /**\n   * A backdrop component. This prop enables custom backdrop rendering.\n   */\n  BackdropComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * Props applied to the [`Backdrop`](/api/backdrop/) element.\n   */\n  BackdropProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * A single child content element.\n   */\n  children: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"elementAcceptingRef\"].isRequired,\n\n  /**\n   * When set to true the Modal waits until a nested Transition is completed before closing.\n   */\n  closeAfterTransition: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will have the portal children appended to it.\n   *\n   * By default, it uses the body of the top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_2__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n  /**\n   * If `true`, the modal will not automatically shift focus to itself when it opens, and\n   * replace it to the last focused element when it closes.\n   * This also works correctly with any modal children that have the `disableAutoFocus` prop.\n   *\n   * Generally this should never be set to `true` as it makes the modal less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableAutoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, clicking the backdrop will not fire `onClose`.\n   */\n  disableBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the modal will not prevent focus from leaving the modal while open.\n   *\n   * Generally this should never be set to `true` as it makes the modal less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableEnforceFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, hitting escape will not fire `onClose`.\n   */\n  disableEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Disable the portal behavior.\n   * The children stay within it's parent DOM hierarchy.\n   */\n  disablePortal: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the modal will not restore focus to previously focused element once\n   * modal is hidden.\n   */\n  disableRestoreFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Disable the scroll lock behavior.\n   */\n  disableScrollLock: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is not rendered.\n   */\n  hideBackdrop: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Always keep the children in the DOM.\n   * This prop can be useful in SEO situation or\n   * when you want to maximize the responsiveness of the Modal.\n   */\n  keepMounted: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  manager: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Callback fired when the backdrop is clicked.\n   */\n  onBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * The `reason` parameter can optionally be used to control the response to `onClose`.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the escape key is pressed,\n   * `disableEscapeKeyDown` is false and the modal is in focus.\n   */\n  onEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired once the children has been mounted into the `container`.\n   * It signals that the `open={true}` prop took effect.\n   *\n   * This prop will be deprecated and removed in v5, the ref can be used instead.\n   */\n  onRendered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the modal is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Modal);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js ***!
-  \******************************************************************************/
-/*! exports provided: ariaHidden, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ariaHidden\", function() { return ariaHidden; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModalManager; });\n/* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getScrollbarSize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js\");\n\n\n\n\n\n // Is a vertical scrollbar displayed?\n\nfunction isOverflowing(container) {\n  var doc = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(container);\n\n  if (doc.body === container) {\n    return Object(_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(doc).innerWidth > doc.documentElement.clientWidth;\n  }\n\n  return container.scrollHeight > container.clientHeight;\n}\n\nfunction ariaHidden(node, show) {\n  if (show) {\n    node.setAttribute('aria-hidden', 'true');\n  } else {\n    node.removeAttribute('aria-hidden');\n  }\n}\n\nfunction getPaddingRight(node) {\n  return parseInt(window.getComputedStyle(node)['padding-right'], 10) || 0;\n}\n\nfunction ariaHiddenSiblings(container, mountNode, currentNode) {\n  var nodesToExclude = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n  var show = arguments.length > 4 ? arguments[4] : undefined;\n  var blacklist = [mountNode, currentNode].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(nodesToExclude));\n  var blacklistTagNames = ['TEMPLATE', 'SCRIPT', 'STYLE'];\n  [].forEach.call(container.children, function (node) {\n    if (node.nodeType === 1 && blacklist.indexOf(node) === -1 && blacklistTagNames.indexOf(node.tagName) === -1) {\n      ariaHidden(node, show);\n    }\n  });\n}\n\nfunction findIndexOf(containerInfo, callback) {\n  var idx = -1;\n  containerInfo.some(function (item, index) {\n    if (callback(item)) {\n      idx = index;\n      return true;\n    }\n\n    return false;\n  });\n  return idx;\n}\n\nfunction handleContainer(containerInfo, props) {\n  var restoreStyle = [];\n  var restorePaddings = [];\n  var container = containerInfo.container;\n  var fixedNodes;\n\n  if (!props.disableScrollLock) {\n    if (isOverflowing(container)) {\n      // Compute the size before applying overflow hidden to avoid any scroll jumps.\n      var scrollbarSize = Object(_utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n      restoreStyle.push({\n        value: container.style.paddingRight,\n        key: 'padding-right',\n        el: container\n      }); // Use computed style, here to get the real padding to add our scrollbar width.\n\n      container.style['padding-right'] = \"\".concat(getPaddingRight(container) + scrollbarSize, \"px\"); // .mui-fixed is a global helper.\n\n      fixedNodes = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(container).querySelectorAll('.mui-fixed');\n      [].forEach.call(fixedNodes, function (node) {\n        restorePaddings.push(node.style.paddingRight);\n        node.style.paddingRight = \"\".concat(getPaddingRight(node) + scrollbarSize, \"px\");\n      });\n    } // Improve Gatsby support\n    // https://css-tricks.com/snippets/css/force-vertical-scrollbar/\n\n\n    var parent = container.parentElement;\n    var scrollContainer = parent.nodeName === 'HTML' && window.getComputedStyle(parent)['overflow-y'] === 'scroll' ? parent : container; // Block the scroll even if no scrollbar is visible to account for mobile keyboard\n    // screensize shrink.\n\n    restoreStyle.push({\n      value: scrollContainer.style.overflow,\n      key: 'overflow',\n      el: scrollContainer\n    });\n    scrollContainer.style.overflow = 'hidden';\n  }\n\n  var restore = function restore() {\n    if (fixedNodes) {\n      [].forEach.call(fixedNodes, function (node, i) {\n        if (restorePaddings[i]) {\n          node.style.paddingRight = restorePaddings[i];\n        } else {\n          node.style.removeProperty('padding-right');\n        }\n      });\n    }\n\n    restoreStyle.forEach(function (_ref) {\n      var value = _ref.value,\n          el = _ref.el,\n          key = _ref.key;\n\n      if (value) {\n        el.style.setProperty(key, value);\n      } else {\n        el.style.removeProperty(key);\n      }\n    });\n  };\n\n  return restore;\n}\n\nfunction getHiddenSiblings(container) {\n  var hiddenSiblings = [];\n  [].forEach.call(container.children, function (node) {\n    if (node.getAttribute && node.getAttribute('aria-hidden') === 'true') {\n      hiddenSiblings.push(node);\n    }\n  });\n  return hiddenSiblings;\n}\n/**\n * @ignore - do not document.\n *\n * Proper state management for containers and the modals in those containers.\n * Simplified, but inspired by react-overlay's ModalManager class.\n * Used by the Modal to ensure proper styling of containers.\n */\n\n\nvar ModalManager = /*#__PURE__*/function () {\n  function ModalManager() {\n    Object(_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(this, ModalManager);\n\n    // this.modals[modalIndex] = modal\n    this.modals = []; // this.containers[containerIndex] = {\n    //   modals: [],\n    //   container,\n    //   restore: null,\n    // }\n\n    this.containers = [];\n  }\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(ModalManager, [{\n    key: \"add\",\n    value: function add(modal, container) {\n      var modalIndex = this.modals.indexOf(modal);\n\n      if (modalIndex !== -1) {\n        return modalIndex;\n      }\n\n      modalIndex = this.modals.length;\n      this.modals.push(modal); // If the modal we are adding is already in the DOM.\n\n      if (modal.modalRef) {\n        ariaHidden(modal.modalRef, false);\n      }\n\n      var hiddenSiblingNodes = getHiddenSiblings(container);\n      ariaHiddenSiblings(container, modal.mountNode, modal.modalRef, hiddenSiblingNodes, true);\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.container === container;\n      });\n\n      if (containerIndex !== -1) {\n        this.containers[containerIndex].modals.push(modal);\n        return modalIndex;\n      }\n\n      this.containers.push({\n        modals: [modal],\n        container: container,\n        restore: null,\n        hiddenSiblingNodes: hiddenSiblingNodes\n      });\n      return modalIndex;\n    }\n  }, {\n    key: \"mount\",\n    value: function mount(modal, props) {\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.modals.indexOf(modal) !== -1;\n      });\n      var containerInfo = this.containers[containerIndex];\n\n      if (!containerInfo.restore) {\n        containerInfo.restore = handleContainer(containerInfo, props);\n      }\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(modal) {\n      var modalIndex = this.modals.indexOf(modal);\n\n      if (modalIndex === -1) {\n        return modalIndex;\n      }\n\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.modals.indexOf(modal) !== -1;\n      });\n      var containerInfo = this.containers[containerIndex];\n      containerInfo.modals.splice(containerInfo.modals.indexOf(modal), 1);\n      this.modals.splice(modalIndex, 1); // If that was the last modal in a container, clean up the container.\n\n      if (containerInfo.modals.length === 0) {\n        // The modal might be closed before it had the chance to be mounted in the DOM.\n        if (containerInfo.restore) {\n          containerInfo.restore();\n        }\n\n        if (modal.modalRef) {\n          // In case the modal wasn't in the DOM yet.\n          ariaHidden(modal.modalRef, true);\n        }\n\n        ariaHiddenSiblings(containerInfo.container, modal.mountNode, modal.modalRef, containerInfo.hiddenSiblingNodes, false);\n        this.containers.splice(containerIndex, 1);\n      } else {\n        // Otherwise make sure the next top modal is visible to a screen reader.\n        var nextTop = containerInfo.modals[containerInfo.modals.length - 1]; // as soon as a modal is adding its modalRef is undefined. it can't set\n        // aria-hidden because the dom element doesn't exist either\n        // when modal was unmounted before modalRef gets null\n\n        if (nextTop.modalRef) {\n          ariaHidden(nextTop.modalRef, false);\n        }\n      }\n\n      return modalIndex;\n    }\n  }, {\n    key: \"isTopModal\",\n    value: function isTopModal(modal) {\n      return this.modals.length > 0 && this.modals[this.modals.length - 1] === modal;\n    }\n  }]);\n\n  return ModalManager;\n}();\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js ***!
-  \********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    zIndex: -1,\n    position: 'fixed',\n    right: 0,\n    bottom: 0,\n    top: 0,\n    left: 0,\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    WebkitTapHighlightColor: 'transparent'\n  },\n\n  /* Styles applied to the root element if `invisible={true}`. */\n  invisible: {\n    backgroundColor: 'transparent'\n  }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SimpleBackdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function SimpleBackdrop(props, ref) {\n  var _props$invisible = props.invisible,\n      invisible = _props$invisible === void 0 ? false : _props$invisible,\n      open = props.open,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"invisible\", \"open\"]);\n\n  return open ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-hidden\": true,\n    ref: ref\n  }, other, {\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles.root, invisible ? styles.invisible : {}, other.style)\n  })) : null;\n});\n true ? SimpleBackdrop.propTypes = {\n  /**\n   * If `true`, the backdrop is invisible.\n   * It can be used when rendering a popover or a custom select component.\n   */\n  invisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (SimpleBackdrop);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js ***!
-  \***********************************************************************/
-/*! exports provided: default, ModalManager */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Modal__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _ModalManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ModalManager */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ModalManager\", function() { return _ModalManager__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js ***!
-  \*************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _NativeSelectInput__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NativeSelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/svg-icons/ArrowDropDown */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the select component `root` class. */\n    root: {},\n\n    /* Styles applied to the select component `select` class. */\n    select: {\n      '-moz-appearance': 'none',\n      // Reset\n      '-webkit-appearance': 'none',\n      // Reset\n      // When interacting quickly, the text can end up selected.\n      // Native select can't be selected either.\n      userSelect: 'none',\n      borderRadius: 0,\n      // Reset\n      minWidth: 16,\n      // So it doesn't collapse.\n      cursor: 'pointer',\n      '&:focus': {\n        // Show that it's not an text input\n        backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.05)' : 'rgba(255, 255, 255, 0.05)',\n        borderRadius: 0 // Reset Chrome style\n\n      },\n      // Remove IE 11 arrow\n      '&::-ms-expand': {\n        display: 'none'\n      },\n      '&$disabled': {\n        cursor: 'default'\n      },\n      '&[multiple]': {\n        height: 'auto'\n      },\n      '&:not([multiple]) option, &:not([multiple]) optgroup': {\n        backgroundColor: theme.palette.background.paper\n      },\n      '&&': {\n        paddingRight: 24\n      }\n    },\n\n    /* Styles applied to the select component if `variant=\"filled\"`. */\n    filled: {\n      '&&': {\n        paddingRight: 32\n      }\n    },\n\n    /* Styles applied to the select component if `variant=\"outlined\"`. */\n    outlined: {\n      borderRadius: theme.shape.borderRadius,\n      '&&': {\n        paddingRight: 32\n      }\n    },\n\n    /* Styles applied to the select component `selectMenu` class. */\n    selectMenu: {\n      height: 'auto',\n      // Resets for multpile select with chips\n      minHeight: '1.1876em',\n      // Required for select\\text-field height consistency\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      overflow: 'hidden'\n    },\n\n    /* Pseudo-class applied to the select component `disabled` class. */\n    disabled: {},\n\n    /* Styles applied to the icon component. */\n    icon: {\n      // We use a position absolute over a flexbox in order to forward the pointer events\n      // to the input and to support wrapping tags..\n      position: 'absolute',\n      right: 0,\n      top: 'calc(50% - 12px)',\n      // Center vertically\n      pointerEvents: 'none',\n      // Don't block pointer events on the select under the icon.\n      color: theme.palette.action.active,\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the icon component if the popup is open. */\n    iconOpen: {\n      transform: 'rotate(180deg)'\n    },\n\n    /* Styles applied to the icon component if `variant=\"filled\"`. */\n    iconFilled: {\n      right: 7\n    },\n\n    /* Styles applied to the icon component if `variant=\"outlined\"`. */\n    iconOutlined: {\n      right: 7\n    },\n\n    /* Styles applied to the underlying native input component. */\n    nativeInput: {\n      bottom: 0,\n      left: 0,\n      position: 'absolute',\n      opacity: 0,\n      pointerEvents: 'none',\n      width: '100%'\n    }\n  };\n};\nvar defaultInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Input__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null);\n/**\n * An alternative to `<Select native />` with a much smaller bundle size footprint.\n */\n\nvar NativeSelect = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function NativeSelect(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      _props$IconComponent = props.IconComponent,\n      IconComponent = _props$IconComponent === void 0 ? _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_8__[\"default\"] : _props$IconComponent,\n      _props$input = props.input,\n      input = _props$input === void 0 ? defaultInput : _props$input,\n      inputProps = props.inputProps,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"IconComponent\", \"input\", \"inputProps\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](input, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // Most of the logic is implemented in `NativeSelectInput`.\n    // The `Select` component is a simple API wrapper to expose something better to play with.\n    inputComponent: _NativeSelectInput__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      children: children,\n      classes: classes,\n      IconComponent: IconComponent,\n      variant: fcs.variant,\n      type: undefined\n    }, inputProps, input ? input.props.inputProps : {}),\n    ref: ref\n  }, other));\n});\n true ? NativeSelect.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<option>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * An `Input` element; does not have to be a material-ui specific `Input`.\n   */\n  input: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element,\n\n  /**\n   * Attributes applied to the `select` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The input value. The DOM API casts this to a string.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\nNativeSelect.muiName = 'Select';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiNativeSelect'\n})(NativeSelect));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js ***!
-  \******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\nvar NativeSelectInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function NativeSelectInput(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      disabled = props.disabled,\n      IconComponent = props.IconComponent,\n      inputRef = props.inputRef,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"disabled\", \"IconComponent\", \"inputRef\", \"variant\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"select\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, // TODO v5: merge root and select\n    classes.select, classes[variant], className, disabled && classes.disabled),\n    disabled: disabled,\n    ref: inputRef || ref\n  }, other)), props.multiple ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](IconComponent, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.icon, classes[\"icon\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(variant))], disabled && classes.disabled)\n  }));\n});\n true ? NativeSelectInput.propTypes = {\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<option>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * The CSS class name of the select element.\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the select will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType.isRequired,\n\n  /**\n   * Use that prop to pass a ref to the native select element.\n   * @deprecated\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * @ignore\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `select` or hidden `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The input value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['standard', 'outlined', 'filled'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (NativeSelectInput);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js ***!
-  \****************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'absolute',\n      bottom: 0,\n      right: 0,\n      top: -5,\n      left: 0,\n      margin: 0,\n      padding: '0 8px',\n      pointerEvents: 'none',\n      borderRadius: 'inherit',\n      borderStyle: 'solid',\n      borderWidth: 1,\n      overflow: 'hidden'\n    },\n\n    /* Styles applied to the legend element when `labelWidth` is provided. */\n    legend: {\n      textAlign: 'left',\n      padding: 0,\n      lineHeight: '11px',\n      // sync with `height` in `legend` styles\n      transition: theme.transitions.create('width', {\n        duration: 150,\n        easing: theme.transitions.easing.easeOut\n      })\n    },\n\n    /* Styles applied to the legend element. */\n    legendLabelled: {\n      display: 'block',\n      width: 'auto',\n      textAlign: 'left',\n      padding: 0,\n      height: 11,\n      // sync with `lineHeight` in `legend` styles\n      fontSize: '0.75em',\n      visibility: 'hidden',\n      maxWidth: 0.01,\n      transition: theme.transitions.create('max-width', {\n        duration: 50,\n        easing: theme.transitions.easing.easeOut\n      }),\n      '& > span': {\n        paddingLeft: 5,\n        paddingRight: 5,\n        display: 'inline-block'\n      }\n    },\n\n    /* Styles applied to the legend element is notched. */\n    legendNotched: {\n      maxWidth: 1000,\n      transition: theme.transitions.create('max-width', {\n        duration: 100,\n        easing: theme.transitions.easing.easeOut,\n        delay: 50\n      })\n    }\n  };\n};\n/**\n * @ignore - internal component.\n */\n\nvar NotchedOutline = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function NotchedOutline(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      label = props.label,\n      labelWidthProp = props.labelWidth,\n      notched = props.notched,\n      style = props.style,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"label\", \"labelWidth\", \"notched\", \"style\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var align = theme.direction === 'rtl' ? 'right' : 'left';\n\n  if (label !== undefined) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"fieldset\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      \"aria-hidden\": true,\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n      ref: ref,\n      style: style\n    }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"legend\", {\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.legendLabelled, notched && classes.legendNotched)\n    }, label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", null, label) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", {\n      dangerouslySetInnerHTML: {\n        __html: '&#8203;'\n      }\n    })));\n  }\n\n  var labelWidth = labelWidthProp > 0 ? labelWidthProp * 0.75 + 8 : 0.01;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"fieldset\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    \"aria-hidden\": true,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, \"padding\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(align)), 8), style),\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"legend\", {\n    className: classes.legend,\n    style: {\n      // IE 11: fieldset with legend does not render\n      // a border radius. This maintains consistency\n      // by always having a legend rendered\n      width: notched ? labelWidth : 0.01\n    }\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  })));\n});\n true ? NotchedOutline.propTypes = {\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The label.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * The width of the label.\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number.isRequired,\n\n  /**\n   * If `true`, the outline is notched to accommodate the label.\n   */\n  notched: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'PrivateNotchedOutline'\n})(NotchedOutline));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js ***!
-  \***************************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _NotchedOutline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./NotchedOutline */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var borderColor = theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      borderRadius: theme.shape.borderRadius,\n      '&:hover $notchedOutline': {\n        borderColor: theme.palette.text.primary\n      },\n      // Reset on touch devices, it doesn't add specificity\n      '@media (hover: none)': {\n        '&:hover $notchedOutline': {\n          borderColor: borderColor\n        }\n      },\n      '&$focused $notchedOutline': {\n        borderColor: theme.palette.primary.main,\n        borderWidth: 2\n      },\n      '&$error $notchedOutline': {\n        borderColor: theme.palette.error.main\n      },\n      '&$disabled $notchedOutline': {\n        borderColor: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {\n      '&$focused $notchedOutline': {\n        borderColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {\n      paddingLeft: 14\n    },\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {\n      paddingRight: 14\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: '18.5px 14px',\n      '&$marginDense': {\n        paddingTop: 10.5,\n        paddingBottom: 10.5\n      }\n    },\n\n    /* Styles applied to the `NotchedOutline` element. */\n    notchedOutline: {\n      borderColor: borderColor\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      padding: '18.5px 14px',\n      '&:-webkit-autofill': {\n        WebkitBoxShadow: theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\n        WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\n        caretColor: theme.palette.type === 'light' ? null : '#fff',\n        borderRadius: 'inherit'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 10.5,\n      paddingBottom: 10.5\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {\n      paddingLeft: 0\n    },\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {\n      paddingRight: 0\n    }\n  };\n};\nvar OutlinedInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function OutlinedInput(props, ref) {\n  var classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      label = props.label,\n      _props$labelWidth = props.labelWidth,\n      labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      notched = props.notched,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"fullWidth\", \"inputComponent\", \"label\", \"labelWidth\", \"multiline\", \"notched\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    renderSuffix: function renderSuffix(state) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_NotchedOutline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n        className: classes.notchedOutline,\n        label: label,\n        labelWidth: labelWidth,\n        notched: typeof notched !== 'undefined' ? notched : Boolean(state.startAdornment || state.filled || state.focused)\n      });\n    },\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes.underline),\n      notchedOutline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? OutlinedInput.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The label of the input. It is only used for layout. The actual labelling\n   * is handled by `InputLabel`. If specified `labelWidth` is ignored.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The width of the label. Is ignored if `label` is provided. Prefer `label`\n   * if the input label appears with a strike through.\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the outline is notched to accommodate the label.\n   */\n  notched: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nOutlinedInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiOutlinedInput'\n})(OutlinedInput));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _OutlinedInput__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js ***!
-  \***********************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var elevations = {};\n  theme.shadows.forEach(function (shadow, index) {\n    elevations[\"elevation\".concat(index)] = {\n      boxShadow: shadow\n    };\n  });\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    /* Styles applied to the root element. */\n    root: {\n      backgroundColor: theme.palette.background.paper,\n      color: theme.palette.text.primary,\n      transition: theme.transitions.create('box-shadow')\n    },\n\n    /* Styles applied to the root element if `square={false}`. */\n    rounded: {\n      borderRadius: theme.shape.borderRadius\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      border: \"1px solid \".concat(theme.palette.divider)\n    }\n  }, elevations);\n};\nvar Paper = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Paper(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$square = props.square,\n      square = _props$square === void 0 ? false : _props$square,\n      _props$elevation = props.elevation,\n      elevation = _props$elevation === void 0 ? 1 : _props$elevation,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'elevation' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"square\", \"elevation\", \"variant\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, variant === 'outlined' ? classes.outlined : classes[\"elevation\".concat(elevation)], !square && classes.rounded),\n    ref: ref\n  }, other));\n});\n true ? Paper.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Shadow depth, corresponds to `dp` in the spec.\n   * It accepts values between 0 and 24 inclusive.\n   */\n  elevation: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, function (props) {\n    var classes = props.classes,\n        elevation = props.elevation; // in case `withStyles` fails to inject we don't need this warning\n\n    if (classes === undefined) {\n      return null;\n    }\n\n    if (elevation != null && classes[\"elevation\".concat(elevation)] === undefined) {\n      return new Error(\"Material-UI: This elevation `\".concat(elevation, \"` is not implemented.\"));\n    }\n\n    return null;\n  }),\n\n  /**\n   * If `true`, rounded corners are disabled.\n   */\n  square: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['elevation', 'outlined'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiPaper'\n})(Paper));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Paper__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js ***!
-  \***************************************************************************/
-/*! exports provided: getOffsetTop, getOffsetLeft, styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getOffsetTop\", function() { return getOffsetTop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getOffsetLeft\", function() { return getOffsetLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/debounce */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js\");\n/* harmony import */ var _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js\");\n/* harmony import */ var _Grow__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Grow */ \"./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js\");\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getOffsetTop(rect, vertical) {\n  var offset = 0;\n\n  if (typeof vertical === 'number') {\n    offset = vertical;\n  } else if (vertical === 'center') {\n    offset = rect.height / 2;\n  } else if (vertical === 'bottom') {\n    offset = rect.height;\n  }\n\n  return offset;\n}\nfunction getOffsetLeft(rect, horizontal) {\n  var offset = 0;\n\n  if (typeof horizontal === 'number') {\n    offset = horizontal;\n  } else if (horizontal === 'center') {\n    offset = rect.width / 2;\n  } else if (horizontal === 'right') {\n    offset = rect.width;\n  }\n\n  return offset;\n}\n\nfunction getTransformOriginValue(transformOrigin) {\n  return [transformOrigin.horizontal, transformOrigin.vertical].map(function (n) {\n    return typeof n === 'number' ? \"\".concat(n, \"px\") : n;\n  }).join(' ');\n} // Sum the scrollTop between two elements.\n\n\nfunction getScrollParent(parent, child) {\n  var element = child;\n  var scrollTop = 0;\n\n  while (element && element !== parent) {\n    element = element.parentElement;\n    scrollTop += element.scrollTop;\n  }\n\n  return scrollTop;\n}\n\nfunction getAnchorEl(anchorEl) {\n  return typeof anchorEl === 'function' ? anchorEl() : anchorEl;\n}\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {},\n\n  /* Styles applied to the `Paper` component. */\n  paper: {\n    position: 'absolute',\n    overflowY: 'auto',\n    overflowX: 'hidden',\n    // So we see the popover when it's empty.\n    // It's most likely on issue on userland.\n    minWidth: 16,\n    minHeight: 16,\n    maxWidth: 'calc(100% - 32px)',\n    maxHeight: 'calc(100% - 32px)',\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0\n  }\n};\nvar Popover = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Popover(props, ref) {\n  var action = props.action,\n      anchorEl = props.anchorEl,\n      _props$anchorOrigin = props.anchorOrigin,\n      anchorOrigin = _props$anchorOrigin === void 0 ? {\n    vertical: 'top',\n    horizontal: 'left'\n  } : _props$anchorOrigin,\n      anchorPosition = props.anchorPosition,\n      _props$anchorReferenc = props.anchorReference,\n      anchorReference = _props$anchorReferenc === void 0 ? 'anchorEl' : _props$anchorReferenc,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      containerProp = props.container,\n      _props$elevation = props.elevation,\n      elevation = _props$elevation === void 0 ? 8 : _props$elevation,\n      getContentAnchorEl = props.getContentAnchorEl,\n      _props$marginThreshol = props.marginThreshold,\n      marginThreshold = _props$marginThreshol === void 0 ? 16 : _props$marginThreshol,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      open = props.open,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      _props$transformOrigi = props.transformOrigin,\n      transformOrigin = _props$transformOrigi === void 0 ? {\n    vertical: 'top',\n    horizontal: 'left'\n  } : _props$transformOrigi,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Grow__WEBPACK_IMPORTED_MODULE_13__[\"default\"] : _props$TransitionComp,\n      _props$transitionDura = props.transitionDuration,\n      transitionDurationProp = _props$transitionDura === void 0 ? 'auto' : _props$transitionDura,\n      _props$TransitionProp = props.TransitionProps,\n      TransitionProps = _props$TransitionProp === void 0 ? {} : _props$TransitionProp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"action\", \"anchorEl\", \"anchorOrigin\", \"anchorPosition\", \"anchorReference\", \"children\", \"classes\", \"className\", \"container\", \"elevation\", \"getContentAnchorEl\", \"marginThreshold\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"open\", \"PaperProps\", \"transformOrigin\", \"TransitionComponent\", \"transitionDuration\", \"TransitionProps\"]);\n\n  var paperRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](); // Returns the top/left offset of the position\n  // to attach to on the anchor element (or body if none is provided)\n\n  var getAnchorOffset = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (contentAnchorOffset) {\n    if (anchorReference === 'anchorPosition') {\n      if (true) {\n        if (!anchorPosition) {\n          console.error('Material-UI: You need to provide a `anchorPosition` prop when using ' + '<Popover anchorReference=\"anchorPosition\" />.');\n        }\n      }\n\n      return anchorPosition;\n    }\n\n    var resolvedAnchorEl = getAnchorEl(anchorEl); // If an anchor element wasn't provided, just use the parent body element of this Popover\n\n    var anchorElement = resolvedAnchorEl && resolvedAnchorEl.nodeType === 1 ? resolvedAnchorEl : Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(paperRef.current).body;\n    var anchorRect = anchorElement.getBoundingClientRect();\n\n    if (true) {\n      var box = anchorElement.getBoundingClientRect();\n\n      if ( true && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n        console.warn(['Material-UI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n      }\n    }\n\n    var anchorVertical = contentAnchorOffset === 0 ? anchorOrigin.vertical : 'center';\n    return {\n      top: anchorRect.top + getOffsetTop(anchorRect, anchorVertical),\n      left: anchorRect.left + getOffsetLeft(anchorRect, anchorOrigin.horizontal)\n    };\n  }, [anchorEl, anchorOrigin.horizontal, anchorOrigin.vertical, anchorPosition, anchorReference]); // Returns the vertical offset of inner content to anchor the transform on if provided\n\n  var getContentAnchorOffset = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (element) {\n    var contentAnchorOffset = 0;\n\n    if (getContentAnchorEl && anchorReference === 'anchorEl') {\n      var contentAnchorEl = getContentAnchorEl(element);\n\n      if (contentAnchorEl && element.contains(contentAnchorEl)) {\n        var scrollTop = getScrollParent(element, contentAnchorEl);\n        contentAnchorOffset = contentAnchorEl.offsetTop + contentAnchorEl.clientHeight / 2 - scrollTop || 0;\n      } // != the default value\n\n\n      if (true) {\n        if (anchorOrigin.vertical !== 'top') {\n          console.error(['Material-UI: You can not change the default `anchorOrigin.vertical` value ', 'when also providing the `getContentAnchorEl` prop to the popover component.', 'Only use one of the two props.', 'Set `getContentAnchorEl` to `null | undefined`' + ' or leave `anchorOrigin.vertical` unchanged.'].join('\\n'));\n        }\n      }\n    }\n\n    return contentAnchorOffset;\n  }, [anchorOrigin.vertical, anchorReference, getContentAnchorEl]); // Return the base transform origin using the element\n  // and taking the content anchor offset into account if in use\n\n  var getTransformOrigin = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (elemRect) {\n    var contentAnchorOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    return {\n      vertical: getOffsetTop(elemRect, transformOrigin.vertical) + contentAnchorOffset,\n      horizontal: getOffsetLeft(elemRect, transformOrigin.horizontal)\n    };\n  }, [transformOrigin.horizontal, transformOrigin.vertical]);\n  var getPositioningStyle = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (element) {\n    // Check if the parent has requested anchoring on an inner content node\n    var contentAnchorOffset = getContentAnchorOffset(element);\n    var elemRect = {\n      width: element.offsetWidth,\n      height: element.offsetHeight\n    }; // Get the transform origin point on the element itself\n\n    var elemTransformOrigin = getTransformOrigin(elemRect, contentAnchorOffset);\n\n    if (anchorReference === 'none') {\n      return {\n        top: null,\n        left: null,\n        transformOrigin: getTransformOriginValue(elemTransformOrigin)\n      };\n    } // Get the offset of of the anchoring element\n\n\n    var anchorOffset = getAnchorOffset(contentAnchorOffset); // Calculate element positioning\n\n    var top = anchorOffset.top - elemTransformOrigin.vertical;\n    var left = anchorOffset.left - elemTransformOrigin.horizontal;\n    var bottom = top + elemRect.height;\n    var right = left + elemRect.width; // Use the parent window of the anchorEl if provided\n\n    var containerWindow = Object(_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(getAnchorEl(anchorEl)); // Window thresholds taking required margin into account\n\n    var heightThreshold = containerWindow.innerHeight - marginThreshold;\n    var widthThreshold = containerWindow.innerWidth - marginThreshold; // Check if the vertical axis needs shifting\n\n    if (top < marginThreshold) {\n      var diff = top - marginThreshold;\n      top -= diff;\n      elemTransformOrigin.vertical += diff;\n    } else if (bottom > heightThreshold) {\n      var _diff = bottom - heightThreshold;\n\n      top -= _diff;\n      elemTransformOrigin.vertical += _diff;\n    }\n\n    if (true) {\n      if (elemRect.height > heightThreshold && elemRect.height && heightThreshold) {\n        console.error(['Material-UI: The popover component is too tall.', \"Some part of it can not be seen on the screen (\".concat(elemRect.height - heightThreshold, \"px).\"), 'Please consider adding a `max-height` to improve the user-experience.'].join('\\n'));\n      }\n    } // Check if the horizontal axis needs shifting\n\n\n    if (left < marginThreshold) {\n      var _diff2 = left - marginThreshold;\n\n      left -= _diff2;\n      elemTransformOrigin.horizontal += _diff2;\n    } else if (right > widthThreshold) {\n      var _diff3 = right - widthThreshold;\n\n      left -= _diff3;\n      elemTransformOrigin.horizontal += _diff3;\n    }\n\n    return {\n      top: \"\".concat(Math.round(top), \"px\"),\n      left: \"\".concat(Math.round(left), \"px\"),\n      transformOrigin: getTransformOriginValue(elemTransformOrigin)\n    };\n  }, [anchorEl, anchorReference, getAnchorOffset, getContentAnchorOffset, getTransformOrigin, marginThreshold]);\n  var setPositioningStyles = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    var element = paperRef.current;\n\n    if (!element) {\n      return;\n    }\n\n    var positioning = getPositioningStyle(element);\n\n    if (positioning.top !== null) {\n      element.style.top = positioning.top;\n    }\n\n    if (positioning.left !== null) {\n      element.style.left = positioning.left;\n    }\n\n    element.style.transformOrigin = positioning.transformOrigin;\n  }, [getPositioningStyle]);\n\n  var handleEntering = function handleEntering(element, isAppearing) {\n    if (onEntering) {\n      onEntering(element, isAppearing);\n    }\n\n    setPositioningStyles();\n  };\n\n  var handlePaperRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    paperRef.current = react_dom__WEBPACK_IMPORTED_MODULE_4__[\"findDOMNode\"](instance);\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (open) {\n      setPositioningStyles();\n    }\n  });\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](action, function () {\n    return open ? {\n      updatePosition: function updatePosition() {\n        setPositioningStyles();\n      }\n    } : null;\n  }, [open, setPositioningStyles]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (!open) {\n      return undefined;\n    }\n\n    var handleResize = Object(_utils_debounce__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(function () {\n      setPositioningStyles();\n    });\n    window.addEventListener('resize', handleResize);\n    return function () {\n      handleResize.clear();\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [open, setPositioningStyles]);\n  var transitionDuration = transitionDurationProp;\n\n  if (transitionDurationProp === 'auto' && !TransitionComponent.muiSupportAuto) {\n    transitionDuration = undefined;\n  } // If the container prop is provided, use that\n  // If the anchorEl prop is provided, use its parent body element as the container\n  // If neither are provided let the Modal take care of choosing the container\n\n\n  var container = containerProp || (anchorEl ? Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(getAnchorEl(anchorEl)).body : undefined);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Modal__WEBPACK_IMPORTED_MODULE_12__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    container: container,\n    open: open,\n    ref: ref,\n    BackdropProps: {\n      invisible: true\n    },\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(classes.root, className)\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: open,\n    onEnter: onEnter,\n    onEntered: onEntered,\n    onExit: onExit,\n    onExited: onExited,\n    onExiting: onExiting,\n    timeout: transitionDuration\n  }, TransitionProps, {\n    onEntering: Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(handleEntering, TransitionProps.onEntering)\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Paper__WEBPACK_IMPORTED_MODULE_14__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    elevation: elevation,\n    ref: handlePaperRef\n  }, PaperProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(classes.paper, PaperProps.className)\n  }), children)));\n});\n true ? Popover.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A ref for imperative actions.\n   * It currently only supports updatePosition() action.\n   */\n  action: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * A HTML element, or a function that returns it.\n   * It's used to set the position of the popover.\n   */\n  anchorEl: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func]), function (props) {\n    if (props.open && (!props.anchorReference || props.anchorReference === 'anchorEl')) {\n      var resolvedAnchorEl = getAnchorEl(props.anchorEl);\n\n      if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {\n        var box = resolvedAnchorEl.getBoundingClientRect();\n\n        if ( true && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n          return new Error(['Material-UI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n        }\n      } else {\n        return new Error(['Material-UI: The `anchorEl` prop provided to the component is invalid.', \"It should be an Element instance but it's `\".concat(resolvedAnchorEl, \"` instead.\")].join('\\n'));\n      }\n    }\n\n    return null;\n  }),\n\n  /**\n   * This is the point on the anchor where the popover's\n   * `anchorEl` will attach to. This is not used when the\n   * anchorReference is 'anchorPosition'.\n   *\n   * Options:\n   * vertical: [top, center, bottom];\n   * horizontal: [left, center, right].\n   */\n  anchorOrigin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['center', 'left', 'right']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired,\n    vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'center', 'top']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired\n  }),\n\n  /**\n   * This is the position that may be used\n   * to set the position of the popover.\n   * The coordinates are relative to\n   * the application's client area.\n   */\n  anchorPosition: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    left: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number.isRequired,\n    top: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number.isRequired\n  }),\n\n  /**\n   * This determines which anchor prop to refer to to set\n   * the position of the popover.\n   */\n  anchorReference: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['anchorEl', 'anchorPosition', 'none']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will passed to the Modal component.\n   *\n   * By default, it uses the body of the anchorEl's top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_2__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func]),\n\n  /**\n   * The elevation of the popover.\n   */\n  elevation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * This function is called in order to retrieve the content anchor element.\n   * It's the opposite of the `anchorEl` prop.\n   * The content anchor element should be an element inside the popover.\n   * It's used to correctly scroll and set the position of the popover.\n   * The positioning strategy tries to make the content anchor element just above the\n   * anchor element.\n   */\n  getContentAnchorEl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Specifies how close to the edge of the window the popover can appear.\n   */\n  marginThreshold: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired before the component is entering.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired before the component is exiting.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * If `true`, the popover is visible.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,\n\n  /**\n   * Props applied to the [`Paper`](/api/paper/) element.\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .shape({\n    component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"elementTypeAcceptingRef\"]\n  }),\n\n  /**\n   * This is the point on the popover which\n   * will attach to the anchor's origin.\n   *\n   * Options:\n   * vertical: [top, center, bottom, x(px)];\n   * horizontal: [left, center, right, x(px)].\n   */\n  transformOrigin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['center', 'left', 'right']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired,\n    vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'center', 'top']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired\n  }),\n\n  /**\n   * The component used for the transition.\n   * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n   */\n  TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * Set to 'auto' to automatically calculate transition time based on height.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number\n  })]),\n\n  /**\n   * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.\n   */\n  TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(styles, {\n  name: 'MuiPopover'\n})(Popover));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover */ \"./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Popover__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_setRef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\nfunction getContainer(container) {\n  container = typeof container === 'function' ? container() : container; // #StrictMode ready\n\n  return react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](container);\n}\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"];\n/**\n * Portals provide a first-class way to render children into a DOM node\n * that exists outside the DOM hierarchy of the parent component.\n */\n\nvar Portal = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"forwardRef\"](function Portal(props, ref) {\n  var children = props.children,\n      container = props.container,\n      _props$disablePortal = props.disablePortal,\n      disablePortal = _props$disablePortal === void 0 ? false : _props$disablePortal,\n      onRendered = props.onRendered;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](null),\n      mountNode = _React$useState[0],\n      setMountNode = _React$useState[1];\n\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](children) ? children.ref : null, ref);\n  useEnhancedEffect(function () {\n    if (!disablePortal) {\n      setMountNode(getContainer(container) || document.body);\n    }\n  }, [container, disablePortal]);\n  useEnhancedEffect(function () {\n    if (mountNode && !disablePortal) {\n      Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(ref, mountNode);\n      return function () {\n        Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(ref, null);\n      };\n    }\n\n    return undefined;\n  }, [ref, mountNode, disablePortal]);\n  useEnhancedEffect(function () {\n    if (onRendered && (mountNode || disablePortal)) {\n      onRendered();\n    }\n  }, [onRendered, mountNode, disablePortal]);\n\n  if (disablePortal) {\n    if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](children)) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"](children, {\n        ref: handleRef\n      });\n    }\n\n    return children;\n  }\n\n  return mountNode ? /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1__[\"createPortal\"](children, mountNode) : mountNode;\n});\n true ? Portal.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The children to render into the `container`.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will have the portal children appended to it.\n   *\n   * By default, it uses the body of the top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func]),\n\n  /**\n   * Disable the portal behavior.\n   * The children stay within it's parent DOM hierarchy.\n   */\n  disablePortal: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Callback fired once the children has been mounted into the `container`.\n   *\n   * This prop will be deprecated and removed in v5, the ref can be used instead.\n   */\n  onRendered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  Portal['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"exactProp\"])(Portal.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Portal);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Portal */ \"./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Portal__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js ***!
-  \*************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _SelectInput__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./SelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../internal/svg-icons/ArrowDropDown */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n/* harmony import */ var _NativeSelect_NativeSelect__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../NativeSelect/NativeSelect */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js\");\n/* harmony import */ var _NativeSelect_NativeSelectInput__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../NativeSelect/NativeSelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js\");\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js\");\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = _NativeSelect_NativeSelect__WEBPACK_IMPORTED_MODULE_11__[\"styles\"];\n\nvar _ref = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Input__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null);\n\nvar _ref2 = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FilledInput__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null);\n\nvar Select = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Select(props, ref) {\n  var _props$autoWidth = props.autoWidth,\n      autoWidth = _props$autoWidth === void 0 ? false : _props$autoWidth,\n      children = props.children,\n      classes = props.classes,\n      _props$displayEmpty = props.displayEmpty,\n      displayEmpty = _props$displayEmpty === void 0 ? false : _props$displayEmpty,\n      _props$IconComponent = props.IconComponent,\n      IconComponent = _props$IconComponent === void 0 ? _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_9__[\"default\"] : _props$IconComponent,\n      id = props.id,\n      input = props.input,\n      inputProps = props.inputProps,\n      label = props.label,\n      labelId = props.labelId,\n      _props$labelWidth = props.labelWidth,\n      labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth,\n      MenuProps = props.MenuProps,\n      _props$multiple = props.multiple,\n      multiple = _props$multiple === void 0 ? false : _props$multiple,\n      _props$native = props.native,\n      native = _props$native === void 0 ? false : _props$native,\n      onClose = props.onClose,\n      onOpen = props.onOpen,\n      open = props.open,\n      renderValue = props.renderValue,\n      SelectDisplayProps = props.SelectDisplayProps,\n      _props$variant = props.variant,\n      variantProps = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoWidth\", \"children\", \"classes\", \"displayEmpty\", \"IconComponent\", \"id\", \"input\", \"inputProps\", \"label\", \"labelId\", \"labelWidth\", \"MenuProps\", \"multiple\", \"native\", \"onClose\", \"onOpen\", \"open\", \"renderValue\", \"SelectDisplayProps\", \"variant\"]);\n\n  var inputComponent = native ? _NativeSelect_NativeSelectInput__WEBPACK_IMPORTED_MODULE_12__[\"default\"] : _SelectInput__WEBPACK_IMPORTED_MODULE_5__[\"default\"];\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant']\n  });\n  var variant = fcs.variant || variantProps;\n  var InputComponent = input || {\n    standard: _ref,\n    outlined: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_OutlinedInput__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n      label: label,\n      labelWidth: labelWidth\n    }),\n    filled: _ref2\n  }[variant];\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // Most of the logic is implemented in `SelectInput`.\n    // The `Select` component is a simple API wrapper to expose something better to play with.\n    inputComponent: inputComponent,\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      children: children,\n      IconComponent: IconComponent,\n      variant: variant,\n      type: undefined,\n      // We render a select. We can ignore the type provided by the `Input`.\n      multiple: multiple\n    }, native ? {\n      id: id\n    } : {\n      autoWidth: autoWidth,\n      displayEmpty: displayEmpty,\n      labelId: labelId,\n      MenuProps: MenuProps,\n      onClose: onClose,\n      onOpen: onOpen,\n      open: open,\n      renderValue: renderValue,\n      SelectDisplayProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        id: id\n      }, SelectDisplayProps)\n    }, inputProps, {\n      classes: inputProps ? Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_4__[\"mergeClasses\"])({\n        baseClasses: classes,\n        newClasses: inputProps.classes,\n        Component: Select\n      }) : classes\n    }, input ? input.props.inputProps : {}),\n    ref: ref\n  }, other));\n});\n true ? Select.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the width of the popover will automatically be set according to the items inside the\n   * menu, otherwise it will be at least the width of the select input.\n   */\n  autoWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `MenuItem` when `native` is false and `option` when `native` is true.\n   *\n   * ⚠️The `MenuItem` elements **must** be direct descendants when `native` is false.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The default element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, a value is displayed even if no items are selected.\n   *\n   * In order to display a meaningful value, a function should be passed to the `renderValue` prop which returns the value to be displayed when no items are selected.\n   * You can only use it when the `native` prop is `false` (default).\n   */\n  displayEmpty: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * The `id` of the wrapper element or the `select` element when `native`.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * An `Input` element; does not have to be a material-ui specific `Input`.\n   */\n  input: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   * When `native` is `true`, the attributes are applied on the `select` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * See [OutlinedInput#label](/api/outlined-input/#props)\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The ID of an element that acts as an additional label. The Select will\n   * be labelled by the additional label and the selected value.\n   */\n  labelId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * See [OutlinedInput#label](/api/outlined-input/#props)\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * Props applied to the [`Menu`](/api/menu/) element.\n   */\n  MenuProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, `value` must be an array and the menu will support multiple selections.\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will be using a native `select` element.\n   */\n  native: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (any).\n   * @param {object} [child] The react element that was selected when `native` is `false` (default).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be opened.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onOpen: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Control `select` open state.\n   * You can only use it when the `native` prop is `false` (default).\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Render the selected value.\n   * You can only use it when the `native` prop is `false` (default).\n   *\n   * @param {any} value The `value` provided to the component.\n   * @returns {ReactNode}\n   */\n  renderValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Props applied to the clickable div element.\n   */\n  SelectDisplayProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The input value. Providing an empty string will select no options.\n   * This prop is required when the `native` prop is `false` (default).\n   * Set to an empty string `''` if you don't want any of the available options to be selected.\n   *\n   * If the value is an object it must have reference equality with the option in order to be selected.\n   * If the value is not an object, the string representation must match with the string representation of the option in order to be selected.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\nSelect.muiName = 'Select';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiSelect'\n})(Select));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _Menu_Menu__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Menu/Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js\");\n/* harmony import */ var _InputBase_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../InputBase/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/useControlled */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction areEqualValues(a, b) {\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(b) === 'object' && b !== null) {\n    return a === b;\n  }\n\n  return String(a) === String(b);\n}\n\nfunction isEmpty(display) {\n  return display == null || typeof display === 'string' && !display.trim();\n}\n/**\n * @ignore - internal component.\n */\n\n\nvar SelectInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"forwardRef\"](function SelectInput(props, ref) {\n  var ariaLabel = props['aria-label'],\n      autoFocus = props.autoFocus,\n      autoWidth = props.autoWidth,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      defaultValue = props.defaultValue,\n      disabled = props.disabled,\n      displayEmpty = props.displayEmpty,\n      IconComponent = props.IconComponent,\n      inputRefProp = props.inputRef,\n      labelId = props.labelId,\n      _props$MenuProps = props.MenuProps,\n      MenuProps = _props$MenuProps === void 0 ? {} : _props$MenuProps,\n      multiple = props.multiple,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onClose = props.onClose,\n      onFocus = props.onFocus,\n      onOpen = props.onOpen,\n      openProp = props.open,\n      readOnly = props.readOnly,\n      renderValue = props.renderValue,\n      _props$SelectDisplayP = props.SelectDisplayProps,\n      SelectDisplayProps = _props$SelectDisplayP === void 0 ? {} : _props$SelectDisplayP,\n      tabIndexProp = props.tabIndex,\n      type = props.type,\n      valueProp = props.value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"aria-label\", \"autoFocus\", \"autoWidth\", \"children\", \"classes\", \"className\", \"defaultValue\", \"disabled\", \"displayEmpty\", \"IconComponent\", \"inputRef\", \"labelId\", \"MenuProps\", \"multiple\", \"name\", \"onBlur\", \"onChange\", \"onClose\", \"onFocus\", \"onOpen\", \"open\", \"readOnly\", \"renderValue\", \"SelectDisplayProps\", \"tabIndex\", \"type\", \"value\", \"variant\"]);\n\n  var _useControlled = Object(_utils_useControlled__WEBPACK_IMPORTED_MODULE_14__[\"default\"])({\n    controlled: valueProp,\n    default: defaultValue,\n    name: 'Select'\n  }),\n      _useControlled2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_useControlled, 2),\n      value = _useControlled2[0],\n      setValue = _useControlled2[1];\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_5__[\"useRef\"](null);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](null),\n      displayNode = _React$useState[0],\n      setDisplayNode = _React$useState[1];\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_5__[\"useRef\"](openProp != null),\n      isOpenControlled = _React$useRef.current;\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](),\n      menuMinWidthState = _React$useState2[0],\n      setMenuMinWidthState = _React$useState2[1];\n\n  var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](false),\n      openState = _React$useState3[0],\n      setOpenState = _React$useState3[1];\n\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_13__[\"default\"])(ref, inputRefProp);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useImperativeHandle\"](handleRef, function () {\n    return {\n      focus: function focus() {\n        displayNode.focus();\n      },\n      node: inputRef.current,\n      value: value\n    };\n  }, [displayNode, value]);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n    if (autoFocus && displayNode) {\n      displayNode.focus();\n    }\n  }, [autoFocus, displayNode]);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n    if (displayNode) {\n      var label = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(displayNode).getElementById(labelId);\n\n      if (label) {\n        var handler = function handler() {\n          if (getSelection().isCollapsed) {\n            displayNode.focus();\n          }\n        };\n\n        label.addEventListener('click', handler);\n        return function () {\n          label.removeEventListener('click', handler);\n        };\n      }\n    }\n\n    return undefined;\n  }, [labelId, displayNode]);\n\n  var update = function update(open, event) {\n    if (open) {\n      if (onOpen) {\n        onOpen(event);\n      }\n    } else if (onClose) {\n      onClose(event);\n    }\n\n    if (!isOpenControlled) {\n      setMenuMinWidthState(autoWidth ? null : displayNode.clientWidth);\n      setOpenState(open);\n    }\n  };\n\n  var handleMouseDown = function handleMouseDown(event) {\n    // Ignore everything but left-click\n    if (event.button !== 0) {\n      return;\n    } // Hijack the default focus behavior.\n\n\n    event.preventDefault();\n    displayNode.focus();\n    update(true, event);\n  };\n\n  var handleClose = function handleClose(event) {\n    update(false, event);\n  };\n\n  var childrenArray = react__WEBPACK_IMPORTED_MODULE_5__[\"Children\"].toArray(children); // Support autofill.\n\n  var handleChange = function handleChange(event) {\n    var index = childrenArray.map(function (child) {\n      return child.props.value;\n    }).indexOf(event.target.value);\n\n    if (index === -1) {\n      return;\n    }\n\n    var child = childrenArray[index];\n    setValue(child.props.value);\n\n    if (onChange) {\n      onChange(event, child);\n    }\n  };\n\n  var handleItemClick = function handleItemClick(child) {\n    return function (event) {\n      if (!multiple) {\n        update(false, event);\n      }\n\n      var newValue;\n\n      if (multiple) {\n        newValue = Array.isArray(value) ? value.slice() : [];\n        var itemIndex = value.indexOf(child.props.value);\n\n        if (itemIndex === -1) {\n          newValue.push(child.props.value);\n        } else {\n          newValue.splice(itemIndex, 1);\n        }\n      } else {\n        newValue = child.props.value;\n      }\n\n      if (child.props.onClick) {\n        child.props.onClick(event);\n      }\n\n      if (value === newValue) {\n        return;\n      }\n\n      setValue(newValue);\n\n      if (onChange) {\n        event.persist(); // Preact support, target is read only property on a native event.\n\n        Object.defineProperty(event, 'target', {\n          writable: true,\n          value: {\n            value: newValue,\n            name: name\n          }\n        });\n        onChange(event, child);\n      }\n    };\n  };\n\n  var handleKeyDown = function handleKeyDown(event) {\n    if (!readOnly) {\n      var validKeys = [' ', 'ArrowUp', 'ArrowDown', // The native select doesn't respond to enter on MacOS, but it's recommended by\n      // https://www.w3.org/TR/wai-aria-practices/examples/listbox/listbox-collapsible.html\n      'Enter'];\n\n      if (validKeys.indexOf(event.key) !== -1) {\n        event.preventDefault();\n        update(true, event);\n      }\n    }\n  };\n\n  var open = displayNode !== null && (isOpenControlled ? openProp : openState);\n\n  var handleBlur = function handleBlur(event) {\n    // if open event.stopImmediatePropagation\n    if (!open && onBlur) {\n      event.persist(); // Preact support, target is read only property on a native event.\n\n      Object.defineProperty(event, 'target', {\n        writable: true,\n        value: {\n          value: value,\n          name: name\n        }\n      });\n      onBlur(event);\n    }\n  };\n\n  delete other['aria-invalid'];\n  var display;\n  var displaySingle;\n  var displayMultiple = [];\n  var computeDisplay = false;\n  var foundMatch = false; // No need to display any value if the field is empty.\n\n  if (Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_12__[\"isFilled\"])({\n    value: value\n  }) || displayEmpty) {\n    if (renderValue) {\n      display = renderValue(value);\n    } else {\n      computeDisplay = true;\n    }\n  }\n\n  var items = childrenArray.map(function (child) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"isValidElement\"](child)) {\n      return null;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_6__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Select component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    var selected;\n\n    if (multiple) {\n      if (!Array.isArray(value)) {\n        throw new Error( true ? \"Material-UI: The `value` prop must be an array when using the `Select` component with `multiple`.\" : undefined);\n      }\n\n      selected = value.some(function (v) {\n        return areEqualValues(v, child.props.value);\n      });\n\n      if (selected && computeDisplay) {\n        displayMultiple.push(child.props.children);\n      }\n    } else {\n      selected = areEqualValues(value, child.props.value);\n\n      if (selected && computeDisplay) {\n        displaySingle = child.props.children;\n      }\n    }\n\n    if (selected) {\n      foundMatch = true;\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"cloneElement\"](child, {\n      'aria-selected': selected ? 'true' : undefined,\n      onClick: handleItemClick(child),\n      onKeyUp: function onKeyUp(event) {\n        if (event.key === ' ') {\n          // otherwise our MenuItems dispatches a click event\n          // it's not behavior of the native <option> and causes\n          // the select to close immediately since we open on space keydown\n          event.preventDefault();\n        }\n\n        if (child.props.onKeyUp) {\n          child.props.onKeyUp(event);\n        }\n      },\n      role: 'option',\n      selected: selected,\n      value: undefined,\n      // The value is most likely not a valid HTML attribute.\n      'data-value': child.props.value // Instead, we provide it as a data attribute.\n\n    });\n  });\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n      if (!foundMatch && !multiple && value !== '') {\n        var values = childrenArray.map(function (child) {\n          return child.props.value;\n        });\n        console.warn([\"Material-UI: You have provided an out-of-range value `\".concat(value, \"` for the select \").concat(name ? \"(name=\\\"\".concat(name, \"\\\") \") : '', \"component.\"), \"Consider providing a value that matches one of the available options or ''.\", \"The available values are \".concat(values.filter(function (x) {\n          return x != null;\n        }).map(function (x) {\n          return \"`\".concat(x, \"`\");\n        }).join(', ') || '\"\"', \".\")].join('\\n'));\n      }\n    }, [foundMatch, childrenArray, multiple, name, value]);\n  }\n\n  if (computeDisplay) {\n    display = multiple ? displayMultiple.join(', ') : displaySingle;\n  } // Avoid performing a layout computation in the render method.\n\n\n  var menuMinWidth = menuMinWidthState;\n\n  if (!autoWidth && isOpenControlled && displayNode) {\n    menuMinWidth = displayNode.clientWidth;\n  }\n\n  var tabIndex;\n\n  if (typeof tabIndexProp !== 'undefined') {\n    tabIndex = tabIndexProp;\n  } else {\n    tabIndex = disabled ? null : 0;\n  }\n\n  var buttonId = SelectDisplayProps.id || (name ? \"mui-component-select-\".concat(name) : undefined);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_5__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(classes.root, // TODO v5: merge root and select\n    classes.select, classes.selectMenu, classes[variant], className, disabled && classes.disabled),\n    ref: setDisplayNode,\n    tabIndex: tabIndex,\n    role: \"button\",\n    \"aria-disabled\": disabled ? 'true' : undefined,\n    \"aria-expanded\": open ? 'true' : undefined,\n    \"aria-haspopup\": \"listbox\",\n    \"aria-label\": ariaLabel,\n    \"aria-labelledby\": [labelId, buttonId].filter(Boolean).join(' ') || undefined,\n    onKeyDown: handleKeyDown,\n    onMouseDown: disabled || readOnly ? null : handleMouseDown,\n    onBlur: handleBlur,\n    onFocus: onFocus\n  }, SelectDisplayProps, {\n    // The id is required for proper a11y\n    id: buttonId\n  }), isEmpty(display) ?\n  /*#__PURE__*/\n  // eslint-disable-next-line react/no-danger\n  react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  }) : display), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"input\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    value: Array.isArray(value) ? value.join(',') : value,\n    name: name,\n    ref: inputRef,\n    \"aria-hidden\": true,\n    onChange: handleChange,\n    tabIndex: -1,\n    className: classes.nativeInput,\n    autoFocus: autoFocus\n  }, other)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](IconComponent, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(classes.icon, classes[\"icon\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(variant))], open && classes.iconOpen, disabled && classes.disabled)\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](_Menu_Menu__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    id: \"menu-\".concat(name || ''),\n    anchorEl: displayNode,\n    open: open,\n    onClose: handleClose\n  }, MenuProps, {\n    MenuListProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      'aria-labelledby': labelId,\n      role: 'listbox',\n      disableListWrap: true\n    }, MenuProps.MenuListProps),\n    PaperProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, MenuProps.PaperProps, {\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        minWidth: menuMinWidth\n      }, MenuProps.PaperProps != null ? MenuProps.PaperProps.style : null)\n    })\n  }), items));\n});\n true ? SelectInput.propTypes = {\n  /**\n   * @ignore\n   */\n  'aria-label': prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * @ignore\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * If `true`, the width of the popover will automatically be set according to the items inside the\n   * menu, otherwise it will be at least the width of the select input.\n   */\n  autoWidth: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<MenuItem>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object.isRequired,\n\n  /**\n   * The CSS class name of the select element.\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * The default element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * If `true`, the select will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * If `true`, the selected item is displayed even if its value is empty.\n   */\n  displayEmpty: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType.isRequired,\n\n  /**\n   * Imperative handle implementing `{ value: T, node: HTMLElement, focus(): void }`\n   * Equivalent to `ref`\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"refType\"],\n\n  /**\n   * The ID of an element that acts as an additional label. The Select will\n   * be labelled by the additional label and the selected value.\n   */\n  labelId: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * Props applied to the [`Menu`](/api/menu/) element.\n   */\n  MenuProps: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object,\n\n  /**\n   * If `true`, `value` must be an array and the menu will support multiple selections.\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * Name attribute of the `select` or hidden `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (any).\n   * @param {object} [child] The react element that was selected.\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be opened.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onOpen: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Control `select` open state.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * Render the selected value.\n   *\n   * @param {any} value The `value` provided to the component.\n   * @returns {ReactNode}\n   */\n  renderValue: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Props applied to the clickable div element.\n   */\n  SelectDisplayProps: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * The input value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['standard', 'outlined', 'filled'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (SelectInput);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/index.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/index.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Select */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Select__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js ***!
-  \***************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      userSelect: 'none',\n      width: '1em',\n      height: '1em',\n      display: 'inline-block',\n      fill: 'currentColor',\n      flexShrink: 0,\n      fontSize: theme.typography.pxToRem(24),\n      transition: theme.transitions.create('fill', {\n        duration: theme.transitions.duration.shorter\n      })\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the root element if `color=\"action\"`. */\n    colorAction: {\n      color: theme.palette.action.active\n    },\n\n    /* Styles applied to the root element if `color=\"error\"`. */\n    colorError: {\n      color: theme.palette.error.main\n    },\n\n    /* Styles applied to the root element if `color=\"disabled\"`. */\n    colorDisabled: {\n      color: theme.palette.action.disabled\n    },\n\n    /* Styles applied to the root element if `fontSize=\"inherit\"`. */\n    fontSizeInherit: {\n      fontSize: 'inherit'\n    },\n\n    /* Styles applied to the root element if `fontSize=\"small\"`. */\n    fontSizeSmall: {\n      fontSize: theme.typography.pxToRem(20)\n    },\n\n    /* Styles applied to the root element if `fontSize=\"large\"`. */\n    fontSizeLarge: {\n      fontSize: theme.typography.pxToRem(35)\n    }\n  };\n};\nvar SvgIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function SvgIcon(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'inherit' : _props$color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'svg' : _props$component,\n      _props$fontSize = props.fontSize,\n      fontSize = _props$fontSize === void 0 ? 'default' : _props$fontSize,\n      htmlColor = props.htmlColor,\n      titleAccess = props.titleAccess,\n      _props$viewBox = props.viewBox,\n      viewBox = _props$viewBox === void 0 ? '0 0 24 24' : _props$viewBox,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"fontSize\", \"htmlColor\", \"titleAccess\", \"viewBox\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'inherit' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color))], fontSize !== 'default' && classes[\"fontSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(fontSize))]),\n    focusable: \"false\",\n    viewBox: viewBox,\n    color: htmlColor,\n    \"aria-hidden\": titleAccess ? undefined : true,\n    role: titleAccess ? 'img' : undefined,\n    ref: ref\n  }, other), children, titleAccess ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"title\", null, titleAccess) : null);\n});\n true ? SvgIcon.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Node passed into the SVG element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   * You can use the `htmlColor` prop to apply a color attribute to the SVG element.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['action', 'disabled', 'error', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\n   */\n  fontSize: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'large', 'small']),\n\n  /**\n   * Applies a color attribute to the SVG element.\n   */\n  htmlColor: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The shape-rendering attribute. The behavior of the different options is described on the\n   * [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering).\n   * If you are having issues with blurry icons you should investigate this property.\n   */\n  shapeRendering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Provides a human-readable title for the element that contains it.\n   * https://www.w3.org/TR/SVG-access/#Equivalent\n   */\n  titleAccess: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Allows you to redefine what the coordinates without units mean inside an SVG element.\n   * For example, if the SVG element is 500 (width) by 200 (height),\n   * and you pass viewBox=\"0 0 50 20\",\n   * this means that the coordinates inside the SVG will go from the top left corner (0,0)\n   * to bottom right (50,20) and each unit will be worth 10px.\n   */\n  viewBox: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string\n} : undefined;\nSvgIcon.muiName = 'SvgIcon';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiSvgIcon'\n})(SvgIcon));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _SvgIcon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _SvgIcon__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js\");\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js\");\n/* harmony import */ var _InputLabel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../InputLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js\");\n/* harmony import */ var _FormHelperText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../FormHelperText */ \"./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js\");\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Select */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar variantComponent = {\n  standard: _Input__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n  filled: _FilledInput__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n  outlined: _OutlinedInput__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n};\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {}\n};\n/**\n * The `TextField` is a convenience wrapper for the most common cases (80%).\n * It cannot be all things to all people, otherwise the API would grow out of control.\n *\n * ## Advanced Configuration\n *\n * It's important to understand that the text field is a simple abstraction\n * on top of the following components:\n *\n * - [FormControl](/api/form-control/)\n * - [InputLabel](/api/input-label/)\n * - [FilledInput](/api/filled-input/)\n * - [OutlinedInput](/api/outlined-input/)\n * - [Input](/api/input/)\n * - [FormHelperText](/api/form-helper-text/)\n *\n * If you wish to alter the props applied to the `input` element, you can do so as follows:\n *\n * ```jsx\n * const inputProps = {\n *   step: 300,\n * };\n *\n * return <TextField id=\"time\" type=\"time\" inputProps={inputProps} />;\n * ```\n *\n * For advanced cases, please look at the source of TextField by clicking on the\n * \"Edit this page\" button above. Consider either:\n *\n * - using the upper case props for passing values directly to the components\n * - using the underlying components directly as shown in the demos\n */\n\nvar TextField = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function TextField(props, ref) {\n  var autoComplete = props.autoComplete,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      defaultValue = props.defaultValue,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$error = props.error,\n      error = _props$error === void 0 ? false : _props$error,\n      FormHelperTextProps = props.FormHelperTextProps,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      helperText = props.helperText,\n      hiddenLabel = props.hiddenLabel,\n      id = props.id,\n      InputLabelProps = props.InputLabelProps,\n      inputProps = props.inputProps,\n      InputProps = props.InputProps,\n      inputRef = props.inputRef,\n      label = props.label,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onFocus = props.onFocus,\n      placeholder = props.placeholder,\n      _props$required = props.required,\n      required = _props$required === void 0 ? false : _props$required,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      _props$select = props.select,\n      select = _props$select === void 0 ? false : _props$select,\n      SelectProps = props.SelectProps,\n      type = props.type,\n      value = props.value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoComplete\", \"autoFocus\", \"children\", \"classes\", \"className\", \"color\", \"defaultValue\", \"disabled\", \"error\", \"FormHelperTextProps\", \"fullWidth\", \"helperText\", \"hiddenLabel\", \"id\", \"InputLabelProps\", \"inputProps\", \"InputProps\", \"inputRef\", \"label\", \"multiline\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"placeholder\", \"required\", \"rows\", \"rowsMax\", \"select\", \"SelectProps\", \"type\", \"value\", \"variant\"]);\n\n  if (true) {\n    if (select && !children) {\n      console.error('Material-UI: `children` must be passed when using the `TextField` component with `select`.');\n    }\n  }\n\n  var InputMore = {};\n\n  if (variant === 'outlined') {\n    if (InputLabelProps && typeof InputLabelProps.shrink !== 'undefined') {\n      InputMore.notched = InputLabelProps.shrink;\n    }\n\n    if (label) {\n      var _InputLabelProps$requ;\n\n      var displayRequired = (_InputLabelProps$requ = InputLabelProps === null || InputLabelProps === void 0 ? void 0 : InputLabelProps.required) !== null && _InputLabelProps$requ !== void 0 ? _InputLabelProps$requ : required;\n      InputMore.label = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, label, displayRequired && \"\\xA0*\");\n    }\n  }\n\n  if (select) {\n    // unset defaults from textbox inputs\n    if (!SelectProps || !SelectProps.native) {\n      InputMore.id = undefined;\n    }\n\n    InputMore['aria-describedby'] = undefined;\n  }\n\n  var helperTextId = helperText && id ? \"\".concat(id, \"-helper-text\") : undefined;\n  var inputLabelId = label && id ? \"\".concat(id, \"-label\") : undefined;\n  var InputComponent = variantComponent[variant];\n  var InputElement = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-describedby\": helperTextId,\n    autoComplete: autoComplete,\n    autoFocus: autoFocus,\n    defaultValue: defaultValue,\n    fullWidth: fullWidth,\n    multiline: multiline,\n    name: name,\n    rows: rows,\n    rowsMax: rowsMax,\n    type: type,\n    value: value,\n    id: id,\n    inputRef: inputRef,\n    onBlur: onBlur,\n    onChange: onChange,\n    onFocus: onFocus,\n    placeholder: placeholder,\n    inputProps: inputProps\n  }, InputMore, InputProps));\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormControl__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n    disabled: disabled,\n    error: error,\n    fullWidth: fullWidth,\n    hiddenLabel: hiddenLabel,\n    ref: ref,\n    required: required,\n    color: color,\n    variant: variant\n  }, other), label && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputLabel__WEBPACK_IMPORTED_MODULE_9__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    htmlFor: id,\n    id: inputLabelId\n  }, InputLabelProps), label), select ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Select__WEBPACK_IMPORTED_MODULE_12__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-describedby\": helperTextId,\n    id: id,\n    labelId: inputLabelId,\n    value: value,\n    input: InputElement\n  }, SelectProps), children) : InputElement, helperText && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormHelperText__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    id: helperTextId\n  }, FormHelperTextProps), helperText));\n});\n true ? TextField.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default value of the `input` element.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Props applied to the [`FormHelperText`](/api/form-helper-text/) element.\n   */\n  FormHelperTextProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The helper text content.\n   */\n  helperText: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  hiddenLabel: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   * Use this prop to make `label` and `helperText` accessible for screen readers.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Props applied to the [`InputLabel`](/api/input-label/) element.\n   */\n  InputLabelProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Props applied to the Input element.\n   * It will be a [`FilledInput`](/api/filled-input/),\n   * [`OutlinedInput`](/api/outlined-input/) or [`Input`](/api/input/)\n   * component depending on the `variant` prop value.\n   */\n  InputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The label content.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `dense` or `normal`, will adjust vertical spacing of this and contained components.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none', 'normal']),\n\n  /**\n   * If `true`, a textarea element will be rendered instead of an input.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the label is displayed as required and the `input` element` will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Render a [`Select`](/api/select/) element while passing the Input element to `Select` as `input` parameter.\n   * If this option is set you must pass the options of the select as children.\n   */\n  select: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Props applied to the [`Select`](/api/select/) element.\n   */\n  SelectProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The size of the text field.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_13__[\"default\"])(styles, {\n  name: 'MuiTextField'\n})(TextField));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TextField__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextField */ \"./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _TextField__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js":
-/*!*********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js ***!
-  \*********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/debounce */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\nfunction getStyleValue(computedStyle, property) {\n  return parseInt(computedStyle[property], 10) || 0;\n}\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"];\nvar styles = {\n  /* Styles applied to the shadow textarea element. */\n  shadow: {\n    // Visibility needed to hide the extra text area on iPads\n    visibility: 'hidden',\n    // Remove from the content flow\n    position: 'absolute',\n    // Ignore the scrollbar width\n    overflow: 'hidden',\n    height: 0,\n    top: 0,\n    left: 0,\n    // Create a new layer, increase the isolation of the computed values\n    transform: 'translateZ(0)'\n  }\n};\nvar TextareaAutosize = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function TextareaAutosize(props, ref) {\n  var onChange = props.onChange,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      _props$rowsMin = props.rowsMin,\n      rowsMinProp = _props$rowsMin === void 0 ? 1 : _props$rowsMin,\n      style = props.style,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"onChange\", \"rows\", \"rowsMax\", \"rowsMin\", \"style\", \"value\"]);\n\n  var rowsMin = rows || rowsMinProp;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](value != null),\n      isControlled = _React$useRef.current;\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ref, inputRef);\n  var shadowRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var renders = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](0);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"]({}),\n      state = _React$useState[0],\n      setState = _React$useState[1];\n\n  var syncHeight = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    var input = inputRef.current;\n    var computedStyle = window.getComputedStyle(input);\n    var inputShallow = shadowRef.current;\n    inputShallow.style.width = computedStyle.width;\n    inputShallow.value = input.value || props.placeholder || 'x';\n\n    if (inputShallow.value.slice(-1) === '\\n') {\n      // Certain fonts which overflow the line height will cause the textarea\n      // to report a different scrollHeight depending on whether the last line\n      // is empty. Make it non-empty to avoid this issue.\n      inputShallow.value += ' ';\n    }\n\n    var boxSizing = computedStyle['box-sizing'];\n    var padding = getStyleValue(computedStyle, 'padding-bottom') + getStyleValue(computedStyle, 'padding-top');\n    var border = getStyleValue(computedStyle, 'border-bottom-width') + getStyleValue(computedStyle, 'border-top-width'); // The height of the inner content\n\n    var innerHeight = inputShallow.scrollHeight - padding; // Measure height of a textarea with a single row\n\n    inputShallow.value = 'x';\n    var singleRowHeight = inputShallow.scrollHeight - padding; // The height of the outer content\n\n    var outerHeight = innerHeight;\n\n    if (rowsMin) {\n      outerHeight = Math.max(Number(rowsMin) * singleRowHeight, outerHeight);\n    }\n\n    if (rowsMax) {\n      outerHeight = Math.min(Number(rowsMax) * singleRowHeight, outerHeight);\n    }\n\n    outerHeight = Math.max(outerHeight, singleRowHeight); // Take the box sizing into account for applying this value as a style.\n\n    var outerHeightStyle = outerHeight + (boxSizing === 'border-box' ? padding + border : 0);\n    var overflow = Math.abs(outerHeight - innerHeight) <= 1;\n    setState(function (prevState) {\n      // Need a large enough difference to update the height.\n      // This prevents infinite rendering loop.\n      if (renders.current < 20 && (outerHeightStyle > 0 && Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1 || prevState.overflow !== overflow)) {\n        renders.current += 1;\n        return {\n          overflow: overflow,\n          outerHeightStyle: outerHeightStyle\n        };\n      }\n\n      if (true) {\n        if (renders.current === 20) {\n          console.error(['Material-UI: Too many re-renders. The layout is unstable.', 'TextareaAutosize limits the number of renders to prevent an infinite loop.'].join('\\n'));\n        }\n      }\n\n      return prevState;\n    });\n  }, [rowsMax, rowsMin, props.placeholder]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    var handleResize = Object(_utils_debounce__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(function () {\n      renders.current = 0;\n      syncHeight();\n    });\n    window.addEventListener('resize', handleResize);\n    return function () {\n      handleResize.clear();\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [syncHeight]);\n  useEnhancedEffect(function () {\n    syncHeight();\n  });\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    renders.current = 0;\n  }, [value]);\n\n  var handleChange = function handleChange(event) {\n    renders.current = 0;\n\n    if (!isControlled) {\n      syncHeight();\n    }\n\n    if (onChange) {\n      onChange(event);\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"textarea\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    value: value,\n    onChange: handleChange,\n    ref: handleRef // Apply the rows prop to get a \"correct\" first SSR paint\n    ,\n    rows: rowsMin,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      height: state.outerHeightStyle,\n      // Need a large enough difference to allow scrolling.\n      // This prevents infinite rendering loop.\n      overflow: state.overflow ? 'hidden' : null\n    }, style)\n  }, other)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"textarea\", {\n    \"aria-hidden\": true,\n    className: props.className,\n    readOnly: true,\n    ref: shadowRef,\n    tabIndex: -1,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles.shadow, style)\n  }));\n});\n true ? TextareaAutosize.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Use `rowsMin` instead. The prop will be removed in v5.\n   *\n   * @deprecated\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Minimum number of rows to display.\n   */\n  rowsMin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (TextareaAutosize);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TextareaAutosize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextareaAutosize */ \"./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _TextareaAutosize__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js ***!
-  \*********************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      margin: 0\n    },\n\n    /* Styles applied to the root element if `variant=\"body2\"`. */\n    body2: theme.typography.body2,\n\n    /* Styles applied to the root element if `variant=\"body1\"`. */\n    body1: theme.typography.body1,\n\n    /* Styles applied to the root element if `variant=\"caption\"`. */\n    caption: theme.typography.caption,\n\n    /* Styles applied to the root element if `variant=\"button\"`. */\n    button: theme.typography.button,\n\n    /* Styles applied to the root element if `variant=\"h1\"`. */\n    h1: theme.typography.h1,\n\n    /* Styles applied to the root element if `variant=\"h2\"`. */\n    h2: theme.typography.h2,\n\n    /* Styles applied to the root element if `variant=\"h3\"`. */\n    h3: theme.typography.h3,\n\n    /* Styles applied to the root element if `variant=\"h4\"`. */\n    h4: theme.typography.h4,\n\n    /* Styles applied to the root element if `variant=\"h5\"`. */\n    h5: theme.typography.h5,\n\n    /* Styles applied to the root element if `variant=\"h6\"`. */\n    h6: theme.typography.h6,\n\n    /* Styles applied to the root element if `variant=\"subtitle1\"`. */\n    subtitle1: theme.typography.subtitle1,\n\n    /* Styles applied to the root element if `variant=\"subtitle2\"`. */\n    subtitle2: theme.typography.subtitle2,\n\n    /* Styles applied to the root element if `variant=\"overline\"`. */\n    overline: theme.typography.overline,\n\n    /* Styles applied to the root element if `variant=\"srOnly\"`. Only accessible to screen readers. */\n    srOnly: {\n      position: 'absolute',\n      height: 1,\n      width: 1,\n      overflow: 'hidden'\n    },\n\n    /* Styles applied to the root element if `align=\"left\"`. */\n    alignLeft: {\n      textAlign: 'left'\n    },\n\n    /* Styles applied to the root element if `align=\"center\"`. */\n    alignCenter: {\n      textAlign: 'center'\n    },\n\n    /* Styles applied to the root element if `align=\"right\"`. */\n    alignRight: {\n      textAlign: 'right'\n    },\n\n    /* Styles applied to the root element if `align=\"justify\"`. */\n    alignJustify: {\n      textAlign: 'justify'\n    },\n\n    /* Styles applied to the root element if `nowrap={true}`. */\n    noWrap: {\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap'\n    },\n\n    /* Styles applied to the root element if `gutterBottom={true}`. */\n    gutterBottom: {\n      marginBottom: '0.35em'\n    },\n\n    /* Styles applied to the root element if `paragraph={true}`. */\n    paragraph: {\n      marginBottom: 16\n    },\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the root element if `color=\"textPrimary\"`. */\n    colorTextPrimary: {\n      color: theme.palette.text.primary\n    },\n\n    /* Styles applied to the root element if `color=\"textSecondary\"`. */\n    colorTextSecondary: {\n      color: theme.palette.text.secondary\n    },\n\n    /* Styles applied to the root element if `color=\"error\"`. */\n    colorError: {\n      color: theme.palette.error.main\n    },\n\n    /* Styles applied to the root element if `display=\"inline\"`. */\n    displayInline: {\n      display: 'inline'\n    },\n\n    /* Styles applied to the root element if `display=\"block\"`. */\n    displayBlock: {\n      display: 'block'\n    }\n  };\n};\nvar defaultVariantMapping = {\n  h1: 'h1',\n  h2: 'h2',\n  h3: 'h3',\n  h4: 'h4',\n  h5: 'h5',\n  h6: 'h6',\n  subtitle1: 'h6',\n  subtitle2: 'h6',\n  body1: 'p',\n  body2: 'p'\n};\nvar Typography = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Typography(props, ref) {\n  var _props$align = props.align,\n      align = _props$align === void 0 ? 'inherit' : _props$align,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'initial' : _props$color,\n      component = props.component,\n      _props$display = props.display,\n      display = _props$display === void 0 ? 'initial' : _props$display,\n      _props$gutterBottom = props.gutterBottom,\n      gutterBottom = _props$gutterBottom === void 0 ? false : _props$gutterBottom,\n      _props$noWrap = props.noWrap,\n      noWrap = _props$noWrap === void 0 ? false : _props$noWrap,\n      _props$paragraph = props.paragraph,\n      paragraph = _props$paragraph === void 0 ? false : _props$paragraph,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'body1' : _props$variant,\n      _props$variantMapping = props.variantMapping,\n      variantMapping = _props$variantMapping === void 0 ? defaultVariantMapping : _props$variantMapping,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"align\", \"classes\", \"className\", \"color\", \"component\", \"display\", \"gutterBottom\", \"noWrap\", \"paragraph\", \"variant\", \"variantMapping\"]);\n\n  var Component = component || (paragraph ? 'p' : variantMapping[variant] || defaultVariantMapping[variant]) || 'span';\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, variant !== 'inherit' && classes[variant], color !== 'initial' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color))], noWrap && classes.noWrap, gutterBottom && classes.gutterBottom, paragraph && classes.paragraph, align !== 'inherit' && classes[\"align\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(align))], display !== 'initial' && classes[\"display\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(display))]),\n    ref: ref\n  }, other));\n});\n true ? Typography.propTypes = {\n  /**\n   * Set the text-align on the component.\n   */\n  align: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   * Overrides the behavior of the `variantMapping` prop.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Controls the display type\n   */\n  display: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'block', 'inline']),\n\n  /**\n   * If `true`, the text will have a bottom margin.\n   */\n  gutterBottom: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the text will not wrap, but instead will truncate with a text overflow ellipsis.\n   *\n   * Note that text overflow can only happen with block or inline-block level elements\n   * (the element needs to have a width in order to overflow).\n   */\n  noWrap: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the text will have a bottom margin.\n   */\n  paragraph: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Applies the theme typography styles.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption', 'button', 'overline', 'srOnly', 'inherit']),\n\n  /**\n   * The component maps the variant prop to a range of different HTML element types.\n   * For instance, subtitle1 to `<h6>`.\n   * If you wish to change that mapping, you can provide your own.\n   * Alternatively, you can use the `component` prop.\n   */\n  variantMapping: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiTypography'\n})(Typography));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Typography__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js":
-/*!*************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js ***!
-  \*************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* eslint-disable consistent-return, jsx-a11y/no-noninteractive-tabindex, camelcase */\n\n\n\n\n\n\n/**\n * Utility component that locks focus inside the component.\n */\n\nfunction Unstable_TrapFocus(props) {\n  var children = props.children,\n      _props$disableAutoFoc = props.disableAutoFocus,\n      disableAutoFocus = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$disableEnforce = props.disableEnforceFocus,\n      disableEnforceFocus = _props$disableEnforce === void 0 ? false : _props$disableEnforce,\n      _props$disableRestore = props.disableRestoreFocus,\n      disableRestoreFocus = _props$disableRestore === void 0 ? false : _props$disableRestore,\n      getDoc = props.getDoc,\n      isEnabled = props.isEnabled,\n      open = props.open;\n  var ignoreNextEnforceFocus = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  var sentinelStart = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null);\n  var sentinelEnd = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null);\n  var nodeToRestore = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  var rootRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null); // can be removed once we drop support for non ref forwarding class components\n\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    rootRef.current = react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(children.ref, handleOwnRef);\n  var prevOpenRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n    prevOpenRef.current = open;\n  }, [open]);\n\n  if (!prevOpenRef.current && open && typeof window !== 'undefined') {\n    // WARNING: Potentially unsafe in concurrent mode.\n    // The way the read on `nodeToRestore` is setup could make this actually safe.\n    // Say we render `open={false}` -> `open={true}` but never commit.\n    // We have now written a state that wasn't committed. But no committed effect\n    // will read this wrong value. We only read from `nodeToRestore` in effects\n    // that were committed on `open={true}`\n    // WARNING: Prevents the instance from being garbage collected. Should only\n    // hold a weak ref.\n    nodeToRestore.current = getDoc().activeElement;\n  }\n\n  react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n    if (!open) {\n      return;\n    }\n\n    var doc = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(rootRef.current); // We might render an empty child.\n\n    if (!disableAutoFocus && rootRef.current && !rootRef.current.contains(doc.activeElement)) {\n      if (!rootRef.current.hasAttribute('tabIndex')) {\n        if (true) {\n          console.error(['Material-UI: The modal content node does not accept focus.', 'For the benefit of assistive technologies, ' + 'the tabIndex of the node is being set to \"-1\".'].join('\\n'));\n        }\n\n        rootRef.current.setAttribute('tabIndex', -1);\n      }\n\n      rootRef.current.focus();\n    }\n\n    var contain = function contain() {\n      if (!doc.hasFocus() || disableEnforceFocus || !isEnabled() || ignoreNextEnforceFocus.current) {\n        ignoreNextEnforceFocus.current = false;\n        return;\n      }\n\n      if (rootRef.current && !rootRef.current.contains(doc.activeElement)) {\n        rootRef.current.focus();\n      }\n    };\n\n    var loopFocus = function loopFocus(event) {\n      // 9 = Tab\n      if (disableEnforceFocus || !isEnabled() || event.keyCode !== 9) {\n        return;\n      } // Make sure the next tab starts from the right place.\n\n\n      if (doc.activeElement === rootRef.current) {\n        // We need to ignore the next contain as\n        // it will try to move the focus back to the rootRef element.\n        ignoreNextEnforceFocus.current = true;\n\n        if (event.shiftKey) {\n          sentinelEnd.current.focus();\n        } else {\n          sentinelStart.current.focus();\n        }\n      }\n    };\n\n    doc.addEventListener('focus', contain, true);\n    doc.addEventListener('keydown', loopFocus, true); // With Edge, Safari and Firefox, no focus related events are fired when the focused area stops being a focused area\n    // e.g. https://bugzilla.mozilla.org/show_bug.cgi?id=559561.\n    //\n    // The whatwg spec defines how the browser should behave but does not explicitly mention any events:\n    // https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule.\n\n    var interval = setInterval(function () {\n      contain();\n    }, 50);\n    return function () {\n      clearInterval(interval);\n      doc.removeEventListener('focus', contain, true);\n      doc.removeEventListener('keydown', loopFocus, true); // restoreLastFocus()\n\n      if (!disableRestoreFocus) {\n        // In IE 11 it is possible for document.activeElement to be null resulting\n        // in nodeToRestore.current being null.\n        // Not all elements in IE 11 have a focus method.\n        // Once IE 11 support is dropped the focus() call can be unconditional.\n        if (nodeToRestore.current && nodeToRestore.current.focus) {\n          nodeToRestore.current.focus();\n        }\n\n        nodeToRestore.current = null;\n      }\n    };\n  }, [disableAutoFocus, disableEnforceFocus, disableRestoreFocus, isEnabled, open]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"div\", {\n    tabIndex: 0,\n    ref: sentinelStart,\n    \"data-test\": \"sentinelStart\"\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"](children, {\n    ref: handleRef\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"div\", {\n    tabIndex: 0,\n    ref: sentinelEnd,\n    \"data-test\": \"sentinelEnd\"\n  }));\n}\n\n true ? Unstable_TrapFocus.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * If `true`, the trap focus will not automatically shift focus to itself when it opens, and\n   * replace it to the last focused element when it closes.\n   * This also works correctly with any trap focus children that have the `disableAutoFocus` prop.\n   *\n   * Generally this should never be set to `true` as it makes the trap focus less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableAutoFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * If `true`, the trap focus will not prevent focus from leaving the trap focus while open.\n   *\n   * Generally this should never be set to `true` as it makes the trap focus less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableEnforceFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * If `true`, the trap focus will not restore focus to previously focused element once\n   * trap focus is hidden.\n   */\n  disableRestoreFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Return the document to consider.\n   * We use it to implement the restore focus between different browser documents.\n   */\n  getDoc: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,\n\n  /**\n   * Do we still want to enforce the focus?\n   * This prop helps nesting TrapFocus elements.\n   */\n  isEnabled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,\n\n  /**\n   * If `true`, focus will be locked.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  Unstable_TrapFocus['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"exactProp\"])(Unstable_TrapFocus.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Unstable_TrapFocus);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Unstable_TrapFocus */ \"./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar blue = {\n  50: '#e3f2fd',\n  100: '#bbdefb',\n  200: '#90caf9',\n  300: '#64b5f6',\n  400: '#42a5f5',\n  500: '#2196f3',\n  600: '#1e88e5',\n  700: '#1976d2',\n  800: '#1565c0',\n  900: '#0d47a1',\n  A100: '#82b1ff',\n  A200: '#448aff',\n  A400: '#2979ff',\n  A700: '#2962ff'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (blue);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/common.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/common.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar common = {\n  black: '#000',\n  white: '#fff'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (common);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/common.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/green.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/green.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar green = {\n  50: '#e8f5e9',\n  100: '#c8e6c9',\n  200: '#a5d6a7',\n  300: '#81c784',\n  400: '#66bb6a',\n  500: '#4caf50',\n  600: '#43a047',\n  700: '#388e3c',\n  800: '#2e7d32',\n  900: '#1b5e20',\n  A100: '#b9f6ca',\n  A200: '#69f0ae',\n  A400: '#00e676',\n  A700: '#00c853'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (green);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/green.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar grey = {\n  50: '#fafafa',\n  100: '#f5f5f5',\n  200: '#eeeeee',\n  300: '#e0e0e0',\n  400: '#bdbdbd',\n  500: '#9e9e9e',\n  600: '#757575',\n  700: '#616161',\n  800: '#424242',\n  900: '#212121',\n  A100: '#d5d5d5',\n  A200: '#aaaaaa',\n  A400: '#303030',\n  A700: '#616161'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (grey);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar indigo = {\n  50: '#e8eaf6',\n  100: '#c5cae9',\n  200: '#9fa8da',\n  300: '#7986cb',\n  400: '#5c6bc0',\n  500: '#3f51b5',\n  600: '#3949ab',\n  700: '#303f9f',\n  800: '#283593',\n  900: '#1a237e',\n  A100: '#8c9eff',\n  A200: '#536dfe',\n  A400: '#3d5afe',\n  A700: '#304ffe'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (indigo);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar orange = {\n  50: '#fff3e0',\n  100: '#ffe0b2',\n  200: '#ffcc80',\n  300: '#ffb74d',\n  400: '#ffa726',\n  500: '#ff9800',\n  600: '#fb8c00',\n  700: '#f57c00',\n  800: '#ef6c00',\n  900: '#e65100',\n  A100: '#ffd180',\n  A200: '#ffab40',\n  A400: '#ff9100',\n  A700: '#ff6d00'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (orange);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar pink = {\n  50: '#fce4ec',\n  100: '#f8bbd0',\n  200: '#f48fb1',\n  300: '#f06292',\n  400: '#ec407a',\n  500: '#e91e63',\n  600: '#d81b60',\n  700: '#c2185b',\n  800: '#ad1457',\n  900: '#880e4f',\n  A100: '#ff80ab',\n  A200: '#ff4081',\n  A400: '#f50057',\n  A700: '#c51162'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (pink);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/red.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/red.js ***!
-  \**********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar red = {\n  50: '#ffebee',\n  100: '#ffcdd2',\n  200: '#ef9a9a',\n  300: '#e57373',\n  400: '#ef5350',\n  500: '#f44336',\n  600: '#e53935',\n  700: '#d32f2f',\n  800: '#c62828',\n  900: '#b71c1c',\n  A100: '#ff8a80',\n  A200: '#ff5252',\n  A400: '#ff1744',\n  A700: '#d50000'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (red);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/red.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js ***!
-  \*******************************************************************************/
-/*! exports provided: styles, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/useControlled */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../IconButton */ \"./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js\");\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  root: {\n    padding: 9\n  },\n  checked: {},\n  disabled: {},\n  input: {\n    cursor: 'inherit',\n    position: 'absolute',\n    opacity: 0,\n    width: '100%',\n    height: '100%',\n    top: 0,\n    left: 0,\n    margin: 0,\n    padding: 0,\n    zIndex: 1\n  }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SwitchBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function SwitchBase(props, ref) {\n  var autoFocus = props.autoFocus,\n      checkedProp = props.checked,\n      checkedIcon = props.checkedIcon,\n      classes = props.classes,\n      className = props.className,\n      defaultChecked = props.defaultChecked,\n      disabledProp = props.disabled,\n      icon = props.icon,\n      id = props.id,\n      inputProps = props.inputProps,\n      inputRef = props.inputRef,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onFocus = props.onFocus,\n      readOnly = props.readOnly,\n      required = props.required,\n      tabIndex = props.tabIndex,\n      type = props.type,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"autoFocus\", \"checked\", \"checkedIcon\", \"classes\", \"className\", \"defaultChecked\", \"disabled\", \"icon\", \"id\", \"inputProps\", \"inputRef\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"readOnly\", \"required\", \"tabIndex\", \"type\", \"value\"]);\n\n  var _useControlled = Object(_utils_useControlled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({\n    controlled: checkedProp,\n    default: Boolean(defaultChecked),\n    name: 'SwitchBase',\n    state: 'checked'\n  }),\n      _useControlled2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_useControlled, 2),\n      checked = _useControlled2[0],\n      setCheckedState = _useControlled2[1];\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_8__[\"default\"])();\n\n  var handleFocus = function handleFocus(event) {\n    if (onFocus) {\n      onFocus(event);\n    }\n\n    if (muiFormControl && muiFormControl.onFocus) {\n      muiFormControl.onFocus(event);\n    }\n  };\n\n  var handleBlur = function handleBlur(event) {\n    if (onBlur) {\n      onBlur(event);\n    }\n\n    if (muiFormControl && muiFormControl.onBlur) {\n      muiFormControl.onBlur(event);\n    }\n  };\n\n  var handleInputChange = function handleInputChange(event) {\n    var newChecked = event.target.checked;\n    setCheckedState(newChecked);\n\n    if (onChange) {\n      // TODO v5: remove the second argument.\n      onChange(event, newChecked);\n    }\n  };\n\n  var disabled = disabledProp;\n\n  if (muiFormControl) {\n    if (typeof disabled === 'undefined') {\n      disabled = muiFormControl.disabled;\n    }\n  }\n\n  var hasLabelFor = type === 'checkbox' || type === 'radio';\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_IconButton__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    component: \"span\",\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, checked && classes.checked, disabled && classes.disabled),\n    disabled: disabled,\n    tabIndex: null,\n    role: undefined,\n    onFocus: handleFocus,\n    onBlur: handleBlur,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"input\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    autoFocus: autoFocus,\n    checked: checkedProp,\n    defaultChecked: defaultChecked,\n    className: classes.input,\n    disabled: disabled,\n    id: hasLabelFor && id,\n    name: name,\n    onChange: handleInputChange,\n    readOnly: readOnly,\n    ref: inputRef,\n    required: required,\n    tabIndex: tabIndex,\n    type: type,\n    value: value\n  }, inputProps)), checked ? checkedIcon : icon);\n}); // NB: If changed, please update Checkbox, Switch and Radio\n// so that the API documentation is updated.\n\n true ? SwitchBase.propTypes = {\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the component is checked.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The icon to display when the component is checked.\n   */\n  checkedIcon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  defaultChecked: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the switch will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The icon to display when the component is unchecked.\n   */\n  icon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /*\n   * @ignore\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * The input component prop `type`.\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string.isRequired,\n\n  /**\n   * The value of the component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(styles, {\n  name: 'PrivateSwitchBase'\n})(SwitchBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js":
-/*!********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js ***!
-  \********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M7 10l5 5 5-5z\"\n}), 'ArrowDropDown'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckBox'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js":
-/*!***************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js ***!
-  \***************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n}), 'CheckBoxOutlineBlank'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js":
-/*!****************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js ***!
-  \****************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z\"\n}), 'IndeterminateCheckBox'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js ***!
-  \*************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"\n}), 'Person'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js ***!
-  \***********************************************************************************/
-/*! exports provided: hexToRgb, rgbToHex, hslToRgb, decomposeColor, recomposeColor, getContrastRatio, getLuminance, emphasize, fade, darken, lighten */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hexToRgb\", function() { return hexToRgb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"rgbToHex\", function() { return rgbToHex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hslToRgb\", function() { return hslToRgb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"decomposeColor\", function() { return decomposeColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"recomposeColor\", function() { return recomposeColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getContrastRatio\", function() { return getContrastRatio; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getLuminance\", function() { return getLuminance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"emphasize\", function() { return emphasize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fade\", function() { return fade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"darken\", function() { return darken; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lighten\", function() { return lighten; });\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n/* eslint-disable no-use-before-define */\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * @param {number} value The value to be clamped\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns {number} A number in the range [min, max]\n */\nfunction clamp(value) {\n  var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n  if (true) {\n    if (value < min || value > max) {\n      console.error(\"Material-UI: The value provided \".concat(value, \" is out of range [\").concat(min, \", \").concat(max, \"].\"));\n    }\n  }\n\n  return Math.min(Math.max(min, value), max);\n}\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n *\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\n * @returns {string} A CSS rgb color string\n */\n\n\nfunction hexToRgb(color) {\n  color = color.substr(1);\n  var re = new RegExp(\".{1,\".concat(color.length >= 6 ? 2 : 1, \"}\"), 'g');\n  var colors = color.match(re);\n\n  if (colors && colors[0].length === 1) {\n    colors = colors.map(function (n) {\n      return n + n;\n    });\n  }\n\n  return colors ? \"rgb\".concat(colors.length === 4 ? 'a' : '', \"(\").concat(colors.map(function (n, index) {\n    return index < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1000) / 1000;\n  }).join(', '), \")\") : '';\n}\n\nfunction intToHex(int) {\n  var hex = int.toString(16);\n  return hex.length === 1 ? \"0\".concat(hex) : hex;\n}\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n *\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\n */\n\n\nfunction rgbToHex(color) {\n  // Idempotent\n  if (color.indexOf('#') === 0) {\n    return color;\n  }\n\n  var _decomposeColor = decomposeColor(color),\n      values = _decomposeColor.values;\n\n  return \"#\".concat(values.map(function (n) {\n    return intToHex(n);\n  }).join(''));\n}\n/**\n * Converts a color from hsl format to rgb format.\n *\n * @param {string} color - HSL color values\n * @returns {string} rgb color values\n */\n\nfunction hslToRgb(color) {\n  color = decomposeColor(color);\n  var _color = color,\n      values = _color.values;\n  var h = values[0];\n  var s = values[1] / 100;\n  var l = values[2] / 100;\n  var a = s * Math.min(l, 1 - l);\n\n  var f = function f(n) {\n    var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 30) % 12;\n    return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  };\n\n  var type = 'rgb';\n  var rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n\n  if (color.type === 'hsla') {\n    type += 'a';\n    rgb.push(values[3]);\n  }\n\n  return recomposeColor({\n    type: type,\n    values: rgb\n  });\n}\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n */\n\nfunction decomposeColor(color) {\n  // Idempotent\n  if (color.type) {\n    return color;\n  }\n\n  if (color.charAt(0) === '#') {\n    return decomposeColor(hexToRgb(color));\n  }\n\n  var marker = color.indexOf('(');\n  var type = color.substring(0, marker);\n\n  if (['rgb', 'rgba', 'hsl', 'hsla'].indexOf(type) === -1) {\n    throw new Error( true ? \"Material-UI: Unsupported `\".concat(color, \"` color.\\nWe support the following formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla().\") : undefined);\n  }\n\n  var values = color.substring(marker + 1, color.length - 1).split(',');\n  values = values.map(function (value) {\n    return parseFloat(value);\n  });\n  return {\n    type: type,\n    values: values\n  };\n}\n/**\n * Converts a color object with type and values to a string.\n *\n * @param {object} color - Decomposed color\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns {string} A CSS color string\n */\n\nfunction recomposeColor(color) {\n  var type = color.type;\n  var values = color.values;\n\n  if (type.indexOf('rgb') !== -1) {\n    // Only convert the first 3 values to int (i.e. not alpha)\n    values = values.map(function (n, i) {\n      return i < 3 ? parseInt(n, 10) : n;\n    });\n  } else if (type.indexOf('hsl') !== -1) {\n    values[1] = \"\".concat(values[1], \"%\");\n    values[2] = \"\".concat(values[2], \"%\");\n  }\n\n  return \"\".concat(type, \"(\").concat(values.join(', '), \")\");\n}\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} A contrast ratio value in the range 0 - 21.\n */\n\nfunction getContrastRatio(foreground, background) {\n  var lumA = getLuminance(foreground);\n  var lumB = getLuminance(background);\n  return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} The relative brightness of the color in the range 0 - 1\n */\n\nfunction getLuminance(color) {\n  color = decomposeColor(color);\n  var rgb = color.type === 'hsl' ? decomposeColor(hslToRgb(color)).values : color.values;\n  rgb = rgb.map(function (val) {\n    val /= 255; // normalized\n\n    return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n  }); // Truncate at 3 digits\n\n  return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n}\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction emphasize(color) {\n  var coefficient = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n  return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n/**\n * Set the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} value - value to set the alpha channel to in the range 0 -1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction fade(color, value) {\n  color = decomposeColor(color);\n  value = clamp(value);\n\n  if (color.type === 'rgb' || color.type === 'hsl') {\n    color.type += 'a';\n  }\n\n  color.values[3] = value;\n  return recomposeColor(color);\n}\n/**\n * Darkens a color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction darken(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (color.type.indexOf('hsl') !== -1) {\n    color.values[2] *= 1 - coefficient;\n  } else if (color.type.indexOf('rgb') !== -1) {\n    for (var i = 0; i < 3; i += 1) {\n      color.values[i] *= 1 - coefficient;\n    }\n  }\n\n  return recomposeColor(color);\n}\n/**\n * Lightens a color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction lighten(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (color.type.indexOf('hsl') !== -1) {\n    color.values[2] += (100 - color.values[2]) * coefficient;\n  } else if (color.type.indexOf('rgb') !== -1) {\n    for (var i = 0; i < 3; i += 1) {\n      color.values[i] += (255 - color.values[i]) * coefficient;\n    }\n  }\n\n  return recomposeColor(color);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js ***!
-  \************************************************************************************/
-/*! exports provided: keys, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keys\", function() { return keys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createBreakpoints; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n\n\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nvar keys = ['xs', 'sm', 'md', 'lg', 'xl']; // Keep in mind that @media is inclusive by the CSS specification.\n\nfunction createBreakpoints(breakpoints) {\n  var _breakpoints$values = breakpoints.values,\n      values = _breakpoints$values === void 0 ? {\n    xs: 0,\n    sm: 600,\n    md: 960,\n    lg: 1280,\n    xl: 1920\n  } : _breakpoints$values,\n      _breakpoints$unit = breakpoints.unit,\n      unit = _breakpoints$unit === void 0 ? 'px' : _breakpoints$unit,\n      _breakpoints$step = breakpoints.step,\n      step = _breakpoints$step === void 0 ? 5 : _breakpoints$step,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(breakpoints, [\"values\", \"unit\", \"step\"]);\n\n  function up(key) {\n    var value = typeof values[key] === 'number' ? values[key] : key;\n    return \"@media (min-width:\".concat(value).concat(unit, \")\");\n  }\n\n  function down(key) {\n    var endIndex = keys.indexOf(key) + 1;\n    var upperbound = values[keys[endIndex]];\n\n    if (endIndex === keys.length) {\n      // xl down applies to all sizes\n      return up('xs');\n    }\n\n    var value = typeof upperbound === 'number' && endIndex > 0 ? upperbound : key;\n    return \"@media (max-width:\".concat(value - step / 100).concat(unit, \")\");\n  }\n\n  function between(start, end) {\n    var endIndex = keys.indexOf(end);\n\n    if (endIndex === keys.length - 1) {\n      return up(start);\n    }\n\n    return \"@media (min-width:\".concat(typeof values[start] === 'number' ? values[start] : start).concat(unit, \") and \") + \"(max-width:\".concat((endIndex !== -1 && typeof values[keys[endIndex + 1]] === 'number' ? values[keys[endIndex + 1]] : end) - step / 100).concat(unit, \")\");\n  }\n\n  function only(key) {\n    return between(key, key);\n  }\n\n  function width(key) {\n    return values[key];\n  }\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    keys: keys,\n    values: values,\n    up: up,\n    down: down,\n    between: between,\n    only: only,\n    width: width\n  }, other);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createMixins; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n\n\nfunction createMixins(breakpoints, spacing, mixins) {\n  var _toolbar;\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    gutters: function gutters() {\n      var styles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      // To deprecate in v4.1\n      //       warning(\n      //         false,\n      //         [\n      //           'Material-UI: Theme.mixins.gutters() is deprecated.',\n      //           'You can use the source of the mixin directly:',\n      //           `\n      // paddingLeft: theme.spacing(2),\n      // paddingRight: theme.spacing(2),\n      // [theme.breakpoints.up('sm')]: {\n      //   paddingLeft: theme.spacing(3),\n      //   paddingRight: theme.spacing(3),\n      // },\n      // `,\n      //         ].join('\\n'),\n      //       );\n      return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        paddingLeft: spacing(2),\n        paddingRight: spacing(2)\n      }, styles, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, breakpoints.up('sm'), Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        paddingLeft: spacing(3),\n        paddingRight: spacing(3)\n      }, styles[breakpoints.up('sm')])));\n    },\n    toolbar: (_toolbar = {\n      minHeight: 56\n    }, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_toolbar, \"\".concat(breakpoints.up('xs'), \" and (orientation: landscape)\"), {\n      minHeight: 48\n    }), Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_toolbar, breakpoints.up('sm'), {\n      minHeight: 64\n    }), _toolbar)\n  }, mixins);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createBreakpoints__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createBreakpoints */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js\");\n/* harmony import */ var _createMixins__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./createMixins */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js\");\n/* harmony import */ var _createPalette__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createPalette */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js\");\n/* harmony import */ var _createTypography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./createTypography */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js\");\n/* harmony import */ var _shadows__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shadows */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js\");\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./shape */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js\");\n/* harmony import */ var _createSpacing__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./createSpacing */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js\");\n/* harmony import */ var _transitions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _zIndex__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./zIndex */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction createMuiTheme() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var _options$breakpoints = options.breakpoints,\n      breakpointsInput = _options$breakpoints === void 0 ? {} : _options$breakpoints,\n      _options$mixins = options.mixins,\n      mixinsInput = _options$mixins === void 0 ? {} : _options$mixins,\n      _options$palette = options.palette,\n      paletteInput = _options$palette === void 0 ? {} : _options$palette,\n      spacingInput = options.spacing,\n      _options$typography = options.typography,\n      typographyInput = _options$typography === void 0 ? {} : _options$typography,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"breakpoints\", \"mixins\", \"palette\", \"spacing\", \"typography\"]);\n\n  var palette = Object(_createPalette__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(paletteInput);\n  var breakpoints = Object(_createBreakpoints__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(breakpointsInput);\n  var spacing = Object(_createSpacing__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(spacingInput);\n  var muiTheme = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])({\n    breakpoints: breakpoints,\n    direction: 'ltr',\n    mixins: Object(_createMixins__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(breakpoints, spacing, mixinsInput),\n    overrides: {},\n    // Inject custom styles\n    palette: palette,\n    props: {},\n    // Provide default props\n    shadows: _shadows__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n    typography: Object(_createTypography__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(palette, typographyInput),\n    spacing: spacing,\n    shape: _shape__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n    transitions: _transitions__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n    zIndex: _zIndex__WEBPACK_IMPORTED_MODULE_11__[\"default\"]\n  }, other);\n\n  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    args[_key - 1] = arguments[_key];\n  }\n\n  muiTheme = args.reduce(function (acc, argument) {\n    return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(acc, argument);\n  }, muiTheme);\n\n  if (true) {\n    var pseudoClasses = ['checked', 'disabled', 'error', 'focused', 'focusVisible', 'required', 'expanded', 'selected'];\n\n    var traverse = function traverse(node, parentKey) {\n      var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n      var key; // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n      for (key in node) {\n        var child = node[key];\n\n        if (depth === 1) {\n          if (key.indexOf('Mui') === 0 && child) {\n            traverse(child, key, depth + 1);\n          }\n        } else if (pseudoClasses.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n          if (true) {\n            console.error([\"Material-UI: The `\".concat(parentKey, \"` component increases \") + \"the CSS specificity of the `\".concat(key, \"` internal state.\"), 'You can not override it like this: ', JSON.stringify(node, null, 2), '', 'Instead, you need to use the $ruleName syntax:', JSON.stringify({\n              root: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, \"&$\".concat(key), child)\n            }, null, 2), '', 'https://material-ui.com/r/pseudo-classes-guide'].join('\\n'));\n          } // Remove the style to prevent global conflicts.\n\n\n          node[key] = {};\n        }\n      }\n    };\n\n    traverse(muiTheme.overrides);\n  }\n\n  return muiTheme;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createMuiTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js ***!
-  \********************************************************************************/
-/*! exports provided: light, dark, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"light\", function() { return light; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dark\", function() { return dark; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createPalette; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _colors_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../colors/common */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/common.js\");\n/* harmony import */ var _colors_grey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../colors/grey */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js\");\n/* harmony import */ var _colors_indigo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../colors/indigo */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js\");\n/* harmony import */ var _colors_pink__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../colors/pink */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js\");\n/* harmony import */ var _colors_red__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../colors/red */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/red.js\");\n/* harmony import */ var _colors_orange__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../colors/orange */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js\");\n/* harmony import */ var _colors_blue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../colors/blue */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js\");\n/* harmony import */ var _colors_green__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../colors/green */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/green.js\");\n/* harmony import */ var _colorManipulator__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar light = {\n  // The colors used to style the text.\n  text: {\n    // The most important text.\n    primary: 'rgba(0, 0, 0, 0.87)',\n    // Secondary text.\n    secondary: 'rgba(0, 0, 0, 0.54)',\n    // Disabled text have even lower visual prominence.\n    disabled: 'rgba(0, 0, 0, 0.38)',\n    // Text hints.\n    hint: 'rgba(0, 0, 0, 0.38)'\n  },\n  // The color used to divide different elements.\n  divider: 'rgba(0, 0, 0, 0.12)',\n  // The background colors used to style the surfaces.\n  // Consistency between these values is important.\n  background: {\n    paper: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    default: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"][50]\n  },\n  // The colors used to style the action elements.\n  action: {\n    // The color of an active action like an icon button.\n    active: 'rgba(0, 0, 0, 0.54)',\n    // The color of an hovered action.\n    hover: 'rgba(0, 0, 0, 0.04)',\n    hoverOpacity: 0.04,\n    // The color of a selected action.\n    selected: 'rgba(0, 0, 0, 0.08)',\n    selectedOpacity: 0.08,\n    // The color of a disabled action.\n    disabled: 'rgba(0, 0, 0, 0.26)',\n    // The background color of a disabled action.\n    disabledBackground: 'rgba(0, 0, 0, 0.12)',\n    disabledOpacity: 0.38,\n    focus: 'rgba(0, 0, 0, 0.12)',\n    focusOpacity: 0.12,\n    activatedOpacity: 0.12\n  }\n};\nvar dark = {\n  text: {\n    primary: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    secondary: 'rgba(255, 255, 255, 0.7)',\n    disabled: 'rgba(255, 255, 255, 0.5)',\n    hint: 'rgba(255, 255, 255, 0.5)',\n    icon: 'rgba(255, 255, 255, 0.5)'\n  },\n  divider: 'rgba(255, 255, 255, 0.12)',\n  background: {\n    paper: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"][800],\n    default: '#303030'\n  },\n  action: {\n    active: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    hover: 'rgba(255, 255, 255, 0.08)',\n    hoverOpacity: 0.08,\n    selected: 'rgba(255, 255, 255, 0.16)',\n    selectedOpacity: 0.16,\n    disabled: 'rgba(255, 255, 255, 0.3)',\n    disabledBackground: 'rgba(255, 255, 255, 0.12)',\n    disabledOpacity: 0.38,\n    focus: 'rgba(255, 255, 255, 0.12)',\n    focusOpacity: 0.12,\n    activatedOpacity: 0.24\n  }\n};\n\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n  var tonalOffsetLight = tonalOffset.light || tonalOffset;\n  var tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n\n  if (!intent[direction]) {\n    if (intent.hasOwnProperty(shade)) {\n      intent[direction] = intent[shade];\n    } else if (direction === 'light') {\n      intent.light = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"lighten\"])(intent.main, tonalOffsetLight);\n    } else if (direction === 'dark') {\n      intent.dark = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"darken\"])(intent.main, tonalOffsetDark);\n    }\n  }\n}\n\nfunction createPalette(palette) {\n  var _palette$primary = palette.primary,\n      primary = _palette$primary === void 0 ? {\n    light: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][300],\n    main: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][500],\n    dark: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][700]\n  } : _palette$primary,\n      _palette$secondary = palette.secondary,\n      secondary = _palette$secondary === void 0 ? {\n    light: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A200,\n    main: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A400,\n    dark: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A700\n  } : _palette$secondary,\n      _palette$error = palette.error,\n      error = _palette$error === void 0 ? {\n    light: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][300],\n    main: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][500],\n    dark: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][700]\n  } : _palette$error,\n      _palette$warning = palette.warning,\n      warning = _palette$warning === void 0 ? {\n    light: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][300],\n    main: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][500],\n    dark: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][700]\n  } : _palette$warning,\n      _palette$info = palette.info,\n      info = _palette$info === void 0 ? {\n    light: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][300],\n    main: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][500],\n    dark: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][700]\n  } : _palette$info,\n      _palette$success = palette.success,\n      success = _palette$success === void 0 ? {\n    light: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][300],\n    main: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][500],\n    dark: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][700]\n  } : _palette$success,\n      _palette$type = palette.type,\n      type = _palette$type === void 0 ? 'light' : _palette$type,\n      _palette$contrastThre = palette.contrastThreshold,\n      contrastThreshold = _palette$contrastThre === void 0 ? 3 : _palette$contrastThre,\n      _palette$tonalOffset = palette.tonalOffset,\n      tonalOffset = _palette$tonalOffset === void 0 ? 0.2 : _palette$tonalOffset,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(palette, [\"primary\", \"secondary\", \"error\", \"warning\", \"info\", \"success\", \"type\", \"contrastThreshold\", \"tonalOffset\"]); // Use the same logic as\n  // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n  // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n\n\n  function getContrastText(background) {\n    var contrastText = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"getContrastRatio\"])(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n\n    if (true) {\n      var contrast = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"getContrastRatio\"])(background, contrastText);\n\n      if (contrast < 3) {\n        console.error([\"Material-UI: The contrast ratio of \".concat(contrast, \":1 for \").concat(contrastText, \" on \").concat(background), 'falls below the WCAG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n'));\n      }\n    }\n\n    return contrastText;\n  }\n\n  var augmentColor = function augmentColor(color) {\n    var mainShade = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n    var lightShade = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n    var darkShade = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 700;\n    color = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, color);\n\n    if (!color.main && color[mainShade]) {\n      color.main = color[mainShade];\n    }\n\n    if (!color.main) {\n      throw new Error( true ? \"Material-UI: The color provided to augmentColor(color) is invalid.\\nThe color object needs to have a `main` property or a `\".concat(mainShade, \"` property.\") : undefined);\n    }\n\n    if (typeof color.main !== 'string') {\n      throw new Error( true ? \"Material-UI: The color provided to augmentColor(color) is invalid.\\n`color.main` should be a string, but `\".concat(JSON.stringify(color.main), \"` was provided instead.\\n\\nDid you intend to use one of the following approaches?\\n\\nimport {\\xA0green } from \\\"@material-ui/core/colors\\\";\\n\\nconst theme1 = createMuiTheme({ palette: {\\n  primary: green,\\n} });\\n\\nconst theme2 = createMuiTheme({ palette: {\\n  primary: { main: green[500] },\\n} });\") : undefined);\n    }\n\n    addLightOrDark(color, 'light', lightShade, tonalOffset);\n    addLightOrDark(color, 'dark', darkShade, tonalOffset);\n\n    if (!color.contrastText) {\n      color.contrastText = getContrastText(color.main);\n    }\n\n    return color;\n  };\n\n  var types = {\n    dark: dark,\n    light: light\n  };\n\n  if (true) {\n    if (!types[type]) {\n      console.error(\"Material-UI: The palette type `\".concat(type, \"` is not supported.\"));\n    }\n  }\n\n  var paletteOutput = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // A collection of common colors.\n    common: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n    // The palette type, can be light or dark.\n    type: type,\n    // The colors used to represent primary interface elements for a user.\n    primary: augmentColor(primary),\n    // The colors used to represent secondary interface elements for a user.\n    secondary: augmentColor(secondary, 'A400', 'A200', 'A700'),\n    // The colors used to represent interface elements that the user should be made aware of.\n    error: augmentColor(error),\n    // The colors used to represent potentially dangerous actions or important messages.\n    warning: augmentColor(warning),\n    // The colors used to present information to the user that is neutral and not necessarily important.\n    info: augmentColor(info),\n    // The colors used to indicate the successful completion of an action that user triggered.\n    success: augmentColor(success),\n    // The grey colors.\n    grey: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    // Used by `getContrastText()` to maximize the contrast between\n    // the background and the text.\n    contrastThreshold: contrastThreshold,\n    // Takes a background color and returns the text color that maximizes the contrast.\n    getContrastText: getContrastText,\n    // Generate a rich color object.\n    augmentColor: augmentColor,\n    // Used by the functions below to shift a color's luminance by approximately\n    // two indexes within its tonal palette.\n    // E.g., shift from Red 500 to Red 300 or Red 700.\n    tonalOffset: tonalOffset\n  }, types[type]), other);\n  return paletteOutput;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSpacing; });\n/* harmony import */ var _material_ui_system__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/system */ \"./jaas-client/node_modules/@material-ui/system/esm/index.js\");\n\nvar warnOnce;\nfunction createSpacing() {\n  var spacingInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 8;\n\n  // Already transformed.\n  if (spacingInput.mui) {\n    return spacingInput;\n  } // Material Design layouts are visually balanced. Most measurements align to an 8dp grid applied, which aligns both spacing and the overall layout.\n  // Smaller components, such as icons and type, can align to a 4dp grid.\n  // https://material.io/design/layout/understanding-layout.html#usage\n\n\n  var transform = Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"createUnarySpacing\"])({\n    spacing: spacingInput\n  });\n\n  var spacing = function spacing() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    if (true) {\n      if (!(args.length <= 4)) {\n        console.error(\"Material-UI: Too many arguments provided, expected between 0 and 4, got \".concat(args.length));\n      }\n    }\n\n    if (args.length === 0) {\n      return transform(1);\n    }\n\n    if (args.length === 1) {\n      return transform(args[0]);\n    }\n\n    return args.map(function (argument) {\n      if (typeof argument === 'string') {\n        return argument;\n      }\n\n      var output = transform(argument);\n      return typeof output === 'number' ? \"\".concat(output, \"px\") : output;\n    }).join(' ');\n  }; // Backward compatibility, to remove in v5.\n\n\n  Object.defineProperty(spacing, 'unit', {\n    get: function get() {\n      if (true) {\n        if (!warnOnce || \"development\" === 'test') {\n          console.error(['Material-UI: theme.spacing.unit usage has been deprecated.', 'It will be removed in v5.', 'You can replace `theme.spacing.unit * y` with `theme.spacing(y)`.', '', 'You can use the `https://github.com/mui-org/material-ui/tree/master/packages/material-ui-codemod/README.md#theme-spacing-api` migration helper to make the process smoother.'].join('\\n'));\n        }\n\n        warnOnce = true;\n      }\n\n      return spacingInput;\n    }\n  });\n  spacing.mui = true;\n  return spacing;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createTypography; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n\n\nfunction round(value) {\n  return Math.round(value * 1e5) / 1e5;\n}\n\nvar caseAllCaps = {\n  textTransform: 'uppercase'\n};\nvar defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n/**\n * @see @link{https://material.io/design/typography/the-type-system.html}\n * @see @link{https://material.io/design/typography/understanding-typography.html}\n */\n\nfunction createTypography(palette, typography) {\n  var _ref = typeof typography === 'function' ? typography(palette) : typography,\n      _ref$fontFamily = _ref.fontFamily,\n      fontFamily = _ref$fontFamily === void 0 ? defaultFontFamily : _ref$fontFamily,\n      _ref$fontSize = _ref.fontSize,\n      fontSize = _ref$fontSize === void 0 ? 14 : _ref$fontSize,\n      _ref$fontWeightLight = _ref.fontWeightLight,\n      fontWeightLight = _ref$fontWeightLight === void 0 ? 300 : _ref$fontWeightLight,\n      _ref$fontWeightRegula = _ref.fontWeightRegular,\n      fontWeightRegular = _ref$fontWeightRegula === void 0 ? 400 : _ref$fontWeightRegula,\n      _ref$fontWeightMedium = _ref.fontWeightMedium,\n      fontWeightMedium = _ref$fontWeightMedium === void 0 ? 500 : _ref$fontWeightMedium,\n      _ref$fontWeightBold = _ref.fontWeightBold,\n      fontWeightBold = _ref$fontWeightBold === void 0 ? 700 : _ref$fontWeightBold,\n      _ref$htmlFontSize = _ref.htmlFontSize,\n      htmlFontSize = _ref$htmlFontSize === void 0 ? 16 : _ref$htmlFontSize,\n      allVariants = _ref.allVariants,\n      pxToRem2 = _ref.pxToRem,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"fontWeightBold\", \"htmlFontSize\", \"allVariants\", \"pxToRem\"]);\n\n  if (true) {\n    if (typeof fontSize !== 'number') {\n      console.error('Material-UI: `fontSize` is required to be a number.');\n    }\n\n    if (typeof htmlFontSize !== 'number') {\n      console.error('Material-UI: `htmlFontSize` is required to be a number.');\n    }\n  }\n\n  var coef = fontSize / 14;\n\n  var pxToRem = pxToRem2 || function (size) {\n    return \"\".concat(size / htmlFontSize * coef, \"rem\");\n  };\n\n  var buildVariant = function buildVariant(fontWeight, size, lineHeight, letterSpacing, casing) {\n    return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      fontFamily: fontFamily,\n      fontWeight: fontWeight,\n      fontSize: pxToRem(size),\n      // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n      lineHeight: lineHeight\n    }, fontFamily === defaultFontFamily ? {\n      letterSpacing: \"\".concat(round(letterSpacing / size), \"em\")\n    } : {}, casing, allVariants);\n  };\n\n  var variants = {\n    h1: buildVariant(fontWeightLight, 96, 1.167, -1.5),\n    h2: buildVariant(fontWeightLight, 60, 1.2, -0.5),\n    h3: buildVariant(fontWeightRegular, 48, 1.167, 0),\n    h4: buildVariant(fontWeightRegular, 34, 1.235, 0.25),\n    h5: buildVariant(fontWeightRegular, 24, 1.334, 0),\n    h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n    subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n    subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n    body1: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n    body2: buildVariant(fontWeightRegular, 14, 1.43, 0.15),\n    button: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n    caption: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n    overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps)\n  };\n  return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    htmlFontSize: htmlFontSize,\n    pxToRem: pxToRem,\n    round: round,\n    // TODO v5: remove\n    fontFamily: fontFamily,\n    fontSize: fontSize,\n    fontWeightLight: fontWeightLight,\n    fontWeightRegular: fontWeightRegular,\n    fontWeightMedium: fontWeightMedium,\n    fontWeightBold: fontWeightBold\n  }, variants), other, {\n    clone: false // No need to clone deep\n\n  });\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createMuiTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createMuiTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js\");\n\nvar defaultTheme = Object(_createMuiTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\n/* harmony default export */ __webpack_exports__[\"default\"] = (defaultTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar shadowKeyUmbraOpacity = 0.2;\nvar shadowKeyPenumbraOpacity = 0.14;\nvar shadowAmbientShadowOpacity = 0.12;\n\nfunction createShadow() {\n  return [\"\".concat(arguments.length <= 0 ? undefined : arguments[0], \"px \").concat(arguments.length <= 1 ? undefined : arguments[1], \"px \").concat(arguments.length <= 2 ? undefined : arguments[2], \"px \").concat(arguments.length <= 3 ? undefined : arguments[3], \"px rgba(0,0,0,\").concat(shadowKeyUmbraOpacity, \")\"), \"\".concat(arguments.length <= 4 ? undefined : arguments[4], \"px \").concat(arguments.length <= 5 ? undefined : arguments[5], \"px \").concat(arguments.length <= 6 ? undefined : arguments[6], \"px \").concat(arguments.length <= 7 ? undefined : arguments[7], \"px rgba(0,0,0,\").concat(shadowKeyPenumbraOpacity, \")\"), \"\".concat(arguments.length <= 8 ? undefined : arguments[8], \"px \").concat(arguments.length <= 9 ? undefined : arguments[9], \"px \").concat(arguments.length <= 10 ? undefined : arguments[10], \"px \").concat(arguments.length <= 11 ? undefined : arguments[11], \"px rgba(0,0,0,\").concat(shadowAmbientShadowOpacity, \")\")].join(',');\n} // Values from https://github.com/material-components/material-components-web/blob/be8747f94574669cb5e7add1a7c54fa41a89cec7/packages/mdc-elevation/_variables.scss\n\n\nvar shadows = ['none', createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), createShadow(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0), createShadow(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\n/* harmony default export */ __webpack_exports__[\"default\"] = (shadows);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar shape = {\n  borderRadius: 4\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (shape);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\n\nvar styled = function styled(Component) {\n  var componentCreator = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_1__[\"styled\"])(Component);\n  return function (style, options) {\n    return componentCreator(style, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      defaultTheme: _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n    }, options));\n  };\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (styled);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js ***!
-  \******************************************************************************/
-/*! exports provided: easing, duration, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"easing\", function() { return easing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"duration\", function() { return duration; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nvar easing = {\n  // This is the most common easing curve.\n  easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n  // Objects enter the screen at full velocity from off-screen and\n  // slowly decelerate to a resting point.\n  easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n  // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n  easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n  // The sharp curve is used by objects that may return to the screen at any time.\n  sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n}; // Follow https://material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\n\nvar duration = {\n  shortest: 150,\n  shorter: 200,\n  short: 250,\n  // most basic recommended timing\n  standard: 300,\n  // this is to be used in complex animations\n  complex: 375,\n  // recommended when something is entering screen\n  enteringScreen: 225,\n  // recommended when something is leaving screen\n  leavingScreen: 195\n};\n\nfunction formatMs(milliseconds) {\n  return \"\".concat(Math.round(milliseconds), \"ms\");\n}\n/**\n * @param {string|Array} props\n * @param {object} param\n * @param {string} param.prop\n * @param {number} param.duration\n * @param {string} param.easing\n * @param {number} param.delay\n */\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  easing: easing,\n  duration: duration,\n  create: function create() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['all'];\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var _options$duration = options.duration,\n        durationOption = _options$duration === void 0 ? duration.standard : _options$duration,\n        _options$easing = options.easing,\n        easingOption = _options$easing === void 0 ? easing.easeInOut : _options$easing,\n        _options$delay = options.delay,\n        delay = _options$delay === void 0 ? 0 : _options$delay,\n        other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(options, [\"duration\", \"easing\", \"delay\"]);\n\n    if (true) {\n      var isString = function isString(value) {\n        return typeof value === 'string';\n      };\n\n      var isNumber = function isNumber(value) {\n        return !isNaN(parseFloat(value));\n      };\n\n      if (!isString(props) && !Array.isArray(props)) {\n        console.error('Material-UI: Argument \"props\" must be a string or Array.');\n      }\n\n      if (!isNumber(durationOption) && !isString(durationOption)) {\n        console.error(\"Material-UI: Argument \\\"duration\\\" must be a number or a string but found \".concat(durationOption, \".\"));\n      }\n\n      if (!isString(easingOption)) {\n        console.error('Material-UI: Argument \"easing\" must be a string.');\n      }\n\n      if (!isNumber(delay) && !isString(delay)) {\n        console.error('Material-UI: Argument \"delay\" must be a number or a string.');\n      }\n\n      if (Object.keys(other).length !== 0) {\n        console.error(\"Material-UI: Unrecognized argument(s) [\".concat(Object.keys(other).join(','), \"].\"));\n      }\n    }\n\n    return (Array.isArray(props) ? props : [props]).map(function (animatedProp) {\n      return \"\".concat(animatedProp, \" \").concat(typeof durationOption === 'string' ? durationOption : formatMs(durationOption), \" \").concat(easingOption, \" \").concat(typeof delay === 'string' ? delay : formatMs(delay));\n    }).join(',');\n  },\n  getAutoHeightDuration: function getAutoHeightDuration(height) {\n    if (!height) {\n      return 0;\n    }\n\n    var constant = height / 36; // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n\n    return Math.round((4 + 15 * Math.pow(constant, 0.25) + constant / 5) * 10);\n  }\n});\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useTheme; });\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\nfunction useTheme() {\n  var theme = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_0__[\"useTheme\"])() || _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_1___default.a.useDebugValue(theme);\n  }\n\n  return theme;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\n\nfunction withStyles(stylesOrCreator, options) {\n  return Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_1__[\"withStyles\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    defaultTheme: _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n  }, options));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (withStyles);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js ***!
-  \*************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nvar zIndex = {\n  mobileStepper: 1000,\n  speedDial: 1050,\n  appBar: 1100,\n  drawer: 1200,\n  modal: 1300,\n  snackbar: 1400,\n  tooltip: 1500\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (zIndex);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js ***!
-  \*****************************************************************************/
-/*! exports provided: reflow, getTransitionProps */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reflow\", function() { return reflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTransitionProps\", function() { return getTransitionProps; });\nvar reflow = function reflow(node) {\n  return node.scrollTop;\n};\nfunction getTransitionProps(props, options) {\n  var timeout = props.timeout,\n      _props$style = props.style,\n      style = _props$style === void 0 ? {} : _props$style;\n  return {\n    duration: style.transitionDuration || typeof timeout === 'number' ? timeout : timeout[options.mode] || 0,\n    delay: style.transitionDelay\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return capitalize; });\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.\n//\n// A strict capitalization should uppercase the first letter of each word a the sentence.\n// We only handle the first word.\nfunction capitalize(string) {\n  if (typeof string !== 'string') {\n    throw new Error( true ? \"Material-UI: capitalize(string) expects a string argument.\" : undefined);\n  }\n\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createChainedFunction; });\n/**\n * Safe chained function\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n *\n * @param {function} functions to chain\n * @returns {function|null}\n */\nfunction createChainedFunction() {\n  for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n    funcs[_key] = arguments[_key];\n  }\n\n  return funcs.reduce(function (acc, func) {\n    if (func == null) {\n      return acc;\n    }\n\n    if (true) {\n      if (typeof func !== 'function') {\n        console.error('Material-UI: Invalid Argument Type, must only provide functions, undefined, or null.');\n      }\n    }\n\n    return function chainedFunction() {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      acc.apply(this, args);\n      func.apply(this, args);\n    };\n  }, function () {});\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSvgIcon; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js\");\n\n\n\n/**\n * Private module reserved for @material-ui/x packages.\n */\n\nfunction createSvgIcon(path, displayName) {\n  var Component = function Component(props, ref) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_SvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      ref: ref\n    }, props), path);\n  };\n\n  if (true) {\n    // Need to set `displayName` on the inner component for React.memo.\n    // React prior to 16.14 ignores `displayName` on the wrapper.\n    Component.displayName = \"\".concat(displayName, \"Icon\");\n  }\n\n  Component.muiName = _SvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"].muiName;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.memo( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.forwardRef(Component));\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return debounce; });\n// Corresponds to 10 frames at 60 Hz.\n// A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 166;\n  var timeout;\n\n  function debounced() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    // eslint-disable-next-line consistent-this\n    var that = this;\n\n    var later = function later() {\n      func.apply(that, args);\n    };\n\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n  }\n\n  debounced.clear = function () {\n    clearTimeout(timeout);\n  };\n\n  return debounced;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getScrollbarSize; });\n// A change of the browser zoom change the scrollbar size.\n// Credit https://github.com/twbs/bootstrap/blob/3ffe3a5d82f6f561b82ff78d82b32a7d14aed558/js/src/modal.js#L512-L519\nfunction getScrollbarSize() {\n  var scrollDiv = document.createElement('div');\n  scrollDiv.style.width = '99px';\n  scrollDiv.style.height = '99px';\n  scrollDiv.style.position = 'absolute';\n  scrollDiv.style.top = '-9999px';\n  scrollDiv.style.overflow = 'scroll';\n  document.body.appendChild(scrollDiv);\n  var scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n  document.body.removeChild(scrollDiv);\n  return scrollbarSize;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isMuiElement; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nfunction isMuiElement(element, muiNames) {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](element) && muiNames.indexOf(element.type.muiName) !== -1;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ownerDocument; });\nfunction ownerDocument(node) {\n  return node && node.ownerDocument || document;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ownerWindow; });\n/* harmony import */ var _ownerDocument__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n\nfunction ownerWindow(node) {\n  var doc = Object(_ownerDocument__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(node);\n  return doc.defaultView || window;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return requirePropFactory; });\nfunction requirePropFactory(componentNameInError) {\n  if (false) {}\n\n  var requireProp = function requireProp(requiredProp) {\n    return function (props, propName, componentName, location, propFullName) {\n      var propFullNameSafe = propFullName || propName;\n\n      if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n        return new Error(\"The prop `\".concat(propFullNameSafe, \"` of \") + \"`\".concat(componentNameInError, \"` must be used on `\").concat(requiredProp, \"`.\"));\n      }\n\n      return null;\n    };\n  };\n\n  return requireProp;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return setRef; });\n// TODO v5: consider to make it private\nfunction setRef(ref, value) {\n  if (typeof ref === 'function') {\n    ref(value);\n  } else if (ref) {\n    ref.current = value;\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useControlled; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */\n\nfunction useControlled(_ref) {\n  var controlled = _ref.controlled,\n      defaultProp = _ref.default,\n      name = _ref.name,\n      _ref$state = _ref.state,\n      state = _ref$state === void 0 ? 'value' : _ref$state;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](controlled !== undefined),\n      isControlled = _React$useRef.current;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](defaultProp),\n      valueState = _React$useState[0],\n      setValue = _React$useState[1];\n\n  var value = isControlled ? controlled : valueState;\n\n  if (true) {\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n      if (isControlled !== (controlled !== undefined)) {\n        console.error([\"Material-UI: A component is changing the \".concat(isControlled ? '' : 'un', \"controlled \").concat(state, \" state of \").concat(name, \" to be \").concat(isControlled ? 'un' : '', \"controlled.\"), 'Elements should not switch from uncontrolled to controlled (or vice versa).', \"Decide between using a controlled or uncontrolled \".concat(name, \" \") + 'element for the lifetime of the component.', \"The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.\", 'More info: https://fb.me/react-controlled-components'].join('\\n'));\n      }\n    }, [controlled]);\n\n    var _React$useRef2 = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](defaultProp),\n        defaultValue = _React$useRef2.current;\n\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n      if (!isControlled && defaultValue !== defaultProp) {\n        console.error([\"Material-UI: A component is changing the default \".concat(state, \" state of an uncontrolled \").concat(name, \" after being initialized. \") + \"To suppress this warning opt to use a controlled \".concat(name, \".\")].join('\\n'));\n      }\n    }, [JSON.stringify(defaultProp)]);\n  }\n\n  var setValueIfUncontrolled = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (newValue) {\n    if (!isControlled) {\n      setValue(newValue);\n    }\n  }, []);\n  return [value, setValueIfUncontrolled];\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useEventCallback; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"];\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n *\n * @param {function} fn\n */\n\nfunction useEventCallback(fn) {\n  var ref = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](fn);\n  useEnhancedEffect(function () {\n    ref.current = fn;\n  });\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function () {\n    return (0, ref.current).apply(void 0, arguments);\n  }, []);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useForkRef; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _setRef__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n\n\nfunction useForkRef(refA, refB) {\n  /**\n   * This will create a new function if the ref props change and are defined.\n   * This means react will call the old forkRef with `null` and the new forkRef\n   * with the ref. Cleanup naturally emerges from this behavior\n   */\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useMemo\"](function () {\n    if (refA == null && refB == null) {\n      return null;\n    }\n\n    return function (refValue) {\n      Object(_setRef__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(refA, refValue);\n      Object(_setRef__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(refB, refValue);\n    };\n  }, [refA, refB]);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js ***!
-  \***********************************************************************************/
-/*! exports provided: teardown, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"teardown\", function() { return teardown; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useIsFocusVisible; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n// based on https://github.com/WICG/focus-visible/blob/v4.1.5/src/focus-visible.js\n\n\nvar hadKeyboardEvent = true;\nvar hadFocusVisibleRecently = false;\nvar hadFocusVisibleRecentlyTimeout = null;\nvar inputTypesWhitelist = {\n  text: true,\n  search: true,\n  url: true,\n  tel: true,\n  email: true,\n  password: true,\n  number: true,\n  date: true,\n  month: true,\n  week: true,\n  time: true,\n  datetime: true,\n  'datetime-local': true\n};\n/**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} node\n * @return {boolean}\n */\n\nfunction focusTriggersKeyboardModality(node) {\n  var type = node.type,\n      tagName = node.tagName;\n\n  if (tagName === 'INPUT' && inputTypesWhitelist[type] && !node.readOnly) {\n    return true;\n  }\n\n  if (tagName === 'TEXTAREA' && !node.readOnly) {\n    return true;\n  }\n\n  if (node.isContentEditable) {\n    return true;\n  }\n\n  return false;\n}\n/**\n * Keep track of our keyboard modality state with `hadKeyboardEvent`.\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * @param {KeyboardEvent} event\n */\n\n\nfunction handleKeyDown(event) {\n  if (event.metaKey || event.altKey || event.ctrlKey) {\n    return;\n  }\n\n  hadKeyboardEvent = true;\n}\n/**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n */\n\n\nfunction handlePointerDown() {\n  hadKeyboardEvent = false;\n}\n\nfunction handleVisibilityChange() {\n  if (this.visibilityState === 'hidden') {\n    // If the tab becomes active again, the browser will handle calling focus\n    // on the element (Safari actually calls it twice).\n    // If this tab change caused a blur on an element with focus-visible,\n    // re-apply the class when the user switches back to the tab.\n    if (hadFocusVisibleRecently) {\n      hadKeyboardEvent = true;\n    }\n  }\n}\n\nfunction prepare(doc) {\n  doc.addEventListener('keydown', handleKeyDown, true);\n  doc.addEventListener('mousedown', handlePointerDown, true);\n  doc.addEventListener('pointerdown', handlePointerDown, true);\n  doc.addEventListener('touchstart', handlePointerDown, true);\n  doc.addEventListener('visibilitychange', handleVisibilityChange, true);\n}\n\nfunction teardown(doc) {\n  doc.removeEventListener('keydown', handleKeyDown, true);\n  doc.removeEventListener('mousedown', handlePointerDown, true);\n  doc.removeEventListener('pointerdown', handlePointerDown, true);\n  doc.removeEventListener('touchstart', handlePointerDown, true);\n  doc.removeEventListener('visibilitychange', handleVisibilityChange, true);\n}\n\nfunction isFocusVisible(event) {\n  var target = event.target;\n\n  try {\n    return target.matches(':focus-visible');\n  } catch (error) {} // browsers not implementing :focus-visible will throw a SyntaxError\n  // we use our own heuristic for those browsers\n  // rethrow might be better if it's not the expected error but do we really\n  // want to crash if focus-visible malfunctioned?\n  // no need for validFocusTarget check. the user does that by attaching it to\n  // focusable events only\n\n\n  return hadKeyboardEvent || focusTriggersKeyboardModality(target);\n}\n/**\n * Should be called if a blur event is fired on a focus-visible element\n */\n\n\nfunction handleBlurVisible() {\n  // To detect a tab/window switch, we look for a blur event followed\n  // rapidly by a visibility change.\n  // If we don't see a visibility change within 100ms, it's probably a\n  // regular focus change.\n  hadFocusVisibleRecently = true;\n  window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n  hadFocusVisibleRecentlyTimeout = window.setTimeout(function () {\n    hadFocusVisibleRecently = false;\n  }, 100);\n}\n\nfunction useIsFocusVisible() {\n  var ref = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (instance) {\n    var node = react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](instance);\n\n    if (node != null) {\n      prepare(node.ownerDocument);\n    }\n  }, []);\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useDebugValue\"](isFocusVisible);\n  }\n\n  return {\n    isFocusVisible: isFocusVisible,\n    onBlurVisible: handleBlurVisible,\n    ref: ref\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/icons/LockOutlined.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/icons/LockOutlined.js ***!
-  \*********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(__webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\"));\n\nvar _createSvgIcon = _interopRequireDefault(__webpack_require__(/*! ./utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js\"));\n\nvar _default = (0, _createSvgIcon.default)(_react.default.createElement(\"path\", {\n  d: \"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n}), 'LockOutlined');\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/icons/LockOutlined.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = createSvgIcon;\n\nvar _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/extends.js\"));\n\nvar _react = _interopRequireDefault(__webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\"));\n\nvar _SvgIcon = _interopRequireDefault(__webpack_require__(/*! @material-ui/core/SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js\"));\n\nfunction createSvgIcon(path, displayName) {\n  var Component = _react.default.memo(_react.default.forwardRef(function (props, ref) {\n    return _react.default.createElement(_SvgIcon.default, (0, _extends2.default)({\n      ref: ref\n    }, props), path);\n  }));\n\n  if (true) {\n    Component.displayName = \"\".concat(displayName, \"Icon\");\n  }\n\n  Component.muiName = _SvgIcon.default.muiName;\n  return Component;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js":
-/*!*************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js ***!
-  \*************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ServerStyleSheets; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n\n\n\n\n\n\n\n\nvar ServerStyleSheets = /*#__PURE__*/function () {\n  function ServerStyleSheets() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    Object(_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, ServerStyleSheets);\n\n    this.options = options;\n  }\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(ServerStyleSheets, [{\n    key: \"collect\",\n    value: function collect(children) {\n      // This is needed in order to deduplicate the injection of CSS in the page.\n      var sheetsManager = new Map(); // This is needed in order to inject the critical CSS.\n\n      this.sheetsRegistry = new jss__WEBPACK_IMPORTED_MODULE_4__[\"SheetsRegistry\"](); // A new class name generator\n\n      var generateClassName = Object(_createGenerateClassName__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_StylesProvider__WEBPACK_IMPORTED_MODULE_5__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        sheetsManager: sheetsManager,\n        serverGenerateClassName: generateClassName,\n        sheetsRegistry: this.sheetsRegistry\n      }, this.options), children);\n    }\n  }, {\n    key: \"toString\",\n    value: function toString() {\n      return this.sheetsRegistry ? this.sheetsRegistry.toString() : '';\n    }\n  }, {\n    key: \"getStyleElement\",\n    value: function getStyleElement(props) {\n      return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement('style', Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        id: 'jss-server-side',\n        key: 'jss-server-side',\n        dangerouslySetInnerHTML: {\n          __html: this.toString()\n        }\n      }, props));\n    }\n  }]);\n\n  return ServerStyleSheets;\n}();\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js ***!
-  \*************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ServerStyleSheets */ \"./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js ***!
-  \*******************************************************************************************/
-/*! exports provided: sheetsManager, StylesContext, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return sheetsManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return StylesContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return StylesProvider; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js\");\n\n\n\n\n\n\n\n // Default JSS instance.\n\nvar jss = Object(jss__WEBPACK_IMPORTED_MODULE_6__[\"create\"])(Object(_jssPreset__WEBPACK_IMPORTED_MODULE_7__[\"default\"])()); // Use a singleton or the provided one by the context.\n//\n// The counter-based approach doesn't tolerate any mistake.\n// It's much safer to use the same counter everywhere.\n\nvar generateClassName = Object(_createGenerateClassName__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(); // Exported for test purposes\n\nvar sheetsManager = new Map();\nvar defaultOptions = {\n  disableGeneration: false,\n  generateClassName: generateClassName,\n  jss: jss,\n  sheetsCache: null,\n  sheetsManager: sheetsManager,\n  sheetsRegistry: null\n};\nvar StylesContext = react__WEBPACK_IMPORTED_MODULE_2___default.a.createContext(defaultOptions);\n\nif (true) {\n  StylesContext.displayName = 'StylesContext';\n}\n\nvar injectFirstNode;\nfunction StylesProvider(props) {\n  var children = props.children,\n      _props$injectFirst = props.injectFirst,\n      injectFirst = _props$injectFirst === void 0 ? false : _props$injectFirst,\n      _props$disableGenerat = props.disableGeneration,\n      disableGeneration = _props$disableGenerat === void 0 ? false : _props$disableGenerat,\n      localOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"injectFirst\", \"disableGeneration\"]);\n\n  var outerOptions = react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(StylesContext);\n\n  var context = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerOptions), {}, {\n    disableGeneration: disableGeneration\n  }, localOptions);\n\n  if (true) {\n    if (typeof window === 'undefined' && !context.sheetsManager) {\n      console.error('Material-UI: You need to use the ServerStyleSheets API when rendering on the server.');\n    }\n  }\n\n  if (true) {\n    if (context.jss.options.insertionPoint && injectFirst) {\n      console.error('Material-UI: You cannot use a custom insertionPoint and <StylesContext injectFirst> at the same time.');\n    }\n  }\n\n  if (true) {\n    if (injectFirst && localOptions.jss) {\n      console.error('Material-UI: You cannot use the jss and injectFirst props at the same time.');\n    }\n  }\n\n  if (!context.jss.options.insertionPoint && injectFirst && typeof window !== 'undefined') {\n    if (!injectFirstNode) {\n      var head = document.head;\n      injectFirstNode = document.createComment('mui-inject-first');\n      head.insertBefore(injectFirstNode, head.firstChild);\n    }\n\n    context.jss = Object(jss__WEBPACK_IMPORTED_MODULE_6__[\"create\"])({\n      plugins: Object(_jssPreset__WEBPACK_IMPORTED_MODULE_7__[\"default\"])().plugins,\n      insertionPoint: injectFirstNode\n    });\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(StylesContext.Provider, {\n    value: context\n  }, children);\n}\n true ? StylesProvider.propTypes = {\n  /**\n   * Your component tree.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n\n  /**\n   * You can disable the generation of the styles with this option.\n   * It can be useful when traversing the React tree outside of the HTML\n   * rendering step on the server.\n   * Let's say you are using react-apollo to extract all\n   * the queries made by the interface server-side - you can significantly speed up the traversal with this prop.\n   */\n  disableGeneration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * JSS's class name generator.\n   */\n  generateClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * By default, the styles are injected last in the <head> element of the page.\n   * As a result, they gain more specificity than any other style sheet.\n   * If you want to override Material-UI's styles, set this prop.\n   */\n  injectFirst: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * JSS's instance.\n   */\n  jss: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  serverGenerateClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   *\n   * Beta feature.\n   *\n   * Cache for the sheets.\n   */\n  sheetsCache: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   *\n   * The sheetsManager is used to deduplicate style sheet injection in the page.\n   * It's deduplicating using the (theme, styles) couple.\n   * On the server, you should provide a new instance for each request.\n   */\n  sheetsManager: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   *\n   * Collect the sheets.\n   */\n  sheetsRegistry: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n\nif (true) {\n   true ? StylesProvider.propTypes = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"exactProp\"])(StylesProvider.propTypes) : undefined;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js ***!
-  \**********************************************************************************/
-/*! exports provided: default, sheetsManager, StylesContext */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"sheetsManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"StylesContext\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js":
-/*!*****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js ***!
-  \*****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../useTheme/ThemeContext */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony import */ var _nested__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./nested */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js\");\n\n\n\n\n\n\n // To support composition of theme.\n\nfunction mergeOuterLocalTheme(outerTheme, localTheme) {\n  if (typeof localTheme === 'function') {\n    var mergedTheme = localTheme(outerTheme);\n\n    if (true) {\n      if (!mergedTheme) {\n        console.error(['Material-UI: You should return an object from your theme function, i.e.', '<ThemeProvider theme={() => ({})} />'].join('\\n'));\n      }\n    }\n\n    return mergedTheme;\n  }\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerTheme), localTheme);\n}\n/**\n * This component takes a `theme` prop.\n * It makes the `theme` available down the React tree thanks to React context.\n * This component should preferably be used at **the root of your component tree**.\n */\n\n\nfunction ThemeProvider(props) {\n  var children = props.children,\n      localTheme = props.theme;\n  var outerTheme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n\n  if (true) {\n    if (outerTheme === null && typeof localTheme === 'function') {\n      console.error(['Material-UI: You are providing a theme function prop to the ThemeProvider component:', '<ThemeProvider theme={outerTheme => outerTheme} />', '', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n'));\n    }\n  }\n\n  var theme = react__WEBPACK_IMPORTED_MODULE_1___default.a.useMemo(function () {\n    var output = outerTheme === null ? localTheme : mergeOuterLocalTheme(outerTheme, localTheme);\n\n    if (output != null) {\n      output[_nested__WEBPACK_IMPORTED_MODULE_6__[\"default\"]] = outerTheme !== null;\n    }\n\n    return output;\n  }, [localTheme, outerTheme]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Provider, {\n    value: theme\n  }, children);\n}\n\n true ? ThemeProvider.propTypes = {\n  /**\n   * Your component tree.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node.isRequired,\n\n  /**\n   * A theme object. You can provide a function to extend the outer theme.\n   */\n  theme: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func]).isRequired\n} : undefined;\n\nif (true) {\n   true ? ThemeProvider.propTypes = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"exactProp\"])(ThemeProvider.propTypes) : undefined;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ThemeProvider);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ThemeProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ThemeProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ThemeProvider__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\n/* harmony default export */ __webpack_exports__[\"default\"] = (hasSymbol ? Symbol.for('mui.nested') : '__THEME_NESTED__');\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js":
-/*!*************************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js ***!
-  \*************************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createGenerateClassName; });\n/* harmony import */ var _ThemeProvider_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ThemeProvider/nested */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js\");\n\n/**\n * This is the list of the style rule name we use as drop in replacement for the built-in\n * pseudo classes (:checked, :disabled, :focused, etc.).\n *\n * Why do they exist in the first place?\n * These classes are used at a specificity of 2.\n * It allows them to override previously definied styles as well as\n * being untouched by simple user overrides.\n */\n\nvar pseudoClasses = ['checked', 'disabled', 'error', 'focused', 'focusVisible', 'required', 'expanded', 'selected']; // Returns a function which generates unique class names based on counters.\n// When new generator function is created, rule counter is reset.\n// We need to reset the rule counter for SSR for each request.\n//\n// It's inspired by\n// https://github.com/cssinjs/jss/blob/4e6a05dd3f7b6572fdd3ab216861d9e446c20331/src/utils/createGenerateClassName.js\n\nfunction createGenerateClassName() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _options$disableGloba = options.disableGlobal,\n      disableGlobal = _options$disableGloba === void 0 ? false : _options$disableGloba,\n      _options$productionPr = options.productionPrefix,\n      productionPrefix = _options$productionPr === void 0 ? 'jss' : _options$productionPr,\n      _options$seed = options.seed,\n      seed = _options$seed === void 0 ? '' : _options$seed;\n  var seedPrefix = seed === '' ? '' : \"\".concat(seed, \"-\");\n  var ruleCounter = 0;\n\n  var getNextCounterId = function getNextCounterId() {\n    ruleCounter += 1;\n\n    if (true) {\n      if (ruleCounter >= 1e10) {\n        console.warn(['Material-UI: You might have a memory leak.', 'The ruleCounter is not supposed to grow that much.'].join(''));\n      }\n    }\n\n    return ruleCounter;\n  };\n\n  return function (rule, styleSheet) {\n    var name = styleSheet.options.name; // Is a global static MUI style?\n\n    if (name && name.indexOf('Mui') === 0 && !styleSheet.options.link && !disableGlobal) {\n      // We can use a shorthand class name, we never use the keys to style the components.\n      if (pseudoClasses.indexOf(rule.key) !== -1) {\n        return \"Mui-\".concat(rule.key);\n      }\n\n      var prefix = \"\".concat(seedPrefix).concat(name, \"-\").concat(rule.key);\n\n      if (!styleSheet.options.theme[_ThemeProvider_nested__WEBPACK_IMPORTED_MODULE_0__[\"default\"]] || seed !== '') {\n        return prefix;\n      }\n\n      return \"\".concat(prefix, \"-\").concat(getNextCounterId());\n    }\n\n    if (false) {}\n\n    var suffix = \"\".concat(rule.key, \"-\").concat(getNextCounterId()); // Help with debuggability.\n\n    if (styleSheet.options.classNamePrefix) {\n      return \"\".concat(seedPrefix).concat(styleSheet.options.classNamePrefix, \"-\").concat(suffix);\n    }\n\n    return \"\".concat(seedPrefix).concat(suffix);\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js ***!
-  \*******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createGenerateClassName__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createStyles; });\nfunction createStyles(styles) {\n  return styles;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js":
-/*!***********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js ***!
-  \***********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getStylesCreator; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _noopTheme__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./noopTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js\");\n\n\n\n\nfunction getStylesCreator(stylesOrCreator) {\n  var themingEnabled = typeof stylesOrCreator === 'function';\n\n  if (true) {\n    if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(stylesOrCreator) !== 'object' && !themingEnabled) {\n      console.error(['Material-UI: The `styles` argument provided is invalid.', 'You need to provide a function generating the styles or a styles object.'].join('\\n'));\n    }\n  }\n\n  return {\n    create: function create(theme, name) {\n      var styles;\n\n      try {\n        styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n      } catch (err) {\n        if (true) {\n          if (themingEnabled === true && theme === _noopTheme__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n            // TODO: prepend error message/name instead\n            console.error(['Material-UI: The `styles` argument provided is invalid.', 'You are providing a function without a theme in the context.', 'One of the parent elements needs to use a ThemeProvider.'].join('\\n'));\n          }\n        }\n\n        throw err;\n      }\n\n      if (!name || !theme.overrides || !theme.overrides[name]) {\n        return styles;\n      }\n\n      var overrides = theme.overrides[name];\n\n      var stylesWithOverrides = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles);\n\n      Object.keys(overrides).forEach(function (key) {\n        if (true) {\n          if (!stylesWithOverrides[key]) {\n            console.warn(['Material-UI: You are trying to override a style that does not exist.', \"Fix the `\".concat(key, \"` key of `theme.overrides.\").concat(name, \"`.\")].join('\\n'));\n          }\n        }\n\n        stylesWithOverrides[key] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(stylesWithOverrides[key], overrides[key]);\n      });\n      return stylesWithOverrides;\n    },\n    options: {}\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _getStylesCreator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getStylesCreator */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _getStylesCreator__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js":
-/*!****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js ***!
-  \****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n// We use the same empty object to ref count the styles that don't need a theme object.\nvar noopTheme = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = (noopTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js":
-/*!*****************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js ***!
-  \*****************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getThemeProps; });\n/* eslint-disable no-restricted-syntax */\nfunction getThemeProps(params) {\n  var theme = params.theme,\n      name = params.name,\n      props = params.props;\n\n  if (!theme || !theme.props || !theme.props[name]) {\n    return props;\n  } // Resolve default props, code borrow from React source.\n  // https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L221\n\n\n  var defaultProps = theme.props[name];\n  var propName;\n\n  for (propName in defaultProps) {\n    if (props[propName] === undefined) {\n      props[propName] = defaultProps[propName];\n    }\n  }\n\n  return props;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _getThemeProps__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/index.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/index.js ***!
-  \*******************************************************************/
-/*! exports provided: createGenerateClassName, createStyles, getThemeProps, jssPreset, makeStyles, mergeClasses, ServerStyleSheets, styled, StylesProvider, sheetsManager, StylesContext, ThemeProvider, useTheme, withStyles, withTheme, withThemeCreator */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createGenerateClassName\", function() { return _createGenerateClassName__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _createStyles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createStyles\", function() { return _createStyles__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"getThemeProps\", function() { return _getThemeProps__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"jssPreset\", function() { return _jssPreset__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"makeStyles\", function() { return _makeStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mergeClasses\", function() { return _mergeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ServerStyleSheets */ \"./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ServerStyleSheets\", function() { return _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./styled */ \"./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"styled\", function() { return _styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesProvider\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"sheetsManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"StylesContext\"]; });\n\n/* harmony import */ var _ThemeProvider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ThemeProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ThemeProvider\", function() { return _ThemeProvider__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useTheme\", function() { return _useTheme__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _withStyles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./withStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withStyles\", function() { return _withStyles__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _withTheme__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./withTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withTheme\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_13__[\"withThemeCreator\"]; });\n\n/** @license Material-UI v4.10.0\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/* eslint-disable import/export */\n\n/* Warning if there are several instances of @material-ui/styles */\n\nif ( true && typeof window !== 'undefined') {\n  _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] = _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] || 0;\n\n  if (_material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] === 1) {\n    console.warn(['It looks like there are several instances of `@material-ui/styles` initialized in this application.', 'This may cause theme propagation issues, broken class names, ' + 'specificity issues, and makes your application bigger without a good reason.', '', 'See https://material-ui.com/r/styles-instance-warning for more info.'].join('\\n'));\n  }\n\n  _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] += 1;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _jssPreset__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js ***!
-  \*********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return jssPreset; });\n/* harmony import */ var jss_plugin_rule_value_function__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jss-plugin-rule-value-function */ \"./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js\");\n/* harmony import */ var jss_plugin_global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss-plugin-global */ \"./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js\");\n/* harmony import */ var jss_plugin_nested__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jss-plugin-nested */ \"./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js\");\n/* harmony import */ var jss_plugin_camel_case__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jss-plugin-camel-case */ \"./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js\");\n/* harmony import */ var jss_plugin_default_unit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jss-plugin-default-unit */ \"./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js\");\n/* harmony import */ var jss_plugin_vendor_prefixer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jss-plugin-vendor-prefixer */ \"./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js\");\n/* harmony import */ var jss_plugin_props_sort__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jss-plugin-props-sort */ \"./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js\");\n\n\n\n\n\n\n // Subset of jss-preset-default with only the plugins the Material-UI components are using.\n\nfunction jssPreset() {\n  return {\n    plugins: [Object(jss_plugin_rule_value_function__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(), Object(jss_plugin_global__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(), Object(jss_plugin_nested__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(), Object(jss_plugin_camel_case__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(), Object(jss_plugin_default_unit__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(), // Disable the vendor prefixer server-side, it does nothing.\n    // This way, we can get a performance boost.\n    // In the documentation, we are using `autoprefixer` to solve this problem.\n    typeof window === 'undefined' ? null : Object(jss_plugin_vendor_prefixer__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(), Object(jss_plugin_props_sort__WEBPACK_IMPORTED_MODULE_6__[\"default\"])()]\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _makeStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js ***!
-  \*************************************************************************************/
-/*! exports provided: increment */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"increment\", function() { return increment; });\n/* eslint-disable import/prefer-default-export */\n// Global index counter to preserve source order.\n// We create the style sheet during the creation of the component,\n// children are handled after the parents, so the order of style elements would be parent->child.\n// It is a problem though when a parent passes a className\n// which needs to override any child's styles.\n// StyleSheet of the child has a higher specificity, because of the source order.\n// So our solution is to render sheets them in the reverse order child->sheet, so\n// that parent has a higher specificity.\nvar indexCounter = -1e9;\nfunction increment() {\n  indexCounter += 1;\n\n  if (true) {\n    if (indexCounter >= 0) {\n      console.warn(['Material-UI: You might have a memory leak.', 'The indexCounter is not supposed to grow that much.'].join('\\n'));\n    }\n  }\n\n  return indexCounter;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return makeStyles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js\");\n/* harmony import */ var _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./multiKeyStore */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony import */ var _indexCounter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./indexCounter */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js\");\n/* harmony import */ var _getStylesCreator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../getStylesCreator */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js\");\n/* harmony import */ var _getStylesCreator_noopTheme__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../getStylesCreator/noopTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getClasses(_ref, classes, Component) {\n  var state = _ref.state,\n      stylesOptions = _ref.stylesOptions;\n\n  if (stylesOptions.disableGeneration) {\n    return classes || {};\n  }\n\n  if (!state.cacheClasses) {\n    state.cacheClasses = {\n      // Cache for the finalized classes value.\n      value: null,\n      // Cache for the last used classes prop pointer.\n      lastProp: null,\n      // Cache for the last used rendered classes pointer.\n      lastJSS: {}\n    };\n  } // Tracks if either the rendered classes or classes prop has changed,\n  // requiring the generation of a new finalized classes object.\n\n\n  var generate = false;\n\n  if (state.classes !== state.cacheClasses.lastJSS) {\n    state.cacheClasses.lastJSS = state.classes;\n    generate = true;\n  }\n\n  if (classes !== state.cacheClasses.lastProp) {\n    state.cacheClasses.lastProp = classes;\n    generate = true;\n  }\n\n  if (generate) {\n    state.cacheClasses.value = Object(_mergeClasses__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      baseClasses: state.cacheClasses.lastJSS,\n      newClasses: classes,\n      Component: Component\n    });\n  }\n\n  return state.cacheClasses.value;\n}\n\nfunction attach(_ref2, props) {\n  var state = _ref2.state,\n      theme = _ref2.theme,\n      stylesOptions = _ref2.stylesOptions,\n      stylesCreator = _ref2.stylesCreator,\n      name = _ref2.name;\n\n  if (stylesOptions.disableGeneration) {\n    return;\n  }\n\n  var sheetManager = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsManager, stylesCreator, theme);\n\n  if (!sheetManager) {\n    sheetManager = {\n      refs: 0,\n      staticSheet: null,\n      dynamicStyles: null\n    };\n    _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(stylesOptions.sheetsManager, stylesCreator, theme, sheetManager);\n  }\n\n  var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, stylesCreator.options), stylesOptions), {}, {\n    theme: theme,\n    flip: typeof stylesOptions.flip === 'boolean' ? stylesOptions.flip : theme.direction === 'rtl'\n  });\n\n  options.generateId = options.serverGenerateClassName || options.generateClassName;\n  var sheetsRegistry = stylesOptions.sheetsRegistry;\n\n  if (sheetManager.refs === 0) {\n    var staticSheet;\n\n    if (stylesOptions.sheetsCache) {\n      staticSheet = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsCache, stylesCreator, theme);\n    }\n\n    var styles = stylesCreator.create(theme, name);\n\n    if (!staticSheet) {\n      staticSheet = stylesOptions.jss.createStyleSheet(styles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        link: false\n      }, options));\n      staticSheet.attach();\n\n      if (stylesOptions.sheetsCache) {\n        _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(stylesOptions.sheetsCache, stylesCreator, theme, staticSheet);\n      }\n    }\n\n    if (sheetsRegistry) {\n      sheetsRegistry.add(staticSheet);\n    }\n\n    sheetManager.staticSheet = staticSheet;\n    sheetManager.dynamicStyles = Object(jss__WEBPACK_IMPORTED_MODULE_3__[\"getDynamicStyles\"])(styles);\n  }\n\n  if (sheetManager.dynamicStyles) {\n    var dynamicSheet = stylesOptions.jss.createStyleSheet(sheetManager.dynamicStyles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      link: true\n    }, options));\n    dynamicSheet.update(props);\n    dynamicSheet.attach();\n    state.dynamicSheet = dynamicSheet;\n    state.classes = Object(_mergeClasses__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      baseClasses: sheetManager.staticSheet.classes,\n      newClasses: dynamicSheet.classes\n    });\n\n    if (sheetsRegistry) {\n      sheetsRegistry.add(dynamicSheet);\n    }\n  } else {\n    state.classes = sheetManager.staticSheet.classes;\n  }\n\n  sheetManager.refs += 1;\n}\n\nfunction update(_ref3, props) {\n  var state = _ref3.state;\n\n  if (state.dynamicSheet) {\n    state.dynamicSheet.update(props);\n  }\n}\n\nfunction detach(_ref4) {\n  var state = _ref4.state,\n      theme = _ref4.theme,\n      stylesOptions = _ref4.stylesOptions,\n      stylesCreator = _ref4.stylesCreator;\n\n  if (stylesOptions.disableGeneration) {\n    return;\n  }\n\n  var sheetManager = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsManager, stylesCreator, theme);\n  sheetManager.refs -= 1;\n  var sheetsRegistry = stylesOptions.sheetsRegistry;\n\n  if (sheetManager.refs === 0) {\n    _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].delete(stylesOptions.sheetsManager, stylesCreator, theme);\n    stylesOptions.jss.removeStyleSheet(sheetManager.staticSheet);\n\n    if (sheetsRegistry) {\n      sheetsRegistry.remove(sheetManager.staticSheet);\n    }\n  }\n\n  if (state.dynamicSheet) {\n    stylesOptions.jss.removeStyleSheet(state.dynamicSheet);\n\n    if (sheetsRegistry) {\n      sheetsRegistry.remove(state.dynamicSheet);\n    }\n  }\n}\n\nfunction useSynchronousEffect(func, values) {\n  var key = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef([]);\n  var output; // Store \"generation\" key. Just returns a new object every time\n\n  var currentKey = react__WEBPACK_IMPORTED_MODULE_2___default.a.useMemo(function () {\n    return {};\n  }, values); // eslint-disable-line react-hooks/exhaustive-deps\n  // \"the first render\", or \"memo dropped the value\"\n\n  if (key.current !== currentKey) {\n    key.current = currentKey;\n    output = func();\n  }\n\n  react__WEBPACK_IMPORTED_MODULE_2___default.a.useEffect(function () {\n    return function () {\n      if (output) {\n        output();\n      }\n    };\n  }, [currentKey] // eslint-disable-line react-hooks/exhaustive-deps\n  );\n}\n\nfunction makeStyles(stylesOrCreator) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var name = options.name,\n      classNamePrefixOption = options.classNamePrefix,\n      Component = options.Component,\n      _options$defaultTheme = options.defaultTheme,\n      defaultTheme = _options$defaultTheme === void 0 ? _getStylesCreator_noopTheme__WEBPACK_IMPORTED_MODULE_10__[\"default\"] : _options$defaultTheme,\n      stylesOptions2 = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(options, [\"name\", \"classNamePrefix\", \"Component\", \"defaultTheme\"]);\n\n  var stylesCreator = Object(_getStylesCreator__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(stylesOrCreator);\n  var classNamePrefix = name || classNamePrefixOption || 'makeStyles';\n  stylesCreator.options = {\n    index: Object(_indexCounter__WEBPACK_IMPORTED_MODULE_8__[\"increment\"])(),\n    name: name,\n    meta: classNamePrefix,\n    classNamePrefix: classNamePrefix\n  };\n\n  var useStyles = function useStyles() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])() || defaultTheme;\n\n    var stylesOptions = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(_StylesProvider__WEBPACK_IMPORTED_MODULE_7__[\"StylesContext\"])), stylesOptions2);\n\n    var instance = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef();\n    var shouldUpdate = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef();\n    useSynchronousEffect(function () {\n      var current = {\n        name: name,\n        state: {},\n        stylesCreator: stylesCreator,\n        stylesOptions: stylesOptions,\n        theme: theme\n      };\n      attach(current, props);\n      shouldUpdate.current = false;\n      instance.current = current;\n      return function () {\n        detach(current);\n      };\n    }, [theme, stylesCreator]);\n    react__WEBPACK_IMPORTED_MODULE_2___default.a.useEffect(function () {\n      if (shouldUpdate.current) {\n        update(instance.current, props);\n      }\n\n      shouldUpdate.current = true;\n    });\n    var classes = getClasses(instance.current, props.classes, Component);\n\n    if (true) {\n      // eslint-disable-next-line react-hooks/rules-of-hooks\n      react__WEBPACK_IMPORTED_MODULE_2___default.a.useDebugValue(classes);\n    }\n\n    return classes;\n  };\n\n  return useStyles;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js":
-/*!**************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js ***!
-  \**************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n// Used https://github.com/thinkloop/multi-key-cache as inspiration\nvar multiKeyStore = {\n  set: function set(cache, key1, key2, value) {\n    var subCache = cache.get(key1);\n\n    if (!subCache) {\n      subCache = new Map();\n      cache.set(key1, subCache);\n    }\n\n    subCache.set(key2, value);\n  },\n  get: function get(cache, key1, key2) {\n    var subCache = cache.get(key1);\n    return subCache ? subCache.get(key2) : undefined;\n  },\n  delete: function _delete(cache, key1, key2) {\n    var subCache = cache.get(key1);\n    subCache.delete(key2);\n  }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (multiKeyStore);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _mergeClasses__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return mergeClasses; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\nfunction mergeClasses() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var baseClasses = options.baseClasses,\n      newClasses = options.newClasses,\n      Component = options.Component;\n\n  if (!newClasses) {\n    return baseClasses;\n  }\n\n  var nextClasses = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, baseClasses);\n\n  if (true) {\n    if (typeof newClasses === 'string') {\n      console.error([\"Material-UI: The value `\".concat(newClasses, \"` \") + \"provided to the classes prop of \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \" is incorrect.\"), 'You might want to use the className prop instead.'].join('\\n'));\n      return baseClasses;\n    }\n  }\n\n  Object.keys(newClasses).forEach(function (key) {\n    if (true) {\n      if (!baseClasses[key] && newClasses[key]) {\n        console.error([\"Material-UI: The key `\".concat(key, \"` \") + \"provided to the classes prop is not implemented in \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \".\"), \"You can only override one of the following: \".concat(Object.keys(baseClasses).join(','), \".\")].join('\\n'));\n      }\n\n      if (newClasses[key] && typeof newClasses[key] !== 'string') {\n        console.error([\"Material-UI: The key `\".concat(key, \"` \") + \"provided to the classes prop is not valid for \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \".\"), \"You need to provide a non empty string instead of: \".concat(newClasses[key], \".\")].join('\\n'));\n      }\n    }\n\n    if (newClasses[key]) {\n      nextClasses[key] = \"\".concat(baseClasses[key], \" \").concat(newClasses[key]);\n    }\n  });\n  return nextClasses;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js":
-/*!**************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js ***!
-  \**************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _styled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./styled */ \"./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _styled__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return styled; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n\n\n\n\n\n\n\n\n\nfunction omit(input, fields) {\n  var output = {};\n  Object.keys(input).forEach(function (prop) {\n    if (fields.indexOf(prop) === -1) {\n      output[prop] = input[prop];\n    }\n  });\n  return output;\n} // styled-components's API removes the mapping between components and styles.\n// Using components as a low-level styling construct can be simpler.\n\n\nfunction styled(Component) {\n  var componentCreator = function componentCreator(style) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var name = options.name,\n        stylesOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"name\"]);\n\n    if ( true && Component === undefined) {\n      throw new Error(['You are calling styled(Component)(style) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n    }\n\n    var classNamePrefix = name;\n\n    if (true) {\n      if (!name) {\n        // Provide a better DX outside production.\n        var displayName = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component);\n\n        if (displayName !== undefined) {\n          classNamePrefix = displayName;\n        }\n      }\n    }\n\n    var stylesOrCreator = typeof style === 'function' ? function (theme) {\n      return {\n        root: function root(props) {\n          return style(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n            theme: theme\n          }, props));\n        }\n      };\n    } : {\n      root: style\n    };\n    var useStyles = Object(_makeStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      Component: Component,\n      name: name || Component.displayName,\n      classNamePrefix: classNamePrefix\n    }, stylesOptions));\n    var filterProps;\n    var propTypes = {};\n\n    if (style.filterProps) {\n      filterProps = style.filterProps;\n      delete style.filterProps;\n    }\n    /* eslint-disable react/forbid-foreign-prop-types */\n\n\n    if (style.propTypes) {\n      propTypes = style.propTypes;\n      delete style.propTypes;\n    }\n    /* eslint-enable react/forbid-foreign-prop-types */\n\n\n    var StyledComponent = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function StyledComponent(props, ref) {\n      var children = props.children,\n          classNameProp = props.className,\n          clone = props.clone,\n          ComponentProp = props.component,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"className\", \"clone\", \"component\"]);\n\n      var classes = useStyles(props);\n      var className = Object(clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, classNameProp);\n      var spread = other;\n\n      if (filterProps) {\n        spread = omit(spread, filterProps);\n      }\n\n      if (clone) {\n        return react__WEBPACK_IMPORTED_MODULE_2___default.a.cloneElement(children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n          className: Object(clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(children.props.className, className)\n        }, spread));\n      }\n\n      if (typeof children === 'function') {\n        return children(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n          className: className\n        }, spread));\n      }\n\n      var FinalComponent = ComponentProp || Component;\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(FinalComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        ref: ref,\n        className: className\n      }, spread), children);\n    });\n     true ? StyledComponent.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      /**\n       * A render function or node.\n       */\n      children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n      /**\n       * @ignore\n       */\n      className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n      /**\n       * If `true`, the component will recycle it's children HTML element.\n       * It's using `React.cloneElement` internally.\n       *\n       * This prop will be deprecated and removed in v5\n       */\n      clone: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, function (props) {\n        if (props.clone && props.component) {\n          return new Error('You can not use the clone and component prop at the same time.');\n        }\n\n        return null;\n      }),\n\n      /**\n       * The component used for the root node.\n       * Either a string to use a HTML element or a component.\n       */\n      component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType\n    }, propTypes) : undefined;\n\n    if (true) {\n      StyledComponent.displayName = \"Styled(\".concat(classNamePrefix, \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6___default()(StyledComponent, Component);\n    return StyledComponent;\n  };\n\n  return componentCreator;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nvar ThemeContext = react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext(null);\n\nif (true) {\n  ThemeContext.displayName = 'ThemeContext';\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ThemeContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _useTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js ***!
-  \*******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useTheme; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ThemeContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ThemeContext */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js\");\n\n\nfunction useTheme() {\n  var theme = react__WEBPACK_IMPORTED_MODULE_0___default.a.useContext(_ThemeContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_0___default.a.useDebugValue(theme);\n  }\n\n  return theme;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _withStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _withStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js ***!
-  \***********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n/* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n\n\n\n\n\n\n\n\n // Link a style sheet with a component.\n// It does not modify the component passed to it;\n// instead, it returns a new component, with a `classes` property.\n\nvar withStyles = function withStyles(stylesOrCreator) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return function (Component) {\n    var defaultTheme = options.defaultTheme,\n        _options$withTheme = options.withTheme,\n        withTheme = _options$withTheme === void 0 ? false : _options$withTheme,\n        name = options.name,\n        stylesOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"defaultTheme\", \"withTheme\", \"name\"]);\n\n    if (true) {\n      if (Component === undefined) {\n        throw new Error(['You are calling withStyles(styles)(Component) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n      }\n    }\n\n    var classNamePrefix = name;\n\n    if (true) {\n      if (!name) {\n        // Provide a better DX outside production.\n        var displayName = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component);\n\n        if (displayName !== undefined) {\n          classNamePrefix = displayName;\n        }\n      }\n    }\n\n    var useStyles = Object(_makeStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      defaultTheme: defaultTheme,\n      Component: Component,\n      name: name || Component.displayName,\n      classNamePrefix: classNamePrefix\n    }, stylesOptions));\n    var WithStyles = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function WithStyles(props, ref) {\n      var classesProp = props.classes,\n          innerRef = props.innerRef,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"innerRef\"]); // The wrapper receives only user supplied props, which could be a subset of\n      // the actual props Component might receive due to merging with defaultProps.\n      // So copying it here would give us the same result in the wrapper as well.\n\n\n      var classes = useStyles(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, Component.defaultProps), props));\n      var theme;\n      var more = other;\n\n      if (typeof name === 'string' || withTheme) {\n        // name and withTheme are invariant in the outer scope\n        // eslint-disable-next-line react-hooks/rules-of-hooks\n        theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_8__[\"default\"])() || defaultTheme;\n\n        if (name) {\n          more = Object(_getThemeProps__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({\n            theme: theme,\n            name: name,\n            props: other\n          });\n        } // Provide the theme to the wrapped component.\n        // So we don't have to use the `withTheme()` Higher-order Component.\n\n\n        if (withTheme && !more.theme) {\n          more.theme = theme;\n        }\n      }\n\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        ref: innerRef || ref,\n        classes: classes\n      }, more));\n    });\n     true ? WithStyles.propTypes = {\n      /**\n       * Override or extend the styles applied to the component.\n       */\n      classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n      /**\n       * Use that prop to pass a ref to the decorated component.\n       * @deprecated\n       */\n      innerRef: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object]), function (props) {\n        if (props.innerRef == null) {\n          return null;\n        }\n\n        return null; // return new Error(\n        //   'Material-UI: The `innerRef` prop is deprecated and will be removed in v5. ' +\n        //     'Refs are now automatically forwarded to the inner component.',\n        // );\n      })\n    } : undefined;\n\n    if (true) {\n      WithStyles.displayName = \"WithStyles(\".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component), \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default()(WithStyles, Component);\n\n    if (true) {\n      // Exposed for test purposes.\n      WithStyles.Naked = Component;\n      WithStyles.options = options;\n      WithStyles.useStyles = useStyles;\n    }\n\n    return WithStyles;\n  };\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (withStyles);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js ***!
-  \*****************************************************************************/
-/*! exports provided: default, withThemeCreator */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _withTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_0__[\"withThemeCreator\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js ***!
-  \*********************************************************************************/
-/*! exports provided: withThemeCreator, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return withThemeCreator; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n\n\n\n\n\n\n\nfunction withThemeCreator() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var defaultTheme = options.defaultTheme;\n\n  var withTheme = function withTheme(Component) {\n    if (true) {\n      if (Component === undefined) {\n        throw new Error(['You are calling withTheme(Component) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n      }\n    }\n\n    var WithTheme = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function WithTheme(props, ref) {\n      var innerRef = props.innerRef,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"innerRef\"]);\n\n      var theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])() || defaultTheme;\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        theme: theme,\n        ref: innerRef || ref\n      }, other));\n    });\n     true ? WithTheme.propTypes = {\n      /**\n       * Use that prop to pass a ref to the decorated component.\n       * @deprecated\n       */\n      innerRef: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object]), function (props) {\n        if (props.innerRef == null) {\n          return null;\n        }\n\n        return new Error('Material-UI: The `innerRef` prop is deprecated and will be removed in v5. ' + 'Refs are now automatically forwarded to the inner component.');\n      })\n    } : undefined;\n\n    if (true) {\n      WithTheme.displayName = \"WithTheme(\".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component), \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default()(WithTheme, Component);\n\n    if (true) {\n      // Exposed for test purposes.\n      WithTheme.Naked = Component;\n    }\n\n    return WithTheme;\n  };\n\n  return withTheme;\n} // Provide the theme object as a prop to the input component.\n// It's an alternative API to useTheme().\n// We encourage the usage of useTheme() where possible.\n\nvar withTheme = withThemeCreator();\n/* harmony default export */ __webpack_exports__[\"default\"] = (withTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/borders.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/borders.js ***!
-  \*********************************************************************/
-/*! exports provided: border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"border\", function() { return border; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderTop\", function() { return borderTop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderRight\", function() { return borderRight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderBottom\", function() { return borderBottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderLeft\", function() { return borderLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderColor\", function() { return borderColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderRadius\", function() { return borderRadius; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\n\nfunction getBorder(value) {\n  if (typeof value !== 'number') {\n    return value;\n  }\n\n  return \"\".concat(value, \"px solid\");\n}\n\nvar border = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'border',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderTop = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderTop',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderRight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderRight',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderBottom = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderBottom',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderLeft = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderLeft',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderColor = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderColor',\n  themeKey: 'palette'\n});\nvar borderRadius = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderRadius',\n  themeKey: 'shape'\n});\nvar borders = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius);\n/* harmony default export */ __webpack_exports__[\"default\"] = (borders);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/borders.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js ***!
-  \*************************************************************************/
-/*! exports provided: handleBreakpoints, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"handleBreakpoints\", function() { return handleBreakpoints; });\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\n\n // The breakpoint **start** at this value.\n// For instance with the first breakpoint xs: [xs, sm[.\n\nvar values = {\n  xs: 0,\n  sm: 600,\n  md: 960,\n  lg: 1280,\n  xl: 1920\n};\nvar defaultBreakpoints = {\n  // Sorted ASC by size. That's important.\n  // It can't be configured as it's used statically for propTypes.\n  keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n  up: function up(key) {\n    return \"@media (min-width:\".concat(values[key], \"px)\");\n  }\n};\nfunction handleBreakpoints(props, propValue, styleFromPropValue) {\n  if (true) {\n    if (!props.theme) {\n      console.error('Material-UI: You are calling a style function without a theme value.');\n    }\n  }\n\n  if (Array.isArray(propValue)) {\n    var themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n    return propValue.reduce(function (acc, item, index) {\n      acc[themeBreakpoints.up(themeBreakpoints.keys[index])] = styleFromPropValue(propValue[index]);\n      return acc;\n    }, {});\n  }\n\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(propValue) === 'object') {\n    var _themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n\n    return Object.keys(propValue).reduce(function (acc, breakpoint) {\n      acc[_themeBreakpoints.up(breakpoint)] = styleFromPropValue(propValue[breakpoint]);\n      return acc;\n    }, {});\n  }\n\n  var output = styleFromPropValue(propValue);\n  return output;\n}\n\nfunction breakpoints(styleFunction) {\n  var newStyleFunction = function newStyleFunction(props) {\n    var base = styleFunction(props);\n    var themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n    var extended = themeBreakpoints.keys.reduce(function (acc, key) {\n      if (props[key]) {\n        acc = acc || {};\n        acc[themeBreakpoints.up(key)] = styleFunction(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n          theme: props.theme\n        }, props[key]));\n      }\n\n      return acc;\n    }, null);\n    return Object(_merge__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(base, extended);\n  };\n\n  newStyleFunction.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, styleFunction.propTypes), {}, {\n    xs: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    sm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    md: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    lg: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    xl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n  }) : undefined;\n  newStyleFunction.filterProps = ['xs', 'sm', 'md', 'lg', 'xl'].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(styleFunction.filterProps));\n  return newStyleFunction;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (breakpoints);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/compose.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/compose.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\nfunction compose() {\n  for (var _len = arguments.length, styles = new Array(_len), _key = 0; _key < _len; _key++) {\n    styles[_key] = arguments[_key];\n  }\n\n  var fn = function fn(props) {\n    return styles.reduce(function (acc, style) {\n      var output = style(props);\n\n      if (output) {\n        return Object(_merge__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(acc, output);\n      }\n\n      return acc;\n    }, {});\n  }; // Alternative approach that doesn't yield any performance gain.\n  // const handlers = styles.reduce((acc, style) => {\n  //   style.filterProps.forEach(prop => {\n  //     acc[prop] = style;\n  //   });\n  //   return acc;\n  // }, {});\n  // const fn = props => {\n  //   return Object.keys(props).reduce((acc, prop) => {\n  //     if (handlers[prop]) {\n  //       return merge(acc, handlers[prop](props));\n  //     }\n  //     return acc;\n  //   }, {});\n  // };\n\n\n  fn.propTypes =  true ? styles.reduce(function (acc, style) {\n    return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(acc, style.propTypes);\n  }, {}) : undefined;\n  fn.filterProps = styles.reduce(function (acc, style) {\n    return acc.concat(style.filterProps);\n  }, []);\n  return fn;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (compose);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/compose.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/css.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/css.js ***!
-  \*****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\n\n\nfunction omit(input, fields) {\n  var output = {};\n  Object.keys(input).forEach(function (prop) {\n    if (fields.indexOf(prop) === -1) {\n      output[prop] = input[prop];\n    }\n  });\n  return output;\n}\n\nfunction css(styleFunction) {\n  var newStyleFunction = function newStyleFunction(props) {\n    var output = styleFunction(props);\n\n    if (props.css) {\n      return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, Object(_merge__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(output, styleFunction(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        theme: props.theme\n      }, props.css)))), omit(props.css, [styleFunction.filterProps]));\n    }\n\n    return output;\n  };\n\n  newStyleFunction.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, styleFunction.propTypes), {}, {\n    css: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  }) : undefined;\n  newStyleFunction.filterProps = ['css'].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(styleFunction.filterProps));\n  return newStyleFunction;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (css);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/css.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/display.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/display.js ***!
-  \*********************************************************************/
-/*! exports provided: displayPrint, displayRaw, overflow, textOverflow, visibility, whiteSpace, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"displayPrint\", function() { return displayPrint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"displayRaw\", function() { return displayRaw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"overflow\", function() { return overflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"textOverflow\", function() { return textOverflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"visibility\", function() { return visibility; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"whiteSpace\", function() { return whiteSpace; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar displayPrint = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'displayPrint',\n  cssProperty: false,\n  transform: function transform(value) {\n    return {\n      '@media print': {\n        display: value\n      }\n    };\n  }\n});\nvar displayRaw = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'display'\n});\nvar overflow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'overflow'\n});\nvar textOverflow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'textOverflow'\n});\nvar visibility = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'visibility'\n});\nvar whiteSpace = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'whiteSpace'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(displayPrint, displayRaw, overflow, textOverflow, visibility, whiteSpace));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/display.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/flexbox.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/flexbox.js ***!
-  \*********************************************************************/
-/*! exports provided: flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexBasis\", function() { return flexBasis; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexDirection\", function() { return flexDirection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexWrap\", function() { return flexWrap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifyContent\", function() { return justifyContent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignItems\", function() { return alignItems; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignContent\", function() { return alignContent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"order\", function() { return order; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flex\", function() { return flex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexGrow\", function() { return flexGrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexShrink\", function() { return flexShrink; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignSelf\", function() { return alignSelf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifyItems\", function() { return justifyItems; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifySelf\", function() { return justifySelf; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar flexBasis = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexBasis'\n});\nvar flexDirection = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexDirection'\n});\nvar flexWrap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexWrap'\n});\nvar justifyContent = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifyContent'\n});\nvar alignItems = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignItems'\n});\nvar alignContent = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignContent'\n});\nvar order = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'order'\n});\nvar flex = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flex'\n});\nvar flexGrow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexGrow'\n});\nvar flexShrink = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexShrink'\n});\nvar alignSelf = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignSelf'\n});\nvar justifyItems = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifyItems'\n});\nvar justifySelf = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifySelf'\n});\nvar flexbox = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf);\n/* harmony default export */ __webpack_exports__[\"default\"] = (flexbox);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/flexbox.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/grid.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/grid.js ***!
-  \******************************************************************/
-/*! exports provided: gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridGap\", function() { return gridGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridColumnGap\", function() { return gridColumnGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridRowGap\", function() { return gridRowGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridColumn\", function() { return gridColumn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridRow\", function() { return gridRow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoFlow\", function() { return gridAutoFlow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoColumns\", function() { return gridAutoColumns; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoRows\", function() { return gridAutoRows; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateColumns\", function() { return gridTemplateColumns; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateRows\", function() { return gridTemplateRows; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateAreas\", function() { return gridTemplateAreas; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridArea\", function() { return gridArea; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar gridGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridGap'\n});\nvar gridColumnGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridColumnGap'\n});\nvar gridRowGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridRowGap'\n});\nvar gridColumn = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridColumn'\n});\nvar gridRow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridRow'\n});\nvar gridAutoFlow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoFlow'\n});\nvar gridAutoColumns = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoColumns'\n});\nvar gridAutoRows = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoRows'\n});\nvar gridTemplateColumns = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateColumns'\n});\nvar gridTemplateRows = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateRows'\n});\nvar gridTemplateAreas = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateAreas'\n});\nvar gridArea = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridArea'\n});\nvar grid = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea);\n/* harmony default export */ __webpack_exports__[\"default\"] = (grid);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/grid.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/index.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/index.js ***!
-  \*******************************************************************/
-/*! exports provided: borders, border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius, breakpoints, compose, css, display, flexbox, flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf, grid, gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea, palette, color, bgcolor, positions, position, zIndex, top, right, bottom, left, shadows, sizing, width, maxWidth, minWidth, height, maxHeight, minHeight, sizeWidth, sizeHeight, boxSizing, spacing, createUnarySpacing, style, typography, fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _borders__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./borders */ \"./jaas-client/node_modules/@material-ui/system/esm/borders.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borders\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"border\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"border\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderTop\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderTop\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderRight\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderRight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderBottom\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderBottom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderLeft\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderLeft\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderColor\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderColor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderRadius\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderRadius\"]; });\n\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"breakpoints\", function() { return _breakpoints__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return _compose__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./css */ \"./jaas-client/node_modules/@material-ui/system/esm/css.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"css\", function() { return _css__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _display__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./display */ \"./jaas-client/node_modules/@material-ui/system/esm/display.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"display\", function() { return _display__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _flexbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./flexbox */ \"./jaas-client/node_modules/@material-ui/system/esm/flexbox.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexbox\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexBasis\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexBasis\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexDirection\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexDirection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexWrap\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexWrap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifyContent\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifyContent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignItems\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignItems\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignContent\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignContent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"order\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"order\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flex\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexGrow\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexGrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexShrink\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexShrink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignSelf\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignSelf\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifyItems\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifyItems\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifySelf\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifySelf\"]; });\n\n/* harmony import */ var _grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./grid */ \"./jaas-client/node_modules/@material-ui/system/esm/grid.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"grid\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridColumnGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridColumnGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridRowGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridRowGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridColumn\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridColumn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridRow\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoFlow\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoFlow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoColumns\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoColumns\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoRows\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoRows\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateColumns\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateColumns\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateRows\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateRows\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateAreas\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateAreas\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridArea\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridArea\"]; });\n\n/* harmony import */ var _palette__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./palette */ \"./jaas-client/node_modules/@material-ui/system/esm/palette.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"palette\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"color\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"color\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bgcolor\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"bgcolor\"]; });\n\n/* harmony import */ var _positions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./positions */ \"./jaas-client/node_modules/@material-ui/system/esm/positions.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"positions\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"position\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"position\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"zIndex\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"zIndex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"top\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"top\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"right\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"right\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bottom\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"bottom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"left\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"left\"]; });\n\n/* harmony import */ var _shadows__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./shadows */ \"./jaas-client/node_modules/@material-ui/system/esm/shadows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shadows\", function() { return _shadows__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _sizing__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./sizing */ \"./jaas-client/node_modules/@material-ui/system/esm/sizing.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizing\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"width\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"width\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"maxWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"maxWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"minWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"minWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"height\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"height\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"maxHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"maxHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"minHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"minHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizeWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"sizeWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizeHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"sizeHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"boxSizing\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"boxSizing\"]; });\n\n/* harmony import */ var _spacing__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./spacing */ \"./jaas-client/node_modules/@material-ui/system/esm/spacing.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"spacing\", function() { return _spacing__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createUnarySpacing\", function() { return _spacing__WEBPACK_IMPORTED_MODULE_11__[\"createUnarySpacing\"]; });\n\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"style\", function() { return _style__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _typography__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./typography */ \"./jaas-client/node_modules/@material-ui/system/esm/typography.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"typography\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontFamily\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontFamily\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontSize\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontSize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontStyle\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontStyle\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontWeight\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontWeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"letterSpacing\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"letterSpacing\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"lineHeight\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"lineHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"textAlign\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"textAlign\"]; });\n\n/** @license Material-UI v4.9.14\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/memoize.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/memoize.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return memoize; });\nfunction memoize(fn) {\n  var cache = {};\n  return function (arg) {\n    if (cache[arg] === undefined) {\n      cache[arg] = fn(arg);\n    }\n\n    return cache[arg];\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/memoize.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/merge.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/merge.js ***!
-  \*******************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\nfunction merge(acc, item) {\n  if (!item) {\n    return acc;\n  }\n\n  return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"deepmerge\"])(acc, item, {\n    clone: false // No need to clone deep, it's way faster.\n\n  });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (merge);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/merge.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/palette.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/palette.js ***!
-  \*********************************************************************/
-/*! exports provided: color, bgcolor, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"color\", function() { return color; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bgcolor\", function() { return bgcolor; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar color = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'color',\n  themeKey: 'palette'\n});\nvar bgcolor = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'bgcolor',\n  cssProperty: 'backgroundColor',\n  themeKey: 'palette'\n});\nvar palette = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(color, bgcolor);\n/* harmony default export */ __webpack_exports__[\"default\"] = (palette);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/palette.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/positions.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/positions.js ***!
-  \***********************************************************************/
-/*! exports provided: position, zIndex, top, right, bottom, left, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"position\", function() { return position; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"zIndex\", function() { return zIndex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"top\", function() { return top; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"right\", function() { return right; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bottom\", function() { return bottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"left\", function() { return left; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar position = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'position'\n});\nvar zIndex = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'zIndex',\n  themeKey: 'zIndex'\n});\nvar top = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'top'\n});\nvar right = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'right'\n});\nvar bottom = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'bottom'\n});\nvar left = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'left'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(position, zIndex, top, right, bottom, left));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/positions.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar responsivePropType =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.array]) : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (responsivePropType);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/shadows.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/shadows.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n\nvar boxShadow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'boxShadow',\n  themeKey: 'shadows'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (boxShadow);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/shadows.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/sizing.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/sizing.js ***!
-  \********************************************************************/
-/*! exports provided: width, maxWidth, minWidth, height, maxHeight, minHeight, sizeWidth, sizeHeight, boxSizing, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"width\", function() { return width; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"maxWidth\", function() { return maxWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"minWidth\", function() { return minWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"height\", function() { return height; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"maxHeight\", function() { return maxHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"minHeight\", function() { return minHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sizeWidth\", function() { return sizeWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sizeHeight\", function() { return sizeHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"boxSizing\", function() { return boxSizing; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\n\nfunction transform(value) {\n  return value <= 1 ? \"\".concat(value * 100, \"%\") : value;\n}\n\nvar width = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'width',\n  transform: transform\n});\nvar maxWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'maxWidth',\n  transform: transform\n});\nvar minWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'minWidth',\n  transform: transform\n});\nvar height = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'height',\n  transform: transform\n});\nvar maxHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'maxHeight',\n  transform: transform\n});\nvar minHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'minHeight',\n  transform: transform\n});\nvar sizeWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'size',\n  cssProperty: 'width',\n  transform: transform\n});\nvar sizeHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'size',\n  cssProperty: 'height',\n  transform: transform\n});\nvar boxSizing = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'boxSizing'\n});\nvar sizing = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(width, maxWidth, minWidth, height, maxHeight, minHeight, boxSizing);\n/* harmony default export */ __webpack_exports__[\"default\"] = (sizing);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/sizing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/spacing.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/spacing.js ***!
-  \*********************************************************************/
-/*! exports provided: createUnarySpacing, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createUnarySpacing\", function() { return createUnarySpacing; });\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _responsivePropType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./responsivePropType */ \"./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js\");\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n/* harmony import */ var _memoize__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./memoize */ \"./jaas-client/node_modules/@material-ui/system/esm/memoize.js\");\n\n\n\n\n\nvar properties = {\n  m: 'margin',\n  p: 'padding'\n};\nvar directions = {\n  t: 'Top',\n  r: 'Right',\n  b: 'Bottom',\n  l: 'Left',\n  x: ['Left', 'Right'],\n  y: ['Top', 'Bottom']\n};\nvar aliases = {\n  marginX: 'mx',\n  marginY: 'my',\n  paddingX: 'px',\n  paddingY: 'py'\n}; // memoize() impact:\n// From 300,000 ops/sec\n// To 350,000 ops/sec\n\nvar getCssProperties = Object(_memoize__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(function (prop) {\n  // It's not a shorthand notation.\n  if (prop.length > 2) {\n    if (aliases[prop]) {\n      prop = aliases[prop];\n    } else {\n      return [prop];\n    }\n  }\n\n  var _prop$split = prop.split(''),\n      _prop$split2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_prop$split, 2),\n      a = _prop$split2[0],\n      b = _prop$split2[1];\n\n  var property = properties[a];\n  var direction = directions[b] || '';\n  return Array.isArray(direction) ? direction.map(function (dir) {\n    return property + dir;\n  }) : [property + direction];\n});\nvar spacingKeys = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'p', 'pt', 'pr', 'pb', 'pl', 'px', 'py', 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'marginX', 'marginY', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'paddingX', 'paddingY'];\nfunction createUnarySpacing(theme) {\n  var themeSpacing = theme.spacing || 8;\n\n  if (typeof themeSpacing === 'number') {\n    return function (abs) {\n      if (true) {\n        if (typeof abs !== 'number') {\n          console.error(\"Material-UI: Expected spacing argument to be a number, got \".concat(abs, \".\"));\n        }\n      }\n\n      return themeSpacing * abs;\n    };\n  }\n\n  if (Array.isArray(themeSpacing)) {\n    return function (abs) {\n      if (true) {\n        if (abs > themeSpacing.length - 1) {\n          console.error([\"Material-UI: The value provided (\".concat(abs, \") overflows.\"), \"The supported values are: \".concat(JSON.stringify(themeSpacing), \".\"), \"\".concat(abs, \" > \").concat(themeSpacing.length - 1, \", you need to add the missing values.\")].join('\\n'));\n        }\n      }\n\n      return themeSpacing[abs];\n    };\n  }\n\n  if (typeof themeSpacing === 'function') {\n    return themeSpacing;\n  }\n\n  if (true) {\n    console.error([\"Material-UI: The `theme.spacing` value (\".concat(themeSpacing, \") is invalid.\"), 'It should be a number, an array or a function.'].join('\\n'));\n  }\n\n  return function () {\n    return undefined;\n  };\n}\n\nfunction getValue(transformer, propValue) {\n  if (typeof propValue === 'string') {\n    return propValue;\n  }\n\n  var abs = Math.abs(propValue);\n  var transformed = transformer(abs);\n\n  if (propValue >= 0) {\n    return transformed;\n  }\n\n  if (typeof transformed === 'number') {\n    return -transformed;\n  }\n\n  return \"-\".concat(transformed);\n}\n\nfunction getStyleFromPropValue(cssProperties, transformer) {\n  return function (propValue) {\n    return cssProperties.reduce(function (acc, cssProperty) {\n      acc[cssProperty] = getValue(transformer, propValue);\n      return acc;\n    }, {});\n  };\n}\n\nfunction spacing(props) {\n  var theme = props.theme;\n  var transformer = createUnarySpacing(theme);\n  return Object.keys(props).map(function (prop) {\n    // Using a hash computation over an array iteration could be faster, but with only 28 items,\n    // it's doesn't worth the bundle size.\n    if (spacingKeys.indexOf(prop) === -1) {\n      return null;\n    }\n\n    var cssProperties = getCssProperties(prop);\n    var styleFromPropValue = getStyleFromPropValue(cssProperties, transformer);\n    var propValue = props[prop];\n    return Object(_breakpoints__WEBPACK_IMPORTED_MODULE_2__[\"handleBreakpoints\"])(props, propValue, styleFromPropValue);\n  }).reduce(_merge__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {});\n}\n\nspacing.propTypes =  true ? spacingKeys.reduce(function (obj, key) {\n  obj[key] = _responsivePropType__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n  return obj;\n}, {}) : undefined;\nspacing.filterProps = spacingKeys;\n/* harmony default export */ __webpack_exports__[\"default\"] = (spacing);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/spacing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/style.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/style.js ***!
-  \*******************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _responsivePropType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./responsivePropType */ \"./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js\");\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n\n\n\n\nfunction getPath(obj, path) {\n  if (!path || typeof path !== 'string') {\n    return null;\n  }\n\n  return path.split('.').reduce(function (acc, item) {\n    return acc && acc[item] ? acc[item] : null;\n  }, obj);\n}\n\nfunction style(options) {\n  var prop = options.prop,\n      _options$cssProperty = options.cssProperty,\n      cssProperty = _options$cssProperty === void 0 ? options.prop : _options$cssProperty,\n      themeKey = options.themeKey,\n      transform = options.transform;\n\n  var fn = function fn(props) {\n    if (props[prop] == null) {\n      return null;\n    }\n\n    var propValue = props[prop];\n    var theme = props.theme;\n    var themeMapping = getPath(theme, themeKey) || {};\n\n    var styleFromPropValue = function styleFromPropValue(propValueFinal) {\n      var value;\n\n      if (typeof themeMapping === 'function') {\n        value = themeMapping(propValueFinal);\n      } else if (Array.isArray(themeMapping)) {\n        value = themeMapping[propValueFinal] || propValueFinal;\n      } else {\n        value = getPath(themeMapping, propValueFinal) || propValueFinal;\n\n        if (transform) {\n          value = transform(value);\n        }\n      }\n\n      if (cssProperty === false) {\n        return value;\n      }\n\n      return Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, cssProperty, value);\n    };\n\n    return Object(_breakpoints__WEBPACK_IMPORTED_MODULE_2__[\"handleBreakpoints\"])(props, propValue, styleFromPropValue);\n  };\n\n  fn.propTypes =  true ? Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, prop, _responsivePropType__WEBPACK_IMPORTED_MODULE_1__[\"default\"]) : undefined;\n  fn.filterProps = [prop];\n  return fn;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (style);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/style.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/system/esm/typography.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/system/esm/typography.js ***!
-  \************************************************************************/
-/*! exports provided: fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontFamily\", function() { return fontFamily; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontSize\", function() { return fontSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontStyle\", function() { return fontStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontWeight\", function() { return fontWeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"letterSpacing\", function() { return letterSpacing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lineHeight\", function() { return lineHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"textAlign\", function() { return textAlign; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar fontFamily = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontFamily',\n  themeKey: 'typography'\n});\nvar fontSize = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontSize',\n  themeKey: 'typography'\n});\nvar fontStyle = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontStyle',\n  themeKey: 'typography'\n});\nvar fontWeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontWeight',\n  themeKey: 'typography'\n});\nvar letterSpacing = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'letterSpacing'\n});\nvar lineHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'lineHeight'\n});\nvar textAlign = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'textAlign'\n});\nvar typography = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign);\n/* harmony default export */ __webpack_exports__[\"default\"] = (typography);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/typography.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return HTMLElementType; });\nfunction HTMLElementType(props, propName, componentName, location, propFullName) {\n  if (false) {}\n\n  var propValue = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (propValue == null) {\n    return null;\n  }\n\n  if (propValue && propValue.nodeType !== 1) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an HTMLElement.\");\n  }\n\n  return null;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return chainPropTypes; });\nfunction chainPropTypes(propType1, propType2) {\n  if (false) {}\n\n  return function validate() {\n    return propType1.apply(void 0, arguments) || propType2.apply(void 0, arguments);\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js ***!
-  \**********************************************************************/
-/*! exports provided: isPlainObject, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isPlainObject\", function() { return isPlainObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return deepmerge; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n\n\nfunction isPlainObject(item) {\n  return item && Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(item) === 'object' && item.constructor === Object;\n}\nfunction deepmerge(target, source) {\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n    clone: true\n  };\n  var output = options.clone ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, target) : target;\n\n  if (isPlainObject(target) && isPlainObject(source)) {\n    Object.keys(source).forEach(function (key) {\n      // Avoid prototype pollution\n      if (key === '__proto__') {\n        return;\n      }\n\n      if (isPlainObject(source[key]) && key in target) {\n        output[key] = deepmerge(target[key], source[key], options);\n      } else {\n        output[key] = source[key];\n      }\n    });\n  }\n\n  return output;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n\n\n\nfunction isClassComponent(elementType) {\n  // elementType.prototype?.isReactComponent\n  var _elementType$prototyp = elementType.prototype,\n      prototype = _elementType$prototyp === void 0 ? {} : _elementType$prototyp;\n  return Boolean(prototype.isReactComponent);\n}\n\nfunction acceptingRef(props, propName, componentName, location, propFullName) {\n  var element = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (element == null) {\n    return null;\n  }\n\n  var warningHint;\n  var elementType = element.type;\n  /**\n   * Blacklisting instead of whitelisting\n   *\n   * Blacklisting will miss some components, such as React.Fragment. Those will at least\n   * trigger a warning in React.\n   * We can't whitelist because there is no safe way to detect React.forwardRef\n   * or class components. \"Safe\" means there's no public API.\n   *\n   */\n\n  if (typeof elementType === 'function' && !isClassComponent(elementType)) {\n    warningHint = 'Did you accidentally use a plain function component for an element instead?';\n  }\n\n  if (warningHint !== undefined) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an element that can hold a ref. \".concat(warningHint, \" \") + 'For more information see https://material-ui.com/r/caveat-with-refs-guide');\n  }\n\n  return null;\n}\n\nvar elementAcceptingRef = Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element, acceptingRef);\nelementAcceptingRef.isRequired = Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element.isRequired, acceptingRef);\n/* harmony default export */ __webpack_exports__[\"default\"] = (elementAcceptingRef);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js":
-/*!************************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js ***!
-  \************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n\n\n\nfunction isClassComponent(elementType) {\n  // elementType.prototype?.isReactComponent\n  var _elementType$prototyp = elementType.prototype,\n      prototype = _elementType$prototyp === void 0 ? {} : _elementType$prototyp;\n  return Boolean(prototype.isReactComponent);\n}\n\nfunction elementTypeAcceptingRef(props, propName, componentName, location, propFullName) {\n  var propValue = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (propValue == null) {\n    return null;\n  }\n\n  var warningHint;\n  /**\n   * Blacklisting instead of whitelisting\n   *\n   * Blacklisting will miss some components, such as React.Fragment. Those will at least\n   * trigger a warning in React.\n   * We can't whitelist because there is no safe way to detect React.forwardRef\n   * or class components. \"Safe\" means there's no public API.\n   *\n   */\n\n  if (typeof propValue === 'function' && !isClassComponent(propValue)) {\n    warningHint = 'Did you accidentally provide a plain function component instead?';\n  }\n\n  if (warningHint !== undefined) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an element type that can hold a ref. \".concat(warningHint, \" \") + 'For more information see https://material-ui.com/r/caveat-with-refs-guide');\n  }\n\n  return null;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0__[\"elementType\"], elementTypeAcceptingRef));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js ***!
-  \**********************************************************************/
-/*! exports provided: specialProperty, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"specialProperty\", function() { return specialProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return exactProp; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n\n\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n// Only exported for test purposes.\nvar specialProperty = \"exact-prop: \\u200B\";\nfunction exactProp(propTypes) {\n  if (false) {}\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, propTypes, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, specialProperty, function (props) {\n    var unsupportedProps = Object.keys(props).filter(function (prop) {\n      return !propTypes.hasOwnProperty(prop);\n    });\n\n    if (unsupportedProps.length > 0) {\n      return new Error(\"The following props are not supported: \".concat(unsupportedProps.map(function (prop) {\n        return \"`\".concat(prop, \"`\");\n      }).join(', '), \". Please remove them.\"));\n    }\n\n    return null;\n  }));\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return formatMuiErrorMessage; });\n/**\n * WARNING: Don't import this directly.\n * Use `MuiError` from `@material-ui/utils/macros/MuiError.macro` instead.\n * @param {number} code\n */\nfunction formatMuiErrorMessage(code) {\n  // Apply babel-plugin-transform-template-literals in loose mode\n  // loose mode is safe iff we're concatenating primitives\n  // see https://babeljs.io/docs/en/babel-plugin-transform-template-literals#loose\n\n  /* eslint-disable prefer-template */\n  var url = 'https://material-ui.com/production-error/?code=' + code;\n\n  for (var i = 1; i < arguments.length; i += 1) {\n    // rest params over-transpile for this case\n    // eslint-disable-next-line prefer-rest-params\n    url += '&args[]=' + encodeURIComponent(arguments[i]);\n  }\n\n  return 'Minified Material-UI error #' + code + '; visit ' + url + ' for the full message.';\n  /* eslint-enable prefer-template */\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js ***!
-  \***************************************************************************/
-/*! exports provided: getFunctionName, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFunctionName\", function() { return getFunctionName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getDisplayName; });\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_1__);\n\n // Simplified polyfill for IE 11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\n\nvar fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\nfunction getFunctionName(fn) {\n  var match = \"\".concat(fn).match(fnNameMatchRegex);\n  var name = match && match[1];\n  return name || '';\n}\n/**\n * @param {function} Component\n * @param {string} fallback\n * @returns {string | undefined}\n */\n\nfunction getFunctionComponentName(Component) {\n  var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  return Component.displayName || Component.name || getFunctionName(Component) || fallback;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = getFunctionComponentName(innerType);\n  return outerType.displayName || (functionName !== '' ? \"\".concat(wrapperName, \"(\").concat(functionName, \")\") : wrapperName);\n}\n/**\n * cherry-pick from\n * https://github.com/facebook/react/blob/769b1f270e1251d9dbdce0fcbd9e92e502d059b8/packages/shared/getComponentName.js\n * originally forked from recompose/getDisplayName with added IE 11 support\n *\n * @param {React.ReactType} Component\n * @returns {string | undefined}\n */\n\n\nfunction getDisplayName(Component) {\n  if (Component == null) {\n    return undefined;\n  }\n\n  if (typeof Component === 'string') {\n    return Component;\n  }\n\n  if (typeof Component === 'function') {\n    return getFunctionComponentName(Component, 'Component');\n  }\n\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Component) === 'object') {\n    switch (Component.$$typeof) {\n      case react_is__WEBPACK_IMPORTED_MODULE_1__[\"ForwardRef\"]:\n        return getWrappedName(Component, Component.render, 'ForwardRef');\n\n      case react_is__WEBPACK_IMPORTED_MODULE_1__[\"Memo\"]:\n        return getWrappedName(Component, Component.type, 'memo');\n\n      default:\n        return undefined;\n    }\n  }\n\n  return undefined;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/index.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/index.js ***!
-  \******************************************************************/
-/*! exports provided: chainPropTypes, deepmerge, elementAcceptingRef, elementTypeAcceptingRef, exactProp, formatMuiErrorMessage, getDisplayName, HTMLElementType, ponyfillGlobal, refType */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chainPropTypes\", function() { return _chainPropTypes__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _deepmerge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deepmerge */ \"./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deepmerge\", function() { return _deepmerge__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _elementAcceptingRef__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./elementAcceptingRef */ \"./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"elementAcceptingRef\", function() { return _elementAcceptingRef__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _elementTypeAcceptingRef__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./elementTypeAcceptingRef */ \"./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"elementTypeAcceptingRef\", function() { return _elementTypeAcceptingRef__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _exactProp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./exactProp */ \"./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"exactProp\", function() { return _exactProp__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _formatMuiErrorMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./formatMuiErrorMessage */ \"./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"formatMuiErrorMessage\", function() { return _formatMuiErrorMessage__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _getDisplayName__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getDisplayName */ \"./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"getDisplayName\", function() { return _getDisplayName__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _HTMLElementType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./HTMLElementType */ \"./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"HTMLElementType\", function() { return _HTMLElementType__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _ponyfillGlobal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ponyfillGlobal */ \"./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ponyfillGlobal\", function() { return _ponyfillGlobal__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _refType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./refType */ \"./jaas-client/node_modules/@material-ui/utils/esm/refType.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"refType\", function() { return _refType__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/** @license Material-UI v4.10.2\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n/* harmony default export */ __webpack_exports__[\"default\"] = (typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')());\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/@material-ui/utils/esm/refType.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/@material-ui/utils/esm/refType.js ***!
-  \********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar refType = prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (refType);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/refType.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/after/index.js":
-/*!*************************************************!*\
-  !*** ./jaas-client/node_modules/after/index.js ***!
-  \*************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/after/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/arraybuffer.slice/index.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/arraybuffer.slice/index.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/arraybuffer.slice/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/backo2/index.js":
-/*!**************************************************!*\
-  !*** ./jaas-client/node_modules/backo2/index.js ***!
-  \**************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/backo2/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js ***!
-  \*******************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(){\n  \"use strict\";\n\n  var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n  // Use a lookup table to find the index.\n  var lookup = new Uint8Array(256);\n  for (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n  }\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = lookup[base64.charCodeAt(i)];\n      encoded2 = lookup[base64.charCodeAt(i+1)];\n      encoded3 = lookup[base64.charCodeAt(i+2)];\n      encoded4 = lookup[base64.charCodeAt(i+3)];\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})();\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/blob/index.js":
-/*!************************************************!*\
-  !*** ./jaas-client/node_modules/blob/index.js ***!
-  \************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\r\n * Create a blob builder even when vendor prefixes exist\r\n */\r\n\r\nvar BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\r\n  typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :\r\n  typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\r\n  typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : \r\n  false;\r\n\r\n/**\r\n * Check if Blob constructor is supported\r\n */\r\n\r\nvar blobSupported = (function() {\r\n  try {\r\n    var a = new Blob(['hi']);\r\n    return a.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if Blob constructor supports ArrayBufferViews\r\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\r\n */\r\n\r\nvar blobSupportsArrayBufferView = blobSupported && (function() {\r\n  try {\r\n    var b = new Blob([new Uint8Array([1,2])]);\r\n    return b.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if BlobBuilder is supported\r\n */\r\n\r\nvar blobBuilderSupported = BlobBuilder\r\n  && BlobBuilder.prototype.append\r\n  && BlobBuilder.prototype.getBlob;\r\n\r\n/**\r\n * Helper function that maps ArrayBufferViews to ArrayBuffers\r\n * Used by BlobBuilder constructor and old browsers that didn't\r\n * support it in the Blob constructor.\r\n */\r\n\r\nfunction mapArrayBufferViews(ary) {\r\n  return ary.map(function(chunk) {\r\n    if (chunk.buffer instanceof ArrayBuffer) {\r\n      var buf = chunk.buffer;\r\n\r\n      // if this is a subarray, make a copy so we only\r\n      // include the subarray region from the underlying buffer\r\n      if (chunk.byteLength !== buf.byteLength) {\r\n        var copy = new Uint8Array(chunk.byteLength);\r\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\r\n        buf = copy.buffer;\r\n      }\r\n\r\n      return buf;\r\n    }\r\n\r\n    return chunk;\r\n  });\r\n}\r\n\r\nfunction BlobBuilderConstructor(ary, options) {\r\n  options = options || {};\r\n\r\n  var bb = new BlobBuilder();\r\n  mapArrayBufferViews(ary).forEach(function(part) {\r\n    bb.append(part);\r\n  });\r\n\r\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\r\n};\r\n\r\nfunction BlobConstructor(ary, options) {\r\n  return new Blob(mapArrayBufferViews(ary), options || {});\r\n};\r\n\r\nif (typeof Blob !== 'undefined') {\r\n  BlobBuilderConstructor.prototype = Blob.prototype;\r\n  BlobConstructor.prototype = Blob.prototype;\r\n}\r\n\r\nmodule.exports = (function() {\r\n  if (blobSupported) {\r\n    return blobSupportsArrayBufferView ? Blob : BlobConstructor;\r\n  } else if (blobBuilderSupported) {\r\n    return BlobBuilderConstructor;\r\n  } else {\r\n    return undefined;\r\n  }\r\n})();\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/blob/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/clsx/dist/clsx.m.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/clsx/dist/clsx.m.js ***!
-  \******************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nfunction toVal(mix) {\n\tvar k, y, str='';\n\n\tif (typeof mix === 'string' || typeof mix === 'number') {\n\t\tstr += mix;\n\t} else if (typeof mix === 'object') {\n\t\tif (Array.isArray(mix)) {\n\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tif (y = toVal(mix[k])) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (k in mix) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\tstr += k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn str;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (function () {\n\tvar i=0, tmp, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (tmp = arguments[i++]) {\n\t\t\tif (x = toVal(tmp)) {\n\t\t\t\tstr && (str += ' ');\n\t\t\t\tstr += x\n\t\t\t}\n\t\t}\n\t}\n\treturn str;\n});\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/clsx/dist/clsx.m.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/component-bind/index.js":
-/*!**********************************************************!*\
-  !*** ./jaas-client/node_modules/component-bind/index.js ***!
-  \**********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-bind/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/component-emitter/index.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/component-emitter/index.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n\r\n  // Remove event specific arrays for event types that no\r\n  // one is subscribed for to avoid memory leak.\r\n  if (callbacks.length === 0) {\r\n    delete this._callbacks['$' + event];\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  var args = new Array(arguments.length - 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  for (var i = 1; i < arguments.length; i++) {\r\n    args[i - 1] = arguments[i];\r\n  }\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-emitter/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/component-inherit/index.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/component-inherit/index.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-inherit/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js ***!
-  \********************************************************************/
-/*! exports provided: prefix, supportedKeyframes, supportedProperty, supportedValue */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"prefix\", function() { return prefix; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedKeyframes\", function() { return supportedKeyframes; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedProperty\", function() { return supportedProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedValue\", function() { return supportedValue; });\n/* harmony import */ var is_in_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! is-in-browser */ \"./jaas-client/node_modules/is-in-browser/dist/module.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n\n\n\n// Export javascript style and css style vendor prefixes.\nvar js = '';\nvar css = '';\nvar vendor = '';\nvar browser = '';\nvar isTouch = is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"] && 'ontouchstart' in document.documentElement; // We should not do anything if required serverside.\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n  // Order matters. We need to check Webkit the last one because\n  // other vendors use to add Webkit prefixes to some properties\n  var jsCssMap = {\n    Moz: '-moz-',\n    ms: '-ms-',\n    O: '-o-',\n    Webkit: '-webkit-'\n  };\n\n  var _document$createEleme = document.createElement('p'),\n      style = _document$createEleme.style;\n\n  var testProp = 'Transform';\n\n  for (var key in jsCssMap) {\n    if (key + testProp in style) {\n      js = key;\n      css = jsCssMap[key];\n      break;\n    }\n  } // Correctly detect the Edge browser.\n\n\n  if (js === 'Webkit' && 'msHyphens' in style) {\n    js = 'ms';\n    css = jsCssMap.ms;\n    browser = 'edge';\n  } // Correctly detect the Safari browser.\n\n\n  if (js === 'Webkit' && '-apple-trailing-word' in style) {\n    vendor = 'apple';\n  }\n}\n/**\n * Vendor prefix string for the current browser.\n *\n * @type {{js: String, css: String, vendor: String, browser: String}}\n * @api public\n */\n\n\nvar prefix = {\n  js: js,\n  css: css,\n  vendor: vendor,\n  browser: browser,\n  isTouch: isTouch\n};\n\n/**\n * Test if a keyframe at-rule should be prefixed or not\n *\n * @param {String} vendor prefix string for the current browser.\n * @return {String}\n * @api public\n */\n\nfunction supportedKeyframes(key) {\n  // Keyframes is already prefixed. e.g. key = '@-webkit-keyframes a'\n  if (key[1] === '-') return key; // No need to prefix IE/Edge. Older browsers will ignore unsupported rules.\n  // https://caniuse.com/#search=keyframes\n\n  if (prefix.js === 'ms') return key;\n  return \"@\" + prefix.css + \"keyframes\" + key.substr(10);\n}\n\n// https://caniuse.com/#search=appearance\n\nvar appearence = {\n  noPrefill: ['appearance'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'appearance') return false;\n    if (prefix.js === 'ms') return \"-webkit-\" + prop;\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=color-adjust\n\nvar colorAdjust = {\n  noPrefill: ['color-adjust'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'color-adjust') return false;\n    if (prefix.js === 'Webkit') return prefix.css + \"print-\" + prop;\n    return prop;\n  }\n};\n\nvar regExp = /[-\\s]+(.)?/g;\n/**\n * Replaces the letter with the capital letter\n *\n * @param {String} match\n * @param {String} c\n * @return {String}\n * @api private\n */\n\nfunction toUpper(match, c) {\n  return c ? c.toUpperCase() : '';\n}\n/**\n * Convert dash separated strings to camel-cased.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\n\nfunction camelize(str) {\n  return str.replace(regExp, toUpper);\n}\n\n/**\n * Convert dash separated strings to pascal cased.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction pascalize(str) {\n  return camelize(\"-\" + str);\n}\n\n// but we can use a longhand property instead.\n// https://caniuse.com/#search=mask\n\nvar mask = {\n  noPrefill: ['mask'],\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^mask/.test(prop)) return false;\n\n    if (prefix.js === 'Webkit') {\n      var longhand = 'mask-image';\n\n      if (camelize(longhand) in style) {\n        return prop;\n      }\n\n      if (prefix.js + pascalize(longhand) in style) {\n        return prefix.css + prop;\n      }\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=text-orientation\n\nvar textOrientation = {\n  noPrefill: ['text-orientation'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'text-orientation') return false;\n\n    if (prefix.vendor === 'apple' && !prefix.isTouch) {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=transform\n\nvar transform = {\n  noPrefill: ['transform'],\n  supportedProperty: function supportedProperty(prop, style, options) {\n    if (prop !== 'transform') return false;\n\n    if (options.transform) {\n      return prop;\n    }\n\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=transition\n\nvar transition = {\n  noPrefill: ['transition'],\n  supportedProperty: function supportedProperty(prop, style, options) {\n    if (prop !== 'transition') return false;\n\n    if (options.transition) {\n      return prop;\n    }\n\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=writing-mode\n\nvar writingMode = {\n  noPrefill: ['writing-mode'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'writing-mode') return false;\n\n    if (prefix.js === 'Webkit' || prefix.js === 'ms' && prefix.browser !== 'edge') {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=user-select\n\nvar userSelect = {\n  noPrefill: ['user-select'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'user-select') return false;\n\n    if (prefix.js === 'Moz' || prefix.js === 'ms' || prefix.vendor === 'apple') {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=multicolumn\n// https://github.com/postcss/autoprefixer/issues/491\n// https://github.com/postcss/autoprefixer/issues/177\n\nvar breakPropsOld = {\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^break-/.test(prop)) return false;\n\n    if (prefix.js === 'Webkit') {\n      var jsProp = \"WebkitColumn\" + pascalize(prop);\n      return jsProp in style ? prefix.css + \"column-\" + prop : false;\n    }\n\n    if (prefix.js === 'Moz') {\n      var _jsProp = \"page\" + pascalize(prop);\n\n      return _jsProp in style ? \"page-\" + prop : false;\n    }\n\n    return false;\n  }\n};\n\n// See https://github.com/postcss/autoprefixer/issues/324.\n\nvar inlineLogicalOld = {\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^(border|margin|padding)-inline/.test(prop)) return false;\n    if (prefix.js === 'Moz') return prop;\n    var newProp = prop.replace('-inline', '');\n    return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n  }\n};\n\n// Camelization is required because we can't test using.\n// CSS syntax for e.g. in FF.\n\nvar unprefixed = {\n  supportedProperty: function supportedProperty(prop, style) {\n    return camelize(prop) in style ? prop : false;\n  }\n};\n\nvar prefixed = {\n  supportedProperty: function supportedProperty(prop, style) {\n    var pascalized = pascalize(prop); // Return custom CSS variable without prefixing.\n\n    if (prop[0] === '-') return prop; // Return already prefixed value without prefixing.\n\n    if (prop[0] === '-' && prop[1] === '-') return prop;\n    if (prefix.js + pascalized in style) return prefix.css + prop; // Try webkit fallback.\n\n    if (prefix.js !== 'Webkit' && \"Webkit\" + pascalized in style) return \"-webkit-\" + prop;\n    return false;\n  }\n};\n\n// https://caniuse.com/#search=scroll-snap\n\nvar scrollSnap = {\n  supportedProperty: function supportedProperty(prop) {\n    if (prop.substring(0, 11) !== 'scroll-snap') return false;\n\n    if (prefix.js === 'ms') {\n      return \"\" + prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=overscroll-behavior\n\nvar overscrollBehavior = {\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'overscroll-behavior') return false;\n\n    if (prefix.js === 'ms') {\n      return prefix.css + \"scroll-chaining\";\n    }\n\n    return prop;\n  }\n};\n\nvar propMap = {\n  'flex-grow': 'flex-positive',\n  'flex-shrink': 'flex-negative',\n  'flex-basis': 'flex-preferred-size',\n  'justify-content': 'flex-pack',\n  order: 'flex-order',\n  'align-items': 'flex-align',\n  'align-content': 'flex-line-pack' // 'align-self' is handled by 'align-self' plugin.\n\n}; // Support old flex spec from 2012.\n\nvar flex2012 = {\n  supportedProperty: function supportedProperty(prop, style) {\n    var newProp = propMap[prop];\n    if (!newProp) return false;\n    return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n  }\n};\n\nvar propMap$1 = {\n  flex: 'box-flex',\n  'flex-grow': 'box-flex',\n  'flex-direction': ['box-orient', 'box-direction'],\n  order: 'box-ordinal-group',\n  'align-items': 'box-align',\n  'flex-flow': ['box-orient', 'box-direction'],\n  'justify-content': 'box-pack'\n};\nvar propKeys = Object.keys(propMap$1);\n\nvar prefixCss = function prefixCss(p) {\n  return prefix.css + p;\n}; // Support old flex spec from 2009.\n\n\nvar flex2009 = {\n  supportedProperty: function supportedProperty(prop, style, _ref) {\n    var multiple = _ref.multiple;\n\n    if (propKeys.indexOf(prop) > -1) {\n      var newProp = propMap$1[prop];\n\n      if (!Array.isArray(newProp)) {\n        return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n      }\n\n      if (!multiple) return false;\n\n      for (var i = 0; i < newProp.length; i++) {\n        if (!(prefix.js + pascalize(newProp[0]) in style)) {\n          return false;\n        }\n      }\n\n      return newProp.map(prefixCss);\n    }\n\n    return false;\n  }\n};\n\n// plugins = [\n//   ...plugins,\n//    breakPropsOld,\n//    inlineLogicalOld,\n//    unprefixed,\n//    prefixed,\n//    scrollSnap,\n//    flex2012,\n//    flex2009\n// ]\n// Plugins without 'noPrefill' value, going last.\n// 'flex-*' plugins should be at the bottom.\n// 'flex2009' going after 'flex2012'.\n// 'prefixed' going after 'unprefixed'\n\nvar plugins = [appearence, colorAdjust, mask, textOrientation, transform, transition, writingMode, userSelect, breakPropsOld, inlineLogicalOld, unprefixed, prefixed, scrollSnap, overscrollBehavior, flex2012, flex2009];\nvar propertyDetectors = plugins.filter(function (p) {\n  return p.supportedProperty;\n}).map(function (p) {\n  return p.supportedProperty;\n});\nvar noPrefill = plugins.filter(function (p) {\n  return p.noPrefill;\n}).reduce(function (a, p) {\n  a.push.apply(a, Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(p.noPrefill));\n  return a;\n}, []);\n\nvar el;\nvar cache = {};\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n  el = document.createElement('p'); // We test every property on vendor prefix requirement.\n  // Once tested, result is cached. It gives us up to 70% perf boost.\n  // http://jsperf.com/element-style-object-access-vs-plain-object\n  //\n  // Prefill cache with known css properties to reduce amount of\n  // properties we need to feature test at runtime.\n  // http://davidwalsh.name/vendor-prefix\n\n  var computed = window.getComputedStyle(document.documentElement, '');\n\n  for (var key$1 in computed) {\n    // eslint-disable-next-line no-restricted-globals\n    if (!isNaN(key$1)) cache[computed[key$1]] = computed[key$1];\n  } // Properties that cannot be correctly detected using the\n  // cache prefill method.\n\n\n  noPrefill.forEach(function (x) {\n    return delete cache[x];\n  });\n}\n/**\n * Test if a property is supported, returns supported property with vendor\n * prefix if required. Returns `false` if not supported.\n *\n * @param {String} prop dash separated\n * @param {Object} [options]\n * @return {String|Boolean}\n * @api public\n */\n\n\nfunction supportedProperty(prop, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  // For server-side rendering.\n  if (!el) return prop; // Remove cache for benchmark tests or return property from the cache.\n\n  if ( true && cache[prop] != null) {\n    return cache[prop];\n  } // Check if 'transition' or 'transform' natively supported in browser.\n\n\n  if (prop === 'transition' || prop === 'transform') {\n    options[prop] = prop in el.style;\n  } // Find a plugin for current prefix property.\n\n\n  for (var i = 0; i < propertyDetectors.length; i++) {\n    cache[prop] = propertyDetectors[i](prop, el.style, options); // Break loop, if value found.\n\n    if (cache[prop]) break;\n  } // Reset styles for current property.\n  // Firefox can even throw an error for invalid properties, e.g., \"0\".\n\n\n  try {\n    el.style[prop] = '';\n  } catch (err) {\n    return false;\n  }\n\n  return cache[prop];\n}\n\nvar cache$1 = {};\nvar transitionProperties = {\n  transition: 1,\n  'transition-property': 1,\n  '-webkit-transition': 1,\n  '-webkit-transition-property': 1\n};\nvar transPropsRegExp = /(^\\s*[\\w-]+)|, (\\s*[\\w-]+)(?![^()]*\\))/g;\nvar el$1;\n/**\n * Returns prefixed value transition/transform if needed.\n *\n * @param {String} match\n * @param {String} p1\n * @param {String} p2\n * @return {String}\n * @api private\n */\n\nfunction prefixTransitionCallback(match, p1, p2) {\n  if (p1 === 'var') return 'var';\n  if (p1 === 'all') return 'all';\n  if (p2 === 'all') return ', all';\n  var prefixedValue = p1 ? supportedProperty(p1) : \", \" + supportedProperty(p2);\n  if (!prefixedValue) return p1 || p2;\n  return prefixedValue;\n}\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) el$1 = document.createElement('p');\n/**\n * Returns prefixed value if needed. Returns `false` if value is not supported.\n *\n * @param {String} property\n * @param {String} value\n * @return {String|Boolean}\n * @api public\n */\n\nfunction supportedValue(property, value) {\n  // For server-side rendering.\n  var prefixedValue = value;\n  if (!el$1 || property === 'content') return value; // It is a string or a number as a string like '1'.\n  // We want only prefixable values here.\n  // eslint-disable-next-line no-restricted-globals\n\n  if (typeof prefixedValue !== 'string' || !isNaN(parseInt(prefixedValue, 10))) {\n    return prefixedValue;\n  } // Create cache key for current value.\n\n\n  var cacheKey = property + prefixedValue; // Remove cache for benchmark tests or return value from cache.\n\n  if ( true && cache$1[cacheKey] != null) {\n    return cache$1[cacheKey];\n  } // IE can even throw an error in some cases, for e.g. style.content = 'bar'.\n\n\n  try {\n    // Test value as it is.\n    el$1.style[property] = prefixedValue;\n  } catch (err) {\n    // Return false if value not supported.\n    cache$1[cacheKey] = false;\n    return false;\n  } // If 'transition' or 'transition-property' property.\n\n\n  if (transitionProperties[property]) {\n    prefixedValue = prefixedValue.replace(transPropsRegExp, prefixTransitionCallback);\n  } else if (el$1.style[property] === '') {\n    // Value with a vendor prefix.\n    prefixedValue = prefix.css + prefixedValue; // Hardcode test to convert \"flex\" to \"-ms-flexbox\" for IE10.\n\n    if (prefixedValue === '-ms-flex') el$1.style[property] = '-ms-flexbox'; // Test prefixed value.\n\n    el$1.style[property] = prefixedValue; // Return false if value not supported.\n\n    if (el$1.style[property] === '') {\n      cache$1[cacheKey] = false;\n      return false;\n    }\n  } // Reset styles for current property.\n\n\n  el$1.style[property] = ''; // Write current value to cache.\n\n  cache$1[cacheKey] = prefixedValue;\n  return cache$1[cacheKey];\n}\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/debug/src/browser.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/node_modules/debug/src/browser.js ***!
-  \*******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(process) {/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\nfunction log(...args) {\n\t// This hackery is required for IE8/9, where\n\t// the `console.log` function doesn't have 'apply'\n\treturn typeof console === 'object' &&\n\t\tconsole.log &&\n\t\tconsole.log(...args);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = __webpack_require__(/*! ./common */ \"./jaas-client/node_modules/debug/src/common.js\")(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/debug/src/browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/debug/src/common.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/debug/src/common.js ***!
-  \******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = __webpack_require__(/*! ms */ \"./jaas-client/node_modules/ms/index.js\");\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* Active `debug` instances.\n\t*/\n\tcreateDebug.instances = [];\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.enabled = createDebug.enabled(namespace);\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = selectColor(namespace);\n\t\tdebug.destroy = destroy;\n\t\tdebug.extend = extend;\n\t\t// Debug.formatArgs = formatArgs;\n\t\t// debug.rawLog = rawLog;\n\n\t\t// env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\tcreateDebug.instances.push(debug);\n\n\t\treturn debug;\n\t}\n\n\tfunction destroy() {\n\t\tconst index = createDebug.instances.indexOf(this);\n\t\tif (index !== -1) {\n\t\t\tcreateDebug.instances.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < createDebug.instances.length; i++) {\n\t\t\tconst instance = createDebug.instances[i];\n\t\t\tinstance.enabled = createDebug.enabled(instance.namespace);\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/debug/src/common.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/dom-helpers/esm/addClass.js":
-/*!**************************************************************!*\
-  !*** ./jaas-client/node_modules/dom-helpers/esm/addClass.js ***!
-  \**************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return addClass; });\n/* harmony import */ var _hasClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hasClass */ \"./jaas-client/node_modules/dom-helpers/esm/hasClass.js\");\n\nfunction addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!Object(_hasClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/addClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/dom-helpers/esm/hasClass.js":
-/*!**************************************************************!*\
-  !*** ./jaas-client/node_modules/dom-helpers/esm/hasClass.js ***!
-  \**************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return hasClass; });\nfunction hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);\n  return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/hasClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/dom-helpers/esm/removeClass.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/dom-helpers/esm/removeClass.js ***!
-  \*****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return removeClass; });\nfunction replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nfunction removeClass(element, className) {\n  if (element.classList) {\n    element.classList.remove(className);\n  } else if (typeof element.className === 'string') {\n    ;\n    element.className = replaceClassName(element.className, className);\n  } else {\n    element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/removeClass.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js ***!
-  \*****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = (function () {\n  if (typeof self !== 'undefined') {\n    return self;\n  } else if (typeof window !== 'undefined') {\n    return window;\n  } else {\n    return Function('return this')(); // eslint-disable-line no-new-func\n  }\n})();\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/index.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/index.js ***!
-  \****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\nmodule.exports = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/engine.io-client/lib/socket.js\");\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/socket.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/socket.js ***!
-  \*****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar transports = __webpack_require__(/*! ./transports/index */ \"./jaas-client/node_modules/engine.io-client/lib/transports/index.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:socket');\nvar index = __webpack_require__(/*! indexof */ \"./jaas-client/node_modules/indexof/index.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar parseuri = __webpack_require__(/*! parseuri */ \"./jaas-client/node_modules/parseuri/index.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket (uri, opts) {\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' === typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.hostname = uri.host;\n    opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  } else if (opts.host) {\n    opts.hostname = parseuri(opts.host).host;\n  }\n\n  this.secure = null != opts.secure ? opts.secure\n    : (typeof location !== 'undefined' && 'https:' === location.protocol);\n\n  if (opts.hostname && !opts.port) {\n    // if no port is specified manually, use the protocol default\n    opts.port = this.secure ? '443' : '80';\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (typeof location !== 'undefined' ? location.hostname : 'localhost');\n  this.port = opts.port || (typeof location !== 'undefined' && location.port\n      ? location.port\n      : (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' === typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.withCredentials = false !== opts.withCredentials;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.transportOptions = opts.transportOptions || {};\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.prevBufferLen = 0;\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n  this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\n  if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n  if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n    this.perMessageDeflate.threshold = 1024;\n  }\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized;\n  this.forceNode = !!opts.forceNode;\n\n  // detect ReactNative environment\n  this.isReactNative = (typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative');\n\n  // other options for Node.js or ReactNative client\n  if (typeof self === 'undefined' || this.isReactNative) {\n    if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n      this.extraHeaders = opts.extraHeaders;\n    }\n\n    if (opts.localAddress) {\n      this.localAddress = opts.localAddress;\n    }\n  }\n\n  // set on handshake\n  this.id = null;\n  this.upgrades = null;\n  this.pingInterval = null;\n  this.pingTimeout = null;\n\n  // set on heartbeat\n  this.pingIntervalTimer = null;\n  this.pingTimeoutTimer = null;\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = __webpack_require__(/*! ./transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nSocket.transports = __webpack_require__(/*! ./transports/index */ \"./jaas-client/node_modules/engine.io-client/lib/transports/index.js\");\nSocket.parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // per-transport options\n  var options = this.transportOptions[name] || {};\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    query: query,\n    socket: this,\n    agent: options.agent || this.agent,\n    hostname: options.hostname || this.hostname,\n    port: options.port || this.port,\n    secure: options.secure || this.secure,\n    path: options.path || this.path,\n    forceJSONP: options.forceJSONP || this.forceJSONP,\n    jsonp: options.jsonp || this.jsonp,\n    forceBase64: options.forceBase64 || this.forceBase64,\n    enablesXDR: options.enablesXDR || this.enablesXDR,\n    withCredentials: options.withCredentials || this.withCredentials,\n    timestampRequests: options.timestampRequests || this.timestampRequests,\n    timestampParam: options.timestampParam || this.timestampParam,\n    policyPort: options.policyPort || this.policyPort,\n    pfx: options.pfx || this.pfx,\n    key: options.key || this.key,\n    passphrase: options.passphrase || this.passphrase,\n    cert: options.cert || this.cert,\n    ca: options.ca || this.ca,\n    ciphers: options.ciphers || this.ciphers,\n    rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,\n    perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,\n    extraHeaders: options.extraHeaders || this.extraHeaders,\n    forceNode: options.forceNode || this.forceNode,\n    localAddress: options.localAddress || this.localAddress,\n    requestTimeout: options.requestTimeout || this.requestTimeout,\n    protocols: options.protocols || void (0),\n    isReactNative: this.isReactNative\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {\n    transport = 'websocket';\n  } else if (0 === this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function () {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function (transport) {\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function () {\n    self.onDrain();\n  })\n  .on('packet', function (packet) {\n    self.onPacket(packet);\n  })\n  .on('error', function (e) {\n    self.onError(e);\n  })\n  .on('close', function () {\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 });\n  var failed = false;\n  var self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen () {\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' === msg.type && 'probe' === msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' === transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' === self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport () {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  // Handle any error that happens while probing\n  function onerror (err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose () {\n    onerror('transport closed');\n  }\n\n  // When the socket is closed while we're probing\n  function onclose () {\n    onerror('socket closed');\n  }\n\n  // When the socket is upgraded while we're probing\n  function onupgrade (to) {\n    if (transport && to.name !== transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  // Remove all listeners on the transport and on self\n  function cleanup () {\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' === this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' === this.readyState || 'open' === this.readyState ||\n      'closing' === this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(JSON.parse(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        this.emit('pong');\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.onError(err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if ('closed' === this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' === self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api private\n*/\n\nSocket.prototype.ping = function () {\n  var self = this;\n  this.sendPacket('ping', function () {\n    self.emit('ping');\n  });\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function () {\n  this.writeBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (0 === this.writeBuffer.length) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' !== this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @param {Object} options.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, options, fn) {\n  this.sendPacket('message', msg, options, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, options, fn) {\n  if ('function' === typeof data) {\n    fn = data;\n    data = undefined;\n  }\n\n  if ('function' === typeof options) {\n    fn = options;\n    options = null;\n  }\n\n  if ('closing' === this.readyState || 'closed' === this.readyState) {\n    return;\n  }\n\n  options = options || {};\n  options.compress = false !== options.compress;\n\n  var packet = {\n    type: type,\n    data: data,\n    options: options\n  };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  if (fn) this.once('flush', fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function () {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  function close () {\n    self.onClose('forced close');\n    debug('socket closing - telling transport to close');\n    self.transport.close();\n  }\n\n  function cleanupAndClose () {\n    self.removeListener('upgrade', cleanupAndClose);\n    self.removeListener('upgradeError', cleanupAndClose);\n    close();\n  }\n\n  function waitForUpgrade () {\n    // wait for upgrade to finish since we can't send packets while pausing a transport\n    self.once('upgrade', cleanupAndClose);\n    self.once('upgradeError', cleanupAndClose);\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n\n    // clean buffers after, so users can still\n    // grab the buffers on `close` event\n    self.writeBuffer = [];\n    self.prevBufferLen = 0;\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i < j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/socket.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transport.js":
-/*!********************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transport.js ***!
-  \********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n  this.withCredentials = opts.withCredentials;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n  this.forceNode = opts.forceNode;\n\n  // results of ReactNative environment detection\n  this.isReactNative = opts.isReactNative;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n  this.localAddress = opts.localAddress;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' === this.readyState || '' === this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function (packets) {\n  if ('open' === this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function (data) {\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transport.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/index.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/index.js ***!
-  \***************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\nvar XHR = __webpack_require__(/*! ./polling-xhr */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js\");\nvar JSONP = __webpack_require__(/*! ./polling-jsonp */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js\");\nvar websocket = __webpack_require__(/*! ./websocket */ \"./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js\");\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling (opts) {\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname !== location.hostname || port !== opts.port;\n    xs = opts.secure !== isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js ***!
-  \***********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module requirements.\n */\n\nvar Polling = __webpack_require__(/*! ./polling */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar globalThis = __webpack_require__(/*! ../globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    callbacks = globalThis.___eio = (globalThis.___eio || []);\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (typeof addEventListener === 'function') {\n    addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function (e) {\n    self.onError('jsonp poll error', e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  if (insertAt) {\n    insertAt.parentNode.insertBefore(script, insertAt);\n  } else {\n    (document.head || document.body).appendChild(script);\n  }\n  this.script = script;\n\n  var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"' + self.iframeId + '\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch (e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function () {\n      if (self.iframe.readyState === 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js ***!
-  \*********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* global attachEvent */\n\n/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\nvar Polling = __webpack_require__(/*! ./polling */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:polling-xhr');\nvar globalThis = __webpack_require__(/*! ../globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty () {}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR (opts) {\n  Polling.call(this, opts);\n  this.requestTimeout = opts.requestTimeout;\n  this.extraHeaders = opts.extraHeaders;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = (typeof location !== 'undefined' && opts.hostname !== location.hostname) ||\n      port !== opts.port;\n    this.xs = opts.secure !== isSSL;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function (opts) {\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n  opts.withCredentials = this.withCredentials;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  opts.requestTimeout = this.requestTimeout;\n\n  // other options for Node.js client\n  opts.extraHeaders = this.extraHeaders;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function (data, fn) {\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function (err) {\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function () {\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function (data) {\n    self.onData(data);\n  });\n  req.on('error', function (err) {\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request (opts) {\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined !== opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n  this.withCredentials = opts.withCredentials;\n  this.requestTimeout = opts.requestTimeout;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function () {\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    try {\n      if (this.extraHeaders) {\n        xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n        for (var i in this.extraHeaders) {\n          if (this.extraHeaders.hasOwnProperty(i)) {\n            xhr.setRequestHeader(i, this.extraHeaders[i]);\n          }\n        }\n      }\n    } catch (e) {}\n\n    if ('POST' === this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    try {\n      xhr.setRequestHeader('Accept', '*/*');\n    } catch (e) {}\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = this.withCredentials;\n    }\n\n    if (this.requestTimeout) {\n      xhr.timeout = this.requestTimeout;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function () {\n        self.onLoad();\n      };\n      xhr.onerror = function () {\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState === 2) {\n          try {\n            var contentType = xhr.getResponseHeader('Content-Type');\n            if (self.supportsBinary && contentType === 'application/octet-stream' || contentType === 'application/octet-stream; charset=UTF-8') {\n              xhr.responseType = 'arraybuffer';\n            }\n          } catch (e) {}\n        }\n        if (4 !== xhr.readyState) return;\n        if (200 === xhr.status || 1223 === xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function () {\n            self.onError(typeof xhr.status === 'number' ? xhr.status : 0);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function () {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (typeof document !== 'undefined') {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function () {\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function (data) {\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function (err) {\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function (fromError) {\n  if ('undefined' === typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch (e) {}\n  }\n\n  if (typeof document !== 'undefined') {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function () {\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type');\n    } catch (e) {}\n    if (contentType === 'application/octet-stream' || contentType === 'application/octet-stream; charset=UTF-8') {\n      data = this.xhr.response || this.xhr.responseText;\n    } else {\n      data = this.xhr.responseText;\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function () {\n  return typeof XDomainRequest !== 'undefined' && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function () {\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nRequest.requestsCount = 0;\nRequest.requests = {};\n\nif (typeof document !== 'undefined') {\n  if (typeof attachEvent === 'function') {\n    attachEvent('onunload', unloadHandler);\n  } else if (typeof addEventListener === 'function') {\n    var terminationEvent = 'onpagehide' in globalThis ? 'pagehide' : 'unload';\n    addEventListener(terminationEvent, unloadHandler, false);\n  }\n}\n\nfunction unloadHandler () {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling.js":
-/*!*****************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling.js ***!
-  \*****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(/*! ../transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar yeast = __webpack_require__(/*! yeast */ \"./jaas-client/node_modules/yeast/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function () {\n  var XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function () {\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function (onPause) {\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause () {\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function () {\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function () {\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function () {\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function (data) {\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function (packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' === self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' === packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' !== this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' === this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function () {\n  var self = this;\n\n  function close () {\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' === this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n  var callbackfn = function () {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  parser.encodePayload(packets, this.supportsBinary, function (data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' === schema && Number(this.port) !== 443) ||\n     ('http' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js":
-/*!*******************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js ***!
-  \*******************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(/*! ../transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar yeast = __webpack_require__(/*! yeast */ \"./jaas-client/node_modules/yeast/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:websocket');\n\nvar BrowserWebSocket, NodeWebSocket;\n\nif (typeof WebSocket !== 'undefined') {\n  BrowserWebSocket = WebSocket;\n} else if (typeof self !== 'undefined') {\n  BrowserWebSocket = self.WebSocket || self.MozWebSocket;\n}\n\nif (typeof window === 'undefined') {\n  try {\n    NodeWebSocket = __webpack_require__(/*! ws */ 0);\n  } catch (e) { }\n}\n\n/**\n * Get either the `WebSocket` or `MozWebSocket` globals\n * in the browser or try to resolve WebSocket-compatible\n * interface exposed by `ws` for Node-like environment.\n */\n\nvar WebSocketImpl = BrowserWebSocket || NodeWebSocket;\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  this.perMessageDeflate = opts.perMessageDeflate;\n  this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;\n  this.protocols = opts.protocols;\n  if (!this.usingBrowserWebSocket) {\n    WebSocketImpl = NodeWebSocket;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function () {\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var uri = this.uri();\n  var protocols = this.protocols;\n\n  var opts = {};\n\n  if (!this.isReactNative) {\n    opts.agent = this.agent;\n    opts.perMessageDeflate = this.perMessageDeflate;\n\n    // SSL options for Node.js client\n    opts.pfx = this.pfx;\n    opts.key = this.key;\n    opts.passphrase = this.passphrase;\n    opts.cert = this.cert;\n    opts.ca = this.ca;\n    opts.ciphers = this.ciphers;\n    opts.rejectUnauthorized = this.rejectUnauthorized;\n  }\n\n  if (this.extraHeaders) {\n    opts.headers = this.extraHeaders;\n  }\n  if (this.localAddress) {\n    opts.localAddress = this.localAddress;\n  }\n\n  try {\n    this.ws =\n      this.usingBrowserWebSocket && !this.isReactNative\n        ? protocols\n          ? new WebSocketImpl(uri, protocols)\n          : new WebSocketImpl(uri)\n        : new WebSocketImpl(uri, protocols, opts);\n  } catch (err) {\n    return this.emit('error', err);\n  }\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  if (this.ws.supports && this.ws.supports.binary) {\n    this.supportsBinary = true;\n    this.ws.binaryType = 'nodebuffer';\n  } else {\n    this.ws.binaryType = 'arraybuffer';\n  }\n\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function () {\n  var self = this;\n\n  this.ws.onopen = function () {\n    self.onOpen();\n  };\n  this.ws.onclose = function () {\n    self.onClose();\n  };\n  this.ws.onmessage = function (ev) {\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function (e) {\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  var total = packets.length;\n  for (var i = 0, l = total; i < l; i++) {\n    (function (packet) {\n      parser.encodePacket(packet, self.supportsBinary, function (data) {\n        if (!self.usingBrowserWebSocket) {\n          // always create a new object (GH-437)\n          var opts = {};\n          if (packet.options) {\n            opts.compress = packet.options.compress;\n          }\n\n          if (self.perMessageDeflate) {\n            var len = 'string' === typeof data ? Buffer.byteLength(data) : data.length;\n            if (len < self.perMessageDeflate.threshold) {\n              opts.compress = false;\n            }\n          }\n        }\n\n        // Sometimes the websocket has already been closed but the browser didn't\n        // have a chance of informing us about it yet, in that case send will\n        // throw an error\n        try {\n          if (self.usingBrowserWebSocket) {\n            // TypeError is thrown when passing the second argument on Safari\n            self.ws.send(data);\n          } else {\n            self.ws.send(data, opts);\n          }\n        } catch (e) {\n          debug('websocket closed before onclose event');\n        }\n\n        --total || done();\n      });\n    })(packets[i]);\n  }\n\n  function done () {\n    self.emit('flush');\n\n    // fake drain\n    // defer to next tick to allow Socket to clear writeBuffer\n    setTimeout(function () {\n      self.writable = true;\n      self.emit('drain');\n    }, 0);\n  }\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function () {\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function () {\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' === schema && Number(this.port) !== 443) ||\n    ('ws' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function () {\n  return !!WebSocketImpl && !('__initialize' in WebSocketImpl && this.name === WS.prototype.name);\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("// browser shim for xmlhttprequest module\n\nvar hasCORS = __webpack_require__(/*! has-cors */ \"./jaas-client/node_modules/has-cors/index.js\");\nvar globalThis = __webpack_require__(/*! ./globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\nmodule.exports = function (opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new globalThis[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');\n    } catch (e) { }\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-parser/lib/browser.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-parser/lib/browser.js ***!
-  \******************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Module dependencies.\n */\n\nvar keys = __webpack_require__(/*! ./keys */ \"./jaas-client/node_modules/engine.io-parser/lib/keys.js\");\nvar hasBinary = __webpack_require__(/*! has-binary2 */ \"./jaas-client/node_modules/has-binary2/index.js\");\nvar sliceBuffer = __webpack_require__(/*! arraybuffer.slice */ \"./jaas-client/node_modules/arraybuffer.slice/index.js\");\nvar after = __webpack_require__(/*! after */ \"./jaas-client/node_modules/after/index.js\");\nvar utf8 = __webpack_require__(/*! ./utf8 */ \"./jaas-client/node_modules/engine.io-parser/lib/utf8.js\");\n\nvar base64encoder;\nif (typeof ArrayBuffer !== 'undefined') {\n  base64encoder = __webpack_require__(/*! base64-arraybuffer */ \"./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js\");\n}\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = __webpack_require__(/*! blob */ \"./jaas-client/node_modules/blob/index.js\");\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if (typeof utf8encode === 'function') {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    exports.encodePacket({ type: packet.type, data: fr.result }, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (typeof Blob !== 'undefined' && packet.data instanceof Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  if (data === undefined) {\n    return err;\n  }\n  // String data\n  if (typeof data === 'string') {\n    if (data.charAt(0) === 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      data = tryDecode(data);\n      if (data === false) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\nfunction tryDecode(data) {\n  try {\n    data = utf8.decode(data, { strict: false });\n  } catch (e) {\n    return false;\n  }\n  return data;\n}\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!base64encoder) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data !== 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data === '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = '', n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (chr !== ':') {\n      length += chr;\n      continue;\n    }\n\n    if (length === '' || (length != (n = Number(length)))) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    msg = data.substr(i + 1, n);\n\n    if (length != msg.length) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    if (msg.length) {\n      packet = exports.decodePacket(msg, binaryType, false);\n\n      if (err.type === packet.type && err.data === packet.data) {\n        // parser error in individual packet - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      var ret = callback(packet, i + n, l);\n      if (false === ret) return;\n    }\n\n    // advance cursor\n    i += n;\n    length = '';\n  }\n\n  if (length !== '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] === 255) break;\n\n      // 310 = char length of Number.MAX_VALUE\n      if (msgLength.length > 310) {\n        return callback(err, 0, 1);\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-parser/lib/keys.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-parser/lib/keys.js ***!
-  \***************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/keys.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/engine.io-parser/lib/utf8.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/engine.io-parser/lib/utf8.js ***!
-  \***************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/*! https://mths.be/utf8js v2.1.2 by @mathias */\n\nvar stringFromCharCode = String.fromCharCode;\n\n// Taken from https://mths.be/punycode\nfunction ucs2decode(string) {\n\tvar output = [];\n\tvar counter = 0;\n\tvar length = string.length;\n\tvar value;\n\tvar extra;\n\twhile (counter < length) {\n\t\tvalue = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// high surrogate, and there is a next character\n\t\t\textra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n// Taken from https://mths.be/punycode\nfunction ucs2encode(array) {\n\tvar length = array.length;\n\tvar index = -1;\n\tvar value;\n\tvar output = '';\n\twhile (++index < length) {\n\t\tvalue = array[index];\n\t\tif (value > 0xFFFF) {\n\t\t\tvalue -= 0x10000;\n\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(value);\n\t}\n\treturn output;\n}\n\nfunction checkScalarValue(codePoint, strict) {\n\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\tif (strict) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\treturn true;\n}\n/*--------------------------------------------------------------------------*/\n\nfunction createByte(codePoint, shift) {\n\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n}\n\nfunction encodeCodePoint(codePoint, strict) {\n\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\treturn stringFromCharCode(codePoint);\n\t}\n\tvar symbol = '';\n\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t}\n\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\tif (!checkScalarValue(codePoint, strict)) {\n\t\t\tcodePoint = 0xFFFD;\n\t\t}\n\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\tsymbol += createByte(codePoint, 12);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\treturn symbol;\n}\n\nfunction utf8encode(string, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tvar codePoints = ucs2decode(string);\n\tvar length = codePoints.length;\n\tvar index = -1;\n\tvar codePoint;\n\tvar byteString = '';\n\twhile (++index < length) {\n\t\tcodePoint = codePoints[index];\n\t\tbyteString += encodeCodePoint(codePoint, strict);\n\t}\n\treturn byteString;\n}\n\n/*--------------------------------------------------------------------------*/\n\nfunction readContinuationByte() {\n\tif (byteIndex >= byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\tif ((continuationByte & 0xC0) == 0x80) {\n\t\treturn continuationByte & 0x3F;\n\t}\n\n\t// If we end up here, it’s not a continuation byte\n\tthrow Error('Invalid continuation byte');\n}\n\nfunction decodeSymbol(strict) {\n\tvar byte1;\n\tvar byte2;\n\tvar byte3;\n\tvar byte4;\n\tvar codePoint;\n\n\tif (byteIndex > byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tif (byteIndex == byteCount) {\n\t\treturn false;\n\t}\n\n\t// Read first byte\n\tbyte1 = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\t// 1-byte sequence (no continuation bytes)\n\tif ((byte1 & 0x80) == 0) {\n\t\treturn byte1;\n\t}\n\n\t// 2-byte sequence\n\tif ((byte1 & 0xE0) == 0xC0) {\n\t\tbyte2 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\tif (codePoint >= 0x80) {\n\t\t\treturn codePoint;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 3-byte sequence (may include unpaired surrogates)\n\tif ((byte1 & 0xF0) == 0xE0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\tif (codePoint >= 0x0800) {\n\t\t\treturn checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 4-byte sequence\n\tif ((byte1 & 0xF8) == 0xF0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tbyte4 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t(byte3 << 0x06) | byte4;\n\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\treturn codePoint;\n\t\t}\n\t}\n\n\tthrow Error('Invalid UTF-8 detected');\n}\n\nvar byteArray;\nvar byteCount;\nvar byteIndex;\nfunction utf8decode(byteString, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tbyteArray = ucs2decode(byteString);\n\tbyteCount = byteArray.length;\n\tbyteIndex = 0;\n\tvar codePoints = [];\n\tvar tmp;\n\twhile ((tmp = decodeSymbol(strict)) !== false) {\n\t\tcodePoints.push(tmp);\n\t}\n\treturn ucs2encode(codePoints);\n}\n\nmodule.exports = {\n\tversion: '2.1.2',\n\tencode: utf8encode,\n\tdecode: utf8decode\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/utf8.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/has-binary2/index.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/node_modules/has-binary2/index.js ***!
-  \*******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/* global Blob File */\n\n/*\n * Module requirements.\n */\n\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js\");\n\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' ||\n                        typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]';\nvar withNativeFile = typeof File === 'function' ||\n                        typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]';\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Supports Buffer, ArrayBuffer, Blob and File.\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary (obj) {\n  if (!obj || typeof obj !== 'object') {\n    return false;\n  }\n\n  if (isArray(obj)) {\n    for (var i = 0, l = obj.length; i < l; i++) {\n      if (hasBinary(obj[i])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  if ((typeof Buffer === 'function' && Buffer.isBuffer && Buffer.isBuffer(obj)) ||\n    (typeof ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||\n    (withNativeBlob && obj instanceof Blob) ||\n    (withNativeFile && obj instanceof File)\n  ) {\n    return true;\n  }\n\n  // see: https://github.com/Automattic/has-binary/pull/4\n  if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {\n    return hasBinary(obj.toJSON(), true);\n  }\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-binary2/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/has-cors/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/has-cors/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-cors/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/history/esm/history.js":
-/*!*********************************************************!*\
-  !*** ./jaas-client/node_modules/history/esm/history.js ***!
-  \*********************************************************/
-/*! exports provided: createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createBrowserHistory\", function() { return createBrowserHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createHashHistory\", function() { return createHashHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createMemoryHistory\", function() { return createMemoryHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createLocation\", function() { return createLocation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"locationsAreEqual\", function() { return locationsAreEqual; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parsePath\", function() { return parsePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createPath\", function() { return createPath; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var resolve_pathname__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! resolve-pathname */ \"./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js\");\n/* harmony import */ var value_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! value-equal */ \"./jaas-client/node_modules/value-equal/esm/value-equal.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n\n\n\n\n\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n  return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n  var pathname = path || '/';\n  var search = '';\n  var hash = '';\n  var hashIndex = pathname.indexOf('#');\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf('?');\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === '?' ? '' : search,\n    hash: hash === '#' ? '' : hash\n  };\n}\nfunction createPath(location) {\n  var pathname = location.pathname,\n      search = location.search,\n      hash = location.hash;\n  var path = pathname || '/';\n  if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n  return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n  var location;\n\n  if (typeof path === 'string') {\n    // Two-arg form: push(path, state)\n    location = parsePath(path);\n    location.state = state;\n  } else {\n    // One-arg form: push(location)\n    location = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, path);\n    if (location.pathname === undefined) location.pathname = '';\n\n    if (location.search) {\n      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n    } else {\n      location.search = '';\n    }\n\n    if (location.hash) {\n      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n    } else {\n      location.hash = '';\n    }\n\n    if (state !== undefined && location.state === undefined) location.state = state;\n  }\n\n  try {\n    location.pathname = decodeURI(location.pathname);\n  } catch (e) {\n    if (e instanceof URIError) {\n      throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n    } else {\n      throw e;\n    }\n  }\n\n  if (key) location.key = key;\n\n  if (currentLocation) {\n    // Resolve incomplete/relative pathname relative to current location.\n    if (!location.pathname) {\n      location.pathname = currentLocation.pathname;\n    } else if (location.pathname.charAt(0) !== '/') {\n      location.pathname = Object(resolve_pathname__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(location.pathname, currentLocation.pathname);\n    }\n  } else {\n    // When there is no prior location and pathname is empty, set it to /\n    if (!location.pathname) {\n      location.pathname = '/';\n    }\n  }\n\n  return location;\n}\nfunction locationsAreEqual(a, b) {\n  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && Object(value_equal__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n  var prompt = null;\n\n  function setPrompt(nextPrompt) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(prompt == null, 'A history supports only one prompt at a time') : undefined;\n    prompt = nextPrompt;\n    return function () {\n      if (prompt === nextPrompt) prompt = null;\n    };\n  }\n\n  function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n    // TODO: If another transition starts while we're still confirming\n    // the previous one, we may end up in a weird state. Figure out the\n    // best way to handle this.\n    if (prompt != null) {\n      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n      if (typeof result === 'string') {\n        if (typeof getUserConfirmation === 'function') {\n          getUserConfirmation(result, callback);\n        } else {\n           true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : undefined;\n          callback(true);\n        }\n      } else {\n        // Return false from a transition hook to cancel the transition.\n        callback(result !== false);\n      }\n    } else {\n      callback(true);\n    }\n  }\n\n  var listeners = [];\n\n  function appendListener(fn) {\n    var isActive = true;\n\n    function listener() {\n      if (isActive) fn.apply(void 0, arguments);\n    }\n\n    listeners.push(listener);\n    return function () {\n      isActive = false;\n      listeners = listeners.filter(function (item) {\n        return item !== listener;\n      });\n    };\n  }\n\n  function notifyListeners() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    listeners.forEach(function (listener) {\n      return listener.apply(void 0, args);\n    });\n  }\n\n  return {\n    setPrompt: setPrompt,\n    confirmTransitionTo: confirmTransitionTo,\n    appendListener: appendListener,\n    notifyListeners: notifyListeners\n  };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n  callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n  var ua = window.navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n  return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n  return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n  return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n  try {\n    return window.history.state || {};\n  } catch (e) {\n    // IE 11 sometimes throws when accessing window.history.state\n    // See https://github.com/ReactTraining/history/pull/289\n    return {};\n  }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(false, 'Browser history needs a DOM') : undefined : void 0;\n  var globalHistory = window.history;\n  var canUseHistory = supportsHistory();\n  var needsHashChangeListener = !supportsPopStateOnHashChange();\n  var _props = props,\n      _props$forceRefresh = _props.forceRefresh,\n      forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n  function getDOMLocation(historyState) {\n    var _ref = historyState || {},\n        key = _ref.key,\n        state = _ref.state;\n\n    var _window$location = window.location,\n        pathname = _window$location.pathname,\n        search = _window$location.search,\n        hash = _window$location.hash;\n    var path = pathname + search + hash;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : undefined;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path, state, key);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function handlePopState(event) {\n    // Ignore extraneous popstate events in WebKit.\n    if (isExtraneousPopstateEvent(event)) return;\n    handlePop(getDOMLocation(event.state));\n  }\n\n  function handleHashChange() {\n    handlePop(getDOMLocation(getHistoryState()));\n  }\n\n  var forceNextPop = false;\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of keys we've seen in sessionStorage.\n    // Instead, we just default to 0 for keys we don't know.\n\n    var toIndex = allKeys.indexOf(toLocation.key);\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allKeys.indexOf(fromLocation.key);\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  }\n\n  var initialLocation = getDOMLocation(getHistoryState());\n  var allKeys = [initialLocation.key]; // Public interface\n\n  function createHref(location) {\n    return basename + createPath(location);\n  }\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.pushState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.href = href;\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          var nextKeys = allKeys.slice(0, prevIndex + 1);\n          nextKeys.push(location.key);\n          allKeys = nextKeys;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : undefined;\n        window.location.href = href;\n      }\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.replaceState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.replace(href);\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : undefined;\n        window.location.replace(href);\n      }\n    });\n  }\n\n  function go(n) {\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n  hashbang: {\n    encodePath: function encodePath(path) {\n      return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n    },\n    decodePath: function decodePath(path) {\n      return path.charAt(0) === '!' ? path.substr(1) : path;\n    }\n  },\n  noslash: {\n    encodePath: stripLeadingSlash,\n    decodePath: addLeadingSlash\n  },\n  slash: {\n    encodePath: addLeadingSlash,\n    decodePath: addLeadingSlash\n  }\n};\n\nfunction stripHash(url) {\n  var hashIndex = url.indexOf('#');\n  return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var hashIndex = href.indexOf('#');\n  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n  window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n  window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(false, 'Hash history needs a DOM') : undefined : void 0;\n  var globalHistory = window.history;\n  var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n  var _props = props,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$hashType = _props.hashType,\n      hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n  var _HashPathCoders$hashT = HashPathCoders[hashType],\n      encodePath = _HashPathCoders$hashT.encodePath,\n      decodePath = _HashPathCoders$hashT.decodePath;\n\n  function getDOMLocation() {\n    var path = decodePath(getHashPath());\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : undefined;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  var forceNextPop = false;\n  var ignorePath = null;\n\n  function locationsAreEqual$$1(a, b) {\n    return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n  }\n\n  function handleHashChange() {\n    var path = getHashPath();\n    var encodedPath = encodePath(path);\n\n    if (path !== encodedPath) {\n      // Ensure we always have a properly-encoded hash.\n      replaceHashPath(encodedPath);\n    } else {\n      var location = getDOMLocation();\n      var prevLocation = history.location;\n      if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n      if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n      ignorePath = null;\n      handlePop(location);\n    }\n  }\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of paths we've seen in sessionStorage.\n    // Instead, we just default to 0 for paths we don't know.\n\n    var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  } // Ensure the hash is encoded properly before doing anything else.\n\n\n  var path = getHashPath();\n  var encodedPath = encodePath(path);\n  if (path !== encodedPath) replaceHashPath(encodedPath);\n  var initialLocation = getDOMLocation();\n  var allPaths = [createPath(initialLocation)]; // Public interface\n\n  function createHref(location) {\n    var baseTag = document.querySelector('base');\n    var href = '';\n\n    if (baseTag && baseTag.getAttribute('href')) {\n      href = stripHash(window.location.href);\n    }\n\n    return href + '#' + encodePath(basename + createPath(location));\n  }\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Hash history cannot push state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a PUSH, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        pushHashPath(encodedPath);\n        var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n        var nextPaths = allPaths.slice(0, prevIndex + 1);\n        nextPaths.push(path);\n        allPaths = nextPaths;\n        setState({\n          action: action,\n          location: location\n        });\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : undefined;\n        setState();\n      }\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Hash history cannot replace state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        replaceHashPath(encodedPath);\n      }\n\n      var prevIndex = allPaths.indexOf(createPath(history.location));\n      if (prevIndex !== -1) allPaths[prevIndex] = path;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : undefined;\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(HashChangeEvent$1, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(HashChangeEvent$1, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n  return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  var _props = props,\n      getUserConfirmation = _props.getUserConfirmation,\n      _props$initialEntries = _props.initialEntries,\n      initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n      _props$initialIndex = _props.initialIndex,\n      initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = history.entries.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var index = clamp(initialIndex, 0, initialEntries.length - 1);\n  var entries = initialEntries.map(function (entry) {\n    return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n  }); // Public interface\n\n  var createHref = createPath;\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var prevIndex = history.index;\n      var nextIndex = prevIndex + 1;\n      var nextEntries = history.entries.slice(0);\n\n      if (nextEntries.length > nextIndex) {\n        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n      } else {\n        nextEntries.push(location);\n      }\n\n      setState({\n        action: action,\n        location: location,\n        index: nextIndex,\n        entries: nextEntries\n      });\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      history.entries[history.index] = location;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n    var action = 'POP';\n    var location = history.entries[nextIndex];\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (ok) {\n        setState({\n          action: action,\n          location: location,\n          index: nextIndex\n        });\n      } else {\n        // Mimic the behavior of DOM histories by\n        // causing a render after a cancelled POP.\n        setState();\n      }\n    });\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  function canGo(n) {\n    var nextIndex = history.index + n;\n    return nextIndex >= 0 && nextIndex < history.entries.length;\n  }\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    return transitionManager.setPrompt(prompt);\n  }\n\n  function listen(listener) {\n    return transitionManager.appendListener(listener);\n  }\n\n  var history = {\n    length: entries.length,\n    action: 'POP',\n    location: entries[index],\n    index: index,\n    entries: entries,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    canGo: canGo,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/history/esm/history.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js":
-/*!**********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js ***!
-  \**********************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar reactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/hyphenate-style-name/index.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/hyphenate-style-name/index.js ***!
-  \****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* eslint-disable no-var, prefer-template */\nvar uppercasePattern = /[A-Z]/g\nvar msPattern = /^ms-/\nvar cache = {}\n\nfunction toHyphenLower(match) {\n  return '-' + match.toLowerCase()\n}\n\nfunction hyphenateStyleName(name) {\n  if (cache.hasOwnProperty(name)) {\n    return cache[name]\n  }\n\n  var hName = name.replace(uppercasePattern, toHyphenLower)\n  return (cache[name] = msPattern.test(hName) ? '-' + hName : hName)\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (hyphenateStyleName);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/hyphenate-style-name/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/indexof/index.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/node_modules/indexof/index.js ***!
-  \***************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};\n\n//# sourceURL=webpack:///./jaas-client/node_modules/indexof/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/is-in-browser/dist/module.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/is-in-browser/dist/module.js ***!
-  \***************************************************************/
-/*! exports provided: isBrowser, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isBrowser\", function() { return isBrowser; });\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar isBrowser = (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" && (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) === 'object' && document.nodeType === 9;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (isBrowser);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/is-in-browser/dist/module.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/isarray/index.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/node_modules/isarray/index.js ***!
-  \***************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js ***!
-  \******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hyphenate-style-name */ \"./jaas-client/node_modules/hyphenate-style-name/index.js\");\n\n\n/**\n * Convert camel cased property names to dash separated.\n *\n * @param {Object} style\n * @return {Object}\n */\n\nfunction convertCase(style) {\n  var converted = {};\n\n  for (var prop in style) {\n    var key = prop.indexOf('--') === 0 ? prop : Object(hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop);\n    converted[key] = style[prop];\n  }\n\n  if (style.fallbacks) {\n    if (Array.isArray(style.fallbacks)) converted.fallbacks = style.fallbacks.map(convertCase);else converted.fallbacks = convertCase(style.fallbacks);\n  }\n\n  return converted;\n}\n/**\n * Allow camel cased property names by converting them back to dasherized.\n *\n * @param {Rule} rule\n */\n\n\nfunction camelCase() {\n  function onProcessStyle(style) {\n    if (Array.isArray(style)) {\n      // Handle rules like @font-face, which can have multiple styles in an array\n      for (var index = 0; index < style.length; index++) {\n        style[index] = convertCase(style[index]);\n      }\n\n      return style;\n    }\n\n    return convertCase(style);\n  }\n\n  function onChangeValue(value, prop, rule) {\n    if (prop.indexOf('--') === 0) {\n      return value;\n    }\n\n    var hyphenatedProp = Object(hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop); // There was no camel case in place\n\n    if (prop === hyphenatedProp) return value;\n    rule.prop(hyphenatedProp, value); // Core will ignore that property value we set the proper one above.\n\n    return null;\n  }\n\n  return {\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (camelCase);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js":
-/*!**********************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js ***!
-  \**********************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\nvar px = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.px : 'px';\nvar ms = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.ms : 'ms';\nvar percent = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.percent : '%';\n/**\n * Generated jss-plugin-default-unit CSS property units\n *\n * @type object\n */\n\nvar defaultUnits = {\n  // Animation properties\n  'animation-delay': ms,\n  'animation-duration': ms,\n  // Background properties\n  'background-position': px,\n  'background-position-x': px,\n  'background-position-y': px,\n  'background-size': px,\n  // Border Properties\n  border: px,\n  'border-bottom': px,\n  'border-bottom-left-radius': px,\n  'border-bottom-right-radius': px,\n  'border-bottom-width': px,\n  'border-left': px,\n  'border-left-width': px,\n  'border-radius': px,\n  'border-right': px,\n  'border-right-width': px,\n  'border-top': px,\n  'border-top-left-radius': px,\n  'border-top-right-radius': px,\n  'border-top-width': px,\n  'border-width': px,\n  // Margin properties\n  margin: px,\n  'margin-bottom': px,\n  'margin-left': px,\n  'margin-right': px,\n  'margin-top': px,\n  // Padding properties\n  padding: px,\n  'padding-bottom': px,\n  'padding-left': px,\n  'padding-right': px,\n  'padding-top': px,\n  // Mask properties\n  'mask-position-x': px,\n  'mask-position-y': px,\n  'mask-size': px,\n  // Width and height properties\n  height: px,\n  width: px,\n  'min-height': px,\n  'max-height': px,\n  'min-width': px,\n  'max-width': px,\n  // Position properties\n  bottom: px,\n  left: px,\n  top: px,\n  right: px,\n  // Shadow properties\n  'box-shadow': px,\n  'text-shadow': px,\n  // Column properties\n  'column-gap': px,\n  'column-rule': px,\n  'column-rule-width': px,\n  'column-width': px,\n  // Font and text properties\n  'font-size': px,\n  'font-size-delta': px,\n  'letter-spacing': px,\n  'text-indent': px,\n  'text-stroke': px,\n  'text-stroke-width': px,\n  'word-spacing': px,\n  // Motion properties\n  motion: px,\n  'motion-offset': px,\n  // Outline properties\n  outline: px,\n  'outline-offset': px,\n  'outline-width': px,\n  // Perspective properties\n  perspective: px,\n  'perspective-origin-x': percent,\n  'perspective-origin-y': percent,\n  // Transform properties\n  'transform-origin': percent,\n  'transform-origin-x': percent,\n  'transform-origin-y': percent,\n  'transform-origin-z': percent,\n  // Transition properties\n  'transition-delay': ms,\n  'transition-duration': ms,\n  // Alignment properties\n  'vertical-align': px,\n  'flex-basis': px,\n  // Some random properties\n  'shape-margin': px,\n  size: px,\n  // Grid properties\n  grid: px,\n  'grid-gap': px,\n  'grid-row-gap': px,\n  'grid-column-gap': px,\n  'grid-template-rows': px,\n  'grid-template-columns': px,\n  'grid-auto-rows': px,\n  'grid-auto-columns': px,\n  // Not existing properties.\n  // Used to avoid issues with jss-plugin-expand integration.\n  'box-shadow-x': px,\n  'box-shadow-y': px,\n  'box-shadow-blur': px,\n  'box-shadow-spread': px,\n  'font-line-height': px,\n  'text-shadow-x': px,\n  'text-shadow-y': px,\n  'text-shadow-blur': px\n};\n\n/**\n * Clones the object and adds a camel cased property version.\n */\nfunction addCamelCasedVersion(obj) {\n  var regExp = /(-[a-z])/g;\n\n  var replace = function replace(str) {\n    return str[1].toUpperCase();\n  };\n\n  var newObj = {};\n\n  for (var _key in obj) {\n    newObj[_key] = obj[_key];\n    newObj[_key.replace(regExp, replace)] = obj[_key];\n  }\n\n  return newObj;\n}\n\nvar units = addCamelCasedVersion(defaultUnits);\n/**\n * Recursive deep style passing function\n */\n\nfunction iterate(prop, value, options) {\n  if (!value) return value;\n\n  if (Array.isArray(value)) {\n    for (var i = 0; i < value.length; i++) {\n      value[i] = iterate(prop, value[i], options);\n    }\n  } else if (typeof value === 'object') {\n    if (prop === 'fallbacks') {\n      for (var innerProp in value) {\n        value[innerProp] = iterate(innerProp, value[innerProp], options);\n      }\n    } else {\n      for (var _innerProp in value) {\n        value[_innerProp] = iterate(prop + \"-\" + _innerProp, value[_innerProp], options);\n      }\n    }\n  } else if (typeof value === 'number') {\n    var unit = options[prop] || units[prop];\n\n    if (unit) {\n      return typeof unit === 'function' ? unit(value).toString() : \"\" + value + unit;\n    }\n\n    return value.toString();\n  }\n\n  return value;\n}\n/**\n * Add unit to numeric values.\n */\n\n\nfunction defaultUnit(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var camelCasedOptions = addCamelCasedVersion(options);\n\n  function onProcessStyle(style, rule) {\n    if (rule.type !== 'style') return style;\n\n    for (var prop in style) {\n      style[prop] = iterate(prop, style[prop], camelCasedOptions);\n    }\n\n    return style;\n  }\n\n  function onChangeValue(value, prop) {\n    return iterate(prop, value, camelCasedOptions);\n  }\n\n  return {\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (defaultUnit);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\nvar at = '@global';\nvar atPrefix = '@global ';\n\nvar GlobalContainerRule =\n/*#__PURE__*/\nfunction () {\n  function GlobalContainerRule(key, styles, options) {\n    this.type = 'global';\n    this.at = at;\n    this.rules = void 0;\n    this.options = void 0;\n    this.key = void 0;\n    this.isProcessed = false;\n    this.key = key;\n    this.options = options;\n    this.rules = new jss__WEBPACK_IMPORTED_MODULE_1__[\"RuleList\"](Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var selector in styles) {\n      this.rules.add(selector, styles[selector]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Get a rule.\n   */\n\n\n  var _proto = GlobalContainerRule.prototype;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Create and register rule, run plugins.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, style, options) {\n    var rule = this.rules.add(name, style, options);\n    this.options.jss.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString() {\n    return this.rules.toString();\n  };\n\n  return GlobalContainerRule;\n}();\n\nvar GlobalPrefixedRule =\n/*#__PURE__*/\nfunction () {\n  function GlobalPrefixedRule(key, style, options) {\n    this.type = 'global';\n    this.at = at;\n    this.options = void 0;\n    this.rule = void 0;\n    this.isProcessed = false;\n    this.key = void 0;\n    this.key = key;\n    this.options = options;\n    var selector = key.substr(atPrefix.length);\n    this.rule = options.jss.createRule(selector, style, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n  }\n\n  var _proto2 = GlobalPrefixedRule.prototype;\n\n  _proto2.toString = function toString(options) {\n    return this.rule ? this.rule.toString(options) : '';\n  };\n\n  return GlobalPrefixedRule;\n}();\n\nvar separatorRegExp = /\\s*,\\s*/g;\n\nfunction addScope(selector, scope) {\n  var parts = selector.split(separatorRegExp);\n  var scoped = '';\n\n  for (var i = 0; i < parts.length; i++) {\n    scoped += scope + \" \" + parts[i].trim();\n    if (parts[i + 1]) scoped += ', ';\n  }\n\n  return scoped;\n}\n\nfunction handleNestedGlobalContainerRule(rule) {\n  var options = rule.options,\n      style = rule.style;\n  var rules = style ? style[at] : null;\n  if (!rules) return;\n\n  for (var name in rules) {\n    options.sheet.addRule(name, rules[name], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      selector: addScope(name, rule.selector)\n    }));\n  }\n\n  delete style[at];\n}\n\nfunction handlePrefixedGlobalRule(rule) {\n  var options = rule.options,\n      style = rule.style;\n\n  for (var prop in style) {\n    if (prop[0] !== '@' || prop.substr(0, at.length) !== at) continue;\n    var selector = addScope(prop.substr(at.length), rule.selector);\n    options.sheet.addRule(selector, style[prop], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      selector: selector\n    }));\n    delete style[prop];\n  }\n}\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\n\n\nfunction jssGlobal() {\n  function onCreateRule(name, styles, options) {\n    if (!name) return null;\n\n    if (name === at) {\n      return new GlobalContainerRule(name, styles, options);\n    }\n\n    if (name[0] === '@' && name.substr(0, atPrefix.length) === atPrefix) {\n      return new GlobalPrefixedRule(name, styles, options);\n    }\n\n    var parent = options.parent;\n\n    if (parent) {\n      if (parent.type === 'global' || parent.options.parent && parent.options.parent.type === 'global') {\n        options.scoped = false;\n      }\n    }\n\n    if (options.scoped === false) {\n      options.selector = name;\n    }\n\n    return null;\n  }\n\n  function onProcessRule(rule) {\n    if (rule.type !== 'style') return;\n    handleNestedGlobalContainerRule(rule);\n    handlePrefixedGlobalRule(rule);\n  }\n\n  return {\n    onCreateRule: onCreateRule,\n    onProcessRule: onProcessRule\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssGlobal);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n\n\n\nvar separatorRegExp = /\\s*,\\s*/g;\nvar parentRegExp = /&/g;\nvar refRegExp = /\\$([\\w-]+)/g;\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\n\nfunction jssNested() {\n  // Get a function to be used for $ref replacement.\n  function getReplaceRef(container, sheet) {\n    return function (match, key) {\n      var rule = container.getRule(key) || sheet && sheet.getRule(key);\n\n      if (rule) {\n        rule = rule;\n        return rule.selector;\n      }\n\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(false, \"[JSS] Could not find the referenced rule \\\"\" + key + \"\\\" in \\\"\" + (container.options.meta || container.toString()) + \"\\\".\") : undefined;\n      return key;\n    };\n  }\n\n  function replaceParentRefs(nestedProp, parentProp) {\n    var parentSelectors = parentProp.split(separatorRegExp);\n    var nestedSelectors = nestedProp.split(separatorRegExp);\n    var result = '';\n\n    for (var i = 0; i < parentSelectors.length; i++) {\n      var parent = parentSelectors[i];\n\n      for (var j = 0; j < nestedSelectors.length; j++) {\n        var nested = nestedSelectors[j];\n        if (result) result += ', '; // Replace all & by the parent or prefix & with the parent.\n\n        result += nested.indexOf('&') !== -1 ? nested.replace(parentRegExp, parent) : parent + \" \" + nested;\n      }\n    }\n\n    return result;\n  }\n\n  function getOptions(rule, container, prevOptions) {\n    // Options has been already created, now we only increase index.\n    if (prevOptions) return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, prevOptions, {\n      index: prevOptions.index + 1\n    });\n    var nestingLevel = rule.options.nestingLevel;\n    nestingLevel = nestingLevel === undefined ? 1 : nestingLevel + 1;\n\n    var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, rule.options, {\n      nestingLevel: nestingLevel,\n      index: container.indexOf(rule) + 1 // We don't need the parent name to be set options for chlid.\n\n    });\n\n    delete options.name;\n    return options;\n  }\n\n  function onProcessStyle(style, rule, sheet) {\n    if (rule.type !== 'style') return style;\n    var styleRule = rule;\n    var container = styleRule.options.parent;\n    var options;\n    var replaceRef;\n\n    for (var prop in style) {\n      var isNested = prop.indexOf('&') !== -1;\n      var isNestedConditional = prop[0] === '@';\n      if (!isNested && !isNestedConditional) continue;\n      options = getOptions(styleRule, container, options);\n\n      if (isNested) {\n        var selector = replaceParentRefs(prop, styleRule.selector); // Lazily create the ref replacer function just once for\n        // all nested rules within the sheet.\n\n        if (!replaceRef) replaceRef = getReplaceRef(container, sheet); // Replace all $refs.\n\n        selector = selector.replace(refRegExp, replaceRef);\n        container.addRule(selector, style[prop], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n          selector: selector\n        }));\n      } else if (isNestedConditional) {\n        // Place conditional right after the parent rule to ensure right ordering.\n        container.addRule(prop, {}, options) // Flow expects more options but they aren't required\n        // And flow doesn't know this will always be a StyleRule which has the addRule method\n        // $FlowFixMe\n        .addRule(styleRule.key, style[prop], {\n          selector: styleRule.selector\n        });\n      }\n\n      delete style[prop];\n    }\n\n    return style;\n  }\n\n  return {\n    onProcessStyle: onProcessStyle\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssNested);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js":
-/*!******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js ***!
-  \******************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Sort props by length.\n */\nfunction jssPropsSort() {\n  var sort = function sort(prop0, prop1) {\n    if (prop0.length === prop1.length) {\n      return prop0 > prop1 ? 1 : -1;\n    }\n\n    return prop0.length - prop1.length;\n  };\n\n  return {\n    onProcessStyle: function onProcessStyle(style, rule) {\n      if (rule.type !== 'style') return style;\n      var newStyle = {};\n      var props = Object.keys(style).sort(sort);\n\n      for (var i = 0; i < props.length; i++) {\n        newStyle[props[i]] = style[props[i]];\n      }\n\n      return newStyle;\n    }\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssPropsSort);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js":
-/*!************************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js ***!
-  \************************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\nvar now = Date.now();\nvar fnValuesNs = \"fnValues\" + now;\nvar fnRuleNs = \"fnStyle\" + ++now;\nfunction functionPlugin() {\n  return {\n    onCreateRule: function onCreateRule(name, decl, options) {\n      if (typeof decl !== 'function') return null;\n      var rule = Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"createRule\"])(name, {}, options);\n      rule[fnRuleNs] = decl;\n      return rule;\n    },\n    onProcessStyle: function onProcessStyle(style, rule) {\n      // We need to extract function values from the declaration, so that we can keep core unaware of them.\n      // We need to do that only once.\n      // We don't need to extract functions on each style update, since this can happen only once.\n      // We don't support function values inside of function rules.\n      if (fnValuesNs in rule || fnRuleNs in rule) return style;\n      var fnValues = {};\n\n      for (var prop in style) {\n        var value = style[prop];\n        if (typeof value !== 'function') continue;\n        delete style[prop];\n        fnValues[prop] = value;\n      } // $FlowFixMe\n\n\n      rule[fnValuesNs] = fnValues;\n      return style;\n    },\n    onUpdate: function onUpdate(data, rule, sheet, options) {\n      var styleRule = rule;\n      var fnRule = styleRule[fnRuleNs]; // If we have a style function, the entire rule is dynamic and style object\n      // will be returned from that function.\n\n      if (fnRule) {\n        // Empty object will remove all currently defined props\n        // in case function rule returns a falsy value.\n        styleRule.style = fnRule(data) || {};\n\n        if (true) {\n          for (var prop in styleRule.style) {\n            if (typeof styleRule.style[prop] === 'function') {\n               true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(false, '[JSS] Function values inside function rules are not supported.') : undefined;\n              break;\n            }\n          }\n        }\n      }\n\n      var fnValues = styleRule[fnValuesNs]; // If we have a fn values map, it is a rule with function values.\n\n      if (fnValues) {\n        for (var _prop in fnValues) {\n          styleRule.prop(_prop, fnValues[_prop](data), options);\n        }\n      }\n    }\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (functionPlugin);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js":
-/*!****************************************************************************************************!*\
-  !*** ./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js ***!
-  \****************************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var css_vendor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! css-vendor */ \"./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\n/**\n * Add vendor prefix to a property name when needed.\n *\n * @api public\n */\n\nfunction jssVendorPrefixer() {\n  function onProcessRule(rule) {\n    if (rule.type === 'keyframes') {\n      var atRule = rule;\n      atRule.at = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedKeyframes\"])(atRule.at);\n    }\n  }\n\n  function prefixStyle(style) {\n    for (var prop in style) {\n      var value = style[prop];\n\n      if (prop === 'fallbacks' && Array.isArray(value)) {\n        style[prop] = value.map(prefixStyle);\n        continue;\n      }\n\n      var changeProp = false;\n      var supportedProp = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedProperty\"])(prop);\n      if (supportedProp && supportedProp !== prop) changeProp = true;\n      var changeValue = false;\n      var supportedValue$1 = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedValue\"])(supportedProp, Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"toCssValue\"])(value));\n      if (supportedValue$1 && supportedValue$1 !== value) changeValue = true;\n\n      if (changeProp || changeValue) {\n        if (changeProp) delete style[prop];\n        style[supportedProp || prop] = supportedValue$1 || value;\n      }\n    }\n\n    return style;\n  }\n\n  function onProcessStyle(style, rule) {\n    if (rule.type !== 'style') return style;\n    return prefixStyle(style);\n  }\n\n  function onChangeValue(value, prop) {\n    return Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedValue\"])(prop, Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"toCssValue\"])(value)) || value;\n  }\n\n  return {\n    onProcessRule: onProcessRule,\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssVendorPrefixer);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/jss/dist/jss.esm.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/jss/dist/jss.esm.js ***!
-  \******************************************************/
-/*! exports provided: default, RuleList, SheetsManager, SheetsRegistry, create, createGenerateId, createRule, getDynamicStyles, hasCSSTOMSupport, sheets, toCssValue */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RuleList\", function() { return RuleList; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SheetsManager\", function() { return SheetsManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SheetsRegistry\", function() { return SheetsRegistry; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"create\", function() { return create; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createGenerateId\", function() { return createGenerateId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createRule\", function() { return createRule; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getDynamicStyles\", function() { return getDynamicStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasCSSTOMSupport\", function() { return hasCSSTOMSupport; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sheets\", function() { return sheets; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toCssValue\", function() { return toCssValue; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var is_in_browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! is-in-browser */ \"./jaas-client/node_modules/is-in-browser/dist/module.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n\n\n\n\n\n\n\n\nvar plainObjectConstrurctor = {}.constructor;\nfunction cloneStyle(style) {\n  if (style == null || typeof style !== 'object') return style;\n  if (Array.isArray(style)) return style.map(cloneStyle);\n  if (style.constructor !== plainObjectConstrurctor) return style;\n  var newStyle = {};\n\n  for (var name in style) {\n    newStyle[name] = cloneStyle(style[name]);\n  }\n\n  return newStyle;\n}\n\n/**\n * Create a rule instance.\n */\n\nfunction createRule(name, decl, options) {\n  if (name === void 0) {\n    name = 'unnamed';\n  }\n\n  var jss = options.jss;\n  var declCopy = cloneStyle(decl);\n  var rule = jss.plugins.onCreateRule(name, declCopy, options);\n  if (rule) return rule; // It is an at-rule and it has no instance.\n\n  if (name[0] === '@') {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Unknown rule \" + name) : undefined;\n  }\n\n  return null;\n}\n\nvar join = function join(value, by) {\n  var result = '';\n\n  for (var i = 0; i < value.length; i++) {\n    // Remove !important from the value, it will be readded later.\n    if (value[i] === '!important') break;\n    if (result) result += by;\n    result += value[i];\n  }\n\n  return result;\n};\n/**\n * Converts array values to string.\n *\n * `margin: [['5px', '10px']]` > `margin: 5px 10px;`\n * `border: ['1px', '2px']` > `border: 1px, 2px;`\n * `margin: [['5px', '10px'], '!important']` > `margin: 5px 10px !important;`\n * `color: ['red', !important]` > `color: red !important;`\n */\n\n\nfunction toCssValue(value, ignoreImportant) {\n  if (ignoreImportant === void 0) {\n    ignoreImportant = false;\n  }\n\n  if (!Array.isArray(value)) return value;\n  var cssValue = ''; // Support space separated values via `[['5px', '10px']]`.\n\n  if (Array.isArray(value[0])) {\n    for (var i = 0; i < value.length; i++) {\n      if (value[i] === '!important') break;\n      if (cssValue) cssValue += ', ';\n      cssValue += join(value[i], ' ');\n    }\n  } else cssValue = join(value, ', '); // Add !important, because it was ignored.\n\n\n  if (!ignoreImportant && value[value.length - 1] === '!important') {\n    cssValue += ' !important';\n  }\n\n  return cssValue;\n}\n\n/**\n * Indent a string.\n * http://jsperf.com/array-join-vs-for\n */\nfunction indentStr(str, indent) {\n  var result = '';\n\n  for (var index = 0; index < indent; index++) {\n    result += '  ';\n  }\n\n  return result + str;\n}\n/**\n * Converts a Rule to CSS string.\n */\n\n\nfunction toCss(selector, style, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var result = '';\n  if (!style) return result;\n  var _options = options,\n      _options$indent = _options.indent,\n      indent = _options$indent === void 0 ? 0 : _options$indent;\n  var fallbacks = style.fallbacks;\n  if (selector) indent++; // Apply fallbacks first.\n\n  if (fallbacks) {\n    // Array syntax {fallbacks: [{prop: value}]}\n    if (Array.isArray(fallbacks)) {\n      for (var index = 0; index < fallbacks.length; index++) {\n        var fallback = fallbacks[index];\n\n        for (var prop in fallback) {\n          var value = fallback[prop];\n\n          if (value != null) {\n            if (result) result += '\\n';\n            result += \"\" + indentStr(prop + \": \" + toCssValue(value) + \";\", indent);\n          }\n        }\n      }\n    } else {\n      // Object syntax {fallbacks: {prop: value}}\n      for (var _prop in fallbacks) {\n        var _value = fallbacks[_prop];\n\n        if (_value != null) {\n          if (result) result += '\\n';\n          result += \"\" + indentStr(_prop + \": \" + toCssValue(_value) + \";\", indent);\n        }\n      }\n    }\n  }\n\n  for (var _prop2 in style) {\n    var _value2 = style[_prop2];\n\n    if (_value2 != null && _prop2 !== 'fallbacks') {\n      if (result) result += '\\n';\n      result += \"\" + indentStr(_prop2 + \": \" + toCssValue(_value2) + \";\", indent);\n    }\n  } // Allow empty style in this case, because properties will be added dynamically.\n\n\n  if (!result && !options.allowEmpty) return result; // When rule is being stringified before selector was defined.\n\n  if (!selector) return result;\n  indent--;\n  if (result) result = \"\\n\" + result + \"\\n\";\n  return indentStr(selector + \" {\" + result, indent) + indentStr('}', indent);\n}\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`\\s])/g;\nvar nativeEscape = typeof CSS !== 'undefined' && CSS.escape;\nvar escape = (function (str) {\n  return nativeEscape ? nativeEscape(str) : str.replace(escapeRegex, '\\\\$1');\n});\n\nvar BaseStyleRule =\n/*#__PURE__*/\nfunction () {\n  function BaseStyleRule(key, style, options) {\n    this.type = 'style';\n    this.key = void 0;\n    this.isProcessed = false;\n    this.style = void 0;\n    this.renderer = void 0;\n    this.renderable = void 0;\n    this.options = void 0;\n    var sheet = options.sheet,\n        Renderer = options.Renderer;\n    this.key = key;\n    this.options = options;\n    this.style = style;\n    if (sheet) this.renderer = sheet.renderer;else if (Renderer) this.renderer = new Renderer();\n  }\n  /**\n   * Get or set a style property.\n   */\n\n\n  var _proto = BaseStyleRule.prototype;\n\n  _proto.prop = function prop(name, value, options) {\n    // It's a getter.\n    if (value === undefined) return this.style[name]; // Don't do anything if the value has not changed.\n\n    var force = options ? options.force : false;\n    if (!force && this.style[name] === value) return this;\n    var newValue = value;\n\n    if (!options || options.process !== false) {\n      newValue = this.options.jss.plugins.onChangeValue(value, name, this);\n    }\n\n    var isEmpty = newValue == null || newValue === false;\n    var isDefined = name in this.style; // Value is empty and wasn't defined before.\n\n    if (isEmpty && !isDefined && !force) return this; // We are going to remove this value.\n\n    var remove = isEmpty && isDefined;\n    if (remove) delete this.style[name];else this.style[name] = newValue; // Renderable is defined if StyleSheet option `link` is true.\n\n    if (this.renderable && this.renderer) {\n      if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, newValue);\n      return this;\n    }\n\n    var sheet = this.options.sheet;\n\n    if (sheet && sheet.attached) {\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, '[JSS] Rule is not linked. Missing sheet option \"link: true\".') : undefined;\n    }\n\n    return this;\n  };\n\n  return BaseStyleRule;\n}();\nvar StyleRule =\n/*#__PURE__*/\nfunction (_BaseStyleRule) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(StyleRule, _BaseStyleRule);\n\n  function StyleRule(key, style, options) {\n    var _this;\n\n    _this = _BaseStyleRule.call(this, key, style, options) || this;\n    _this.selectorText = void 0;\n    _this.id = void 0;\n    _this.renderable = void 0;\n    var selector = options.selector,\n        scoped = options.scoped,\n        sheet = options.sheet,\n        generateId = options.generateId;\n\n    if (selector) {\n      _this.selectorText = selector;\n    } else if (scoped !== false) {\n      _this.id = generateId(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(_this)), sheet);\n      _this.selectorText = \".\" + escape(_this.id);\n    }\n\n    return _this;\n  }\n  /**\n   * Set selector string.\n   * Attention: use this with caution. Most browsers didn't implement\n   * selectorText setter, so this may result in rerendering of entire Style Sheet.\n   */\n\n\n  var _proto2 = StyleRule.prototype;\n\n  /**\n   * Apply rule to an element inline.\n   */\n  _proto2.applyTo = function applyTo(renderable) {\n    var renderer = this.renderer;\n\n    if (renderer) {\n      var json = this.toJSON();\n\n      for (var prop in json) {\n        renderer.setProperty(renderable, prop, json[prop]);\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Returns JSON representation of the rule.\n   * Fallbacks are not supported.\n   * Useful for inline styles.\n   */\n  ;\n\n  _proto2.toJSON = function toJSON() {\n    var json = {};\n\n    for (var prop in this.style) {\n      var value = this.style[prop];\n      if (typeof value !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = toCssValue(value);\n    }\n\n    return json;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto2.toString = function toString(options) {\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n    var opts = link ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      allowEmpty: true\n    }) : options;\n    return toCss(this.selectorText, this.style, opts);\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(StyleRule, [{\n    key: \"selector\",\n    set: function set(selector) {\n      if (selector === this.selectorText) return;\n      this.selectorText = selector;\n      var renderer = this.renderer,\n          renderable = this.renderable;\n      if (!renderable || !renderer) return;\n      var hasChanged = renderer.setSelector(renderable, selector); // If selector setter is not implemented, rerender the rule.\n\n      if (!hasChanged) {\n        renderer.replaceRule(renderable, this);\n      }\n    }\n    /**\n     * Get selector string.\n     */\n    ,\n    get: function get() {\n      return this.selectorText;\n    }\n  }]);\n\n  return StyleRule;\n}(BaseStyleRule);\nvar pluginStyleRule = {\n  onCreateRule: function onCreateRule(name, style, options) {\n    if (name[0] === '@' || options.parent && options.parent.type === 'keyframes') {\n      return null;\n    }\n\n    return new StyleRule(name, style, options);\n  }\n};\n\nvar defaultToStringOptions = {\n  indent: 1,\n  children: true\n};\nvar atRegExp = /@([\\w-]+)/;\n/**\n * Conditional rule for @media, @supports\n */\n\nvar ConditionalRule =\n/*#__PURE__*/\nfunction () {\n  function ConditionalRule(key, styles, options) {\n    this.type = 'conditional';\n    this.at = void 0;\n    this.key = void 0;\n    this.query = void 0;\n    this.rules = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key; // Key might contain a unique suffix in case the `name` passed by user was duplicate.\n\n    this.query = options.name;\n    var atMatch = key.match(atRegExp);\n    this.at = atMatch ? atMatch[1] : 'unknown';\n    this.options = options;\n    this.rules = new RuleList(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var name in styles) {\n      this.rules.add(name, styles[name]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Get a rule.\n   */\n\n\n  var _proto = ConditionalRule.prototype;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Create and register rule, run plugins.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, style, options) {\n    var rule = this.rules.add(name, style, options);\n    if (!rule) return null;\n    this.options.jss.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    if (options === void 0) {\n      options = defaultToStringOptions;\n    }\n\n    if (options.indent == null) options.indent = defaultToStringOptions.indent;\n    if (options.children == null) options.children = defaultToStringOptions.children;\n\n    if (options.children === false) {\n      return this.query + \" {}\";\n    }\n\n    var children = this.rules.toString(options);\n    return children ? this.query + \" {\\n\" + children + \"\\n}\" : '';\n  };\n\n  return ConditionalRule;\n}();\nvar keyRegExp = /@media|@supports\\s+/;\nvar pluginConditionalRule = {\n  onCreateRule: function onCreateRule(key, styles, options) {\n    return keyRegExp.test(key) ? new ConditionalRule(key, styles, options) : null;\n  }\n};\n\nvar defaultToStringOptions$1 = {\n  indent: 1,\n  children: true\n};\nvar nameRegExp = /@keyframes\\s+([\\w-]+)/;\n/**\n * Rule for @keyframes\n */\n\nvar KeyframesRule =\n/*#__PURE__*/\nfunction () {\n  function KeyframesRule(key, frames, options) {\n    this.type = 'keyframes';\n    this.at = '@keyframes';\n    this.key = void 0;\n    this.name = void 0;\n    this.id = void 0;\n    this.rules = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    var nameMatch = key.match(nameRegExp);\n\n    if (nameMatch && nameMatch[1]) {\n      this.name = nameMatch[1];\n    } else {\n      this.name = 'noname';\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Bad keyframes name \" + key) : undefined;\n    }\n\n    this.key = this.type + \"-\" + this.name;\n    this.options = options;\n    var scoped = options.scoped,\n        sheet = options.sheet,\n        generateId = options.generateId;\n    this.id = scoped === false ? this.name : escape(generateId(this, sheet));\n    this.rules = new RuleList(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var name in frames) {\n      this.rules.add(name, frames[name], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n        parent: this\n      }));\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = KeyframesRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (options === void 0) {\n      options = defaultToStringOptions$1;\n    }\n\n    if (options.indent == null) options.indent = defaultToStringOptions$1.indent;\n    if (options.children == null) options.children = defaultToStringOptions$1.children;\n\n    if (options.children === false) {\n      return this.at + \" \" + this.id + \" {}\";\n    }\n\n    var children = this.rules.toString(options);\n    if (children) children = \"\\n\" + children + \"\\n\";\n    return this.at + \" \" + this.id + \" {\" + children + \"}\";\n  };\n\n  return KeyframesRule;\n}();\nvar keyRegExp$1 = /@keyframes\\s+/;\nvar refRegExp = /\\$([\\w-]+)/g;\n\nvar findReferencedKeyframe = function findReferencedKeyframe(val, keyframes) {\n  if (typeof val === 'string') {\n    return val.replace(refRegExp, function (match, name) {\n      if (name in keyframes) {\n        return keyframes[name];\n      }\n\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Referenced keyframes rule \\\"\" + name + \"\\\" is not defined.\") : undefined;\n      return match;\n    });\n  }\n\n  return val;\n};\n/**\n * Replace the reference for a animation name.\n */\n\n\nvar replaceRef = function replaceRef(style, prop, keyframes) {\n  var value = style[prop];\n  var refKeyframe = findReferencedKeyframe(value, keyframes);\n\n  if (refKeyframe !== value) {\n    style[prop] = refKeyframe;\n  }\n};\n\nvar plugin = {\n  onCreateRule: function onCreateRule(key, frames, options) {\n    return typeof key === 'string' && keyRegExp$1.test(key) ? new KeyframesRule(key, frames, options) : null;\n  },\n  // Animation name ref replacer.\n  onProcessStyle: function onProcessStyle(style, rule, sheet) {\n    if (rule.type !== 'style' || !sheet) return style;\n    if ('animation-name' in style) replaceRef(style, 'animation-name', sheet.keyframes);\n    if ('animation' in style) replaceRef(style, 'animation', sheet.keyframes);\n    return style;\n  },\n  onChangeValue: function onChangeValue(val, prop, rule) {\n    var sheet = rule.options.sheet;\n\n    if (!sheet) {\n      return val;\n    }\n\n    switch (prop) {\n      case 'animation':\n        return findReferencedKeyframe(val, sheet.keyframes);\n\n      case 'animation-name':\n        return findReferencedKeyframe(val, sheet.keyframes);\n\n      default:\n        return val;\n    }\n  }\n};\n\nvar KeyframeRule =\n/*#__PURE__*/\nfunction (_BaseStyleRule) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(KeyframeRule, _BaseStyleRule);\n\n  function KeyframeRule() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _BaseStyleRule.call.apply(_BaseStyleRule, [this].concat(args)) || this;\n    _this.renderable = void 0;\n    return _this;\n  }\n\n  var _proto = KeyframeRule.prototype;\n\n  /**\n   * Generates a CSS string.\n   */\n  _proto.toString = function toString(options) {\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n    var opts = link ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      allowEmpty: true\n    }) : options;\n    return toCss(this.key, this.style, opts);\n  };\n\n  return KeyframeRule;\n}(BaseStyleRule);\nvar pluginKeyframeRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    if (options.parent && options.parent.type === 'keyframes') {\n      return new KeyframeRule(key, style, options);\n    }\n\n    return null;\n  }\n};\n\nvar FontFaceRule =\n/*#__PURE__*/\nfunction () {\n  function FontFaceRule(key, style, options) {\n    this.type = 'font-face';\n    this.at = '@font-face';\n    this.key = void 0;\n    this.style = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.style = style;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = FontFaceRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (Array.isArray(this.style)) {\n      var str = '';\n\n      for (var index = 0; index < this.style.length; index++) {\n        str += toCss(this.at, this.style[index]);\n        if (this.style[index + 1]) str += '\\n';\n      }\n\n      return str;\n    }\n\n    return toCss(this.at, this.style, options);\n  };\n\n  return FontFaceRule;\n}();\nvar keyRegExp$2 = /@font-face/;\nvar pluginFontFaceRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    return keyRegExp$2.test(key) ? new FontFaceRule(key, style, options) : null;\n  }\n};\n\nvar ViewportRule =\n/*#__PURE__*/\nfunction () {\n  function ViewportRule(key, style, options) {\n    this.type = 'viewport';\n    this.at = '@viewport';\n    this.key = void 0;\n    this.style = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.style = style;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = ViewportRule.prototype;\n\n  _proto.toString = function toString(options) {\n    return toCss(this.key, this.style, options);\n  };\n\n  return ViewportRule;\n}();\nvar pluginViewportRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    return key === '@viewport' || key === '@-ms-viewport' ? new ViewportRule(key, style, options) : null;\n  }\n};\n\nvar SimpleRule =\n/*#__PURE__*/\nfunction () {\n  function SimpleRule(key, value, options) {\n    this.type = 'simple';\n    this.key = void 0;\n    this.value = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.value = value;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  // eslint-disable-next-line no-unused-vars\n\n\n  var _proto = SimpleRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (Array.isArray(this.value)) {\n      var str = '';\n\n      for (var index = 0; index < this.value.length; index++) {\n        str += this.key + \" \" + this.value[index] + \";\";\n        if (this.value[index + 1]) str += '\\n';\n      }\n\n      return str;\n    }\n\n    return this.key + \" \" + this.value + \";\";\n  };\n\n  return SimpleRule;\n}();\nvar keysMap = {\n  '@charset': true,\n  '@import': true,\n  '@namespace': true\n};\nvar pluginSimpleRule = {\n  onCreateRule: function onCreateRule(key, value, options) {\n    return key in keysMap ? new SimpleRule(key, value, options) : null;\n  }\n};\n\nvar plugins = [pluginStyleRule, pluginConditionalRule, plugin, pluginKeyframeRule, pluginFontFaceRule, pluginViewportRule, pluginSimpleRule];\n\nvar defaultUpdateOptions = {\n  process: true\n};\nvar forceUpdateOptions = {\n  force: true,\n  process: true\n  /**\n   * Contains rules objects and allows adding/removing etc.\n   * Is used for e.g. by `StyleSheet` or `ConditionalRule`.\n   */\n\n};\n\nvar RuleList =\n/*#__PURE__*/\nfunction () {\n  // Rules registry for access by .get() method.\n  // It contains the same rule registered by name and by selector.\n  // Original styles object.\n  // Used to ensure correct rules order.\n  function RuleList(options) {\n    this.map = {};\n    this.raw = {};\n    this.index = [];\n    this.counter = 0;\n    this.options = void 0;\n    this.classes = void 0;\n    this.keyframes = void 0;\n    this.options = options;\n    this.classes = options.classes;\n    this.keyframes = options.keyframes;\n  }\n  /**\n   * Create and register rule.\n   *\n   * Will not render after Style Sheet was rendered the first time.\n   */\n\n\n  var _proto = RuleList.prototype;\n\n  _proto.add = function add(name, decl, ruleOptions) {\n    var _this$options = this.options,\n        parent = _this$options.parent,\n        sheet = _this$options.sheet,\n        jss = _this$options.jss,\n        Renderer = _this$options.Renderer,\n        generateId = _this$options.generateId,\n        scoped = _this$options.scoped;\n\n    var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      classes: this.classes,\n      parent: parent,\n      sheet: sheet,\n      jss: jss,\n      Renderer: Renderer,\n      generateId: generateId,\n      scoped: scoped,\n      name: name\n    }, ruleOptions); // When user uses .createStyleSheet(), duplicate names are not possible, but\n    // `sheet.addRule()` opens the door for any duplicate rule name. When this happens\n    // we need to make the key unique within this RuleList instance scope.\n\n\n    var key = name;\n\n    if (name in this.raw) {\n      key = name + \"-d\" + this.counter++;\n    } // We need to save the original decl before creating the rule\n    // because cache plugin needs to use it as a key to return a cached rule.\n\n\n    this.raw[key] = decl;\n\n    if (key in this.classes) {\n      // E.g. rules inside of @media container\n      options.selector = \".\" + escape(this.classes[key]);\n    }\n\n    var rule = createRule(key, decl, options);\n    if (!rule) return null;\n    this.register(rule);\n    var index = options.index === undefined ? this.index.length : options.index;\n    this.index.splice(index, 0, rule);\n    return rule;\n  }\n  /**\n   * Get a rule.\n   */\n  ;\n\n  _proto.get = function get(name) {\n    return this.map[name];\n  }\n  /**\n   * Delete a rule.\n   */\n  ;\n\n  _proto.remove = function remove(rule) {\n    this.unregister(rule);\n    delete this.raw[rule.key];\n    this.index.splice(this.index.indexOf(rule), 1);\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.index.indexOf(rule);\n  }\n  /**\n   * Run `onProcessRule()` plugins on every rule.\n   */\n  ;\n\n  _proto.process = function process() {\n    var plugins = this.options.jss.plugins; // We need to clone array because if we modify the index somewhere else during a loop\n    // we end up with very hard-to-track-down side effects.\n\n    this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n  }\n  /**\n   * Register a rule in `.map`, `.classes` and `.keyframes` maps.\n   */\n  ;\n\n  _proto.register = function register(rule) {\n    this.map[rule.key] = rule;\n\n    if (rule instanceof StyleRule) {\n      this.map[rule.selector] = rule;\n      if (rule.id) this.classes[rule.key] = rule.id;\n    } else if (rule instanceof KeyframesRule && this.keyframes) {\n      this.keyframes[rule.name] = rule.id;\n    }\n  }\n  /**\n   * Unregister a rule.\n   */\n  ;\n\n  _proto.unregister = function unregister(rule) {\n    delete this.map[rule.key];\n\n    if (rule instanceof StyleRule) {\n      delete this.map[rule.selector];\n      delete this.classes[rule.key];\n    } else if (rule instanceof KeyframesRule) {\n      delete this.keyframes[rule.name];\n    }\n  }\n  /**\n   * Update the function values with a new data.\n   */\n  ;\n\n  _proto.update = function update() {\n    var name;\n    var data;\n    var options;\n\n    if (typeof (arguments.length <= 0 ? undefined : arguments[0]) === 'string') {\n      name = arguments.length <= 0 ? undefined : arguments[0]; // $FlowFixMe\n\n      data = arguments.length <= 1 ? undefined : arguments[1]; // $FlowFixMe\n\n      options = arguments.length <= 2 ? undefined : arguments[2];\n    } else {\n      data = arguments.length <= 0 ? undefined : arguments[0]; // $FlowFixMe\n\n      options = arguments.length <= 1 ? undefined : arguments[1];\n      name = null;\n    }\n\n    if (name) {\n      this.updateOne(this.map[name], data, options);\n    } else {\n      for (var index = 0; index < this.index.length; index++) {\n        this.updateOne(this.index[index], data, options);\n      }\n    }\n  }\n  /**\n   * Execute plugins, update rule props.\n   */\n  ;\n\n  _proto.updateOne = function updateOne(rule, data, options) {\n    if (options === void 0) {\n      options = defaultUpdateOptions;\n    }\n\n    var _this$options2 = this.options,\n        plugins = _this$options2.jss.plugins,\n        sheet = _this$options2.sheet; // It is a rules container like for e.g. ConditionalRule.\n\n    if (rule.rules instanceof RuleList) {\n      rule.rules.update(data, options);\n      return;\n    }\n\n    var styleRule = rule;\n    var style = styleRule.style;\n    plugins.onUpdate(data, rule, sheet, options); // We rely on a new `style` ref in case it was mutated during onUpdate hook.\n\n    if (options.process && style && style !== styleRule.style) {\n      // We need to run the plugins in case new `style` relies on syntax plugins.\n      plugins.onProcessStyle(styleRule.style, styleRule, sheet); // Update and add props.\n\n      for (var prop in styleRule.style) {\n        var nextValue = styleRule.style[prop];\n        var prevValue = style[prop]; // We need to use `force: true` because `rule.style` has been updated during onUpdate hook, so `rule.prop()` will not update the CSSOM rule.\n        // We do this comparison to avoid unneeded `rule.prop()` calls, since we have the old `style` object here.\n\n        if (nextValue !== prevValue) {\n          styleRule.prop(prop, nextValue, forceUpdateOptions);\n        }\n      } // Remove props.\n\n\n      for (var _prop in style) {\n        var _nextValue = styleRule.style[_prop];\n        var _prevValue = style[_prop]; // We need to use `force: true` because `rule.style` has been updated during onUpdate hook, so `rule.prop()` will not update the CSSOM rule.\n        // We do this comparison to avoid unneeded `rule.prop()` calls, since we have the old `style` object here.\n\n        if (_nextValue == null && _nextValue !== _prevValue) {\n          styleRule.prop(_prop, null, forceUpdateOptions);\n        }\n      }\n    }\n  }\n  /**\n   * Convert rules to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    var str = '';\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n\n    for (var index = 0; index < this.index.length; index++) {\n      var rule = this.index[index];\n      var css = rule.toString(options); // No need to render an empty rule.\n\n      if (!css && !link) continue;\n      if (str) str += '\\n';\n      str += css;\n    }\n\n    return str;\n  };\n\n  return RuleList;\n}();\n\nvar StyleSheet =\n/*#__PURE__*/\nfunction () {\n  function StyleSheet(styles, options) {\n    this.options = void 0;\n    this.deployed = void 0;\n    this.attached = void 0;\n    this.rules = void 0;\n    this.renderer = void 0;\n    this.classes = void 0;\n    this.keyframes = void 0;\n    this.queue = void 0;\n    this.attached = false;\n    this.deployed = false;\n    this.classes = {};\n    this.keyframes = {};\n    this.options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      sheet: this,\n      parent: this,\n      classes: this.classes,\n      keyframes: this.keyframes\n    });\n\n    if (options.Renderer) {\n      this.renderer = new options.Renderer(this);\n    }\n\n    this.rules = new RuleList(this.options);\n\n    for (var name in styles) {\n      this.rules.add(name, styles[name]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Attach renderable to the render tree.\n   */\n\n\n  var _proto = StyleSheet.prototype;\n\n  _proto.attach = function attach() {\n    if (this.attached) return this;\n    if (this.renderer) this.renderer.attach();\n    this.attached = true; // Order is important, because we can't use insertRule API if style element is not attached.\n\n    if (!this.deployed) this.deploy();\n    return this;\n  }\n  /**\n   * Remove renderable from render tree.\n   */\n  ;\n\n  _proto.detach = function detach() {\n    if (!this.attached) return this;\n    if (this.renderer) this.renderer.detach();\n    this.attached = false;\n    return this;\n  }\n  /**\n   * Add a rule to the current stylesheet.\n   * Will insert a rule also after the stylesheet has been rendered first time.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, decl, options) {\n    var queue = this.queue; // Plugins can create rules.\n    // In order to preserve the right order, we need to queue all `.addRule` calls,\n    // which happen after the first `rules.add()` call.\n\n    if (this.attached && !queue) this.queue = [];\n    var rule = this.rules.add(name, decl, options);\n    if (!rule) return null;\n    this.options.jss.plugins.onProcessRule(rule);\n\n    if (this.attached) {\n      if (!this.deployed) return rule; // Don't insert rule directly if there is no stringified version yet.\n      // It will be inserted all together when .attach is called.\n\n      if (queue) queue.push(rule);else {\n        this.insertRule(rule);\n\n        if (this.queue) {\n          this.queue.forEach(this.insertRule, this);\n          this.queue = undefined;\n        }\n      }\n      return rule;\n    } // We can't add rules to a detached style node.\n    // We will redeploy the sheet once user will attach it.\n\n\n    this.deployed = false;\n    return rule;\n  }\n  /**\n   * Insert rule into the StyleSheet\n   */\n  ;\n\n  _proto.insertRule = function insertRule(rule) {\n    if (this.renderer) {\n      this.renderer.insertRule(rule);\n    }\n  }\n  /**\n   * Create and add rules.\n   * Will render also after Style Sheet was rendered the first time.\n   */\n  ;\n\n  _proto.addRules = function addRules(styles, options) {\n    var added = [];\n\n    for (var name in styles) {\n      var rule = this.addRule(name, styles[name], options);\n      if (rule) added.push(rule);\n    }\n\n    return added;\n  }\n  /**\n   * Get a rule by name.\n   */\n  ;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Delete a rule by name.\n   * Returns `true`: if rule has been deleted from the DOM.\n   */\n  ;\n\n  _proto.deleteRule = function deleteRule(name) {\n    var rule = typeof name === 'object' ? name : this.rules.get(name);\n    if (!rule) return false;\n    this.rules.remove(rule);\n\n    if (this.attached && rule.renderable && this.renderer) {\n      return this.renderer.deleteRule(rule.renderable);\n    }\n\n    return true;\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Deploy pure CSS string to a renderable.\n   */\n  ;\n\n  _proto.deploy = function deploy() {\n    if (this.renderer) this.renderer.deploy();\n    this.deployed = true;\n    return this;\n  }\n  /**\n   * Update the function values with a new data.\n   */\n  ;\n\n  _proto.update = function update() {\n    var _this$rules;\n\n    (_this$rules = this.rules).update.apply(_this$rules, arguments);\n\n    return this;\n  }\n  /**\n   * Updates a single rule.\n   */\n  ;\n\n  _proto.updateOne = function updateOne(rule, data, options) {\n    this.rules.updateOne(rule, data, options);\n    return this;\n  }\n  /**\n   * Convert rules to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    return this.rules.toString(options);\n  };\n\n  return StyleSheet;\n}();\n\nvar PluginsRegistry =\n/*#__PURE__*/\nfunction () {\n  function PluginsRegistry() {\n    this.plugins = {\n      internal: [],\n      external: []\n    };\n    this.registry = void 0;\n  }\n\n  var _proto = PluginsRegistry.prototype;\n\n  /**\n   * Call `onCreateRule` hooks and return an object if returned by a hook.\n   */\n  _proto.onCreateRule = function onCreateRule(name, decl, options) {\n    for (var i = 0; i < this.registry.onCreateRule.length; i++) {\n      var rule = this.registry.onCreateRule[i](name, decl, options);\n      if (rule) return rule;\n    }\n\n    return null;\n  }\n  /**\n   * Call `onProcessRule` hooks.\n   */\n  ;\n\n  _proto.onProcessRule = function onProcessRule(rule) {\n    if (rule.isProcessed) return;\n    var sheet = rule.options.sheet;\n\n    for (var i = 0; i < this.registry.onProcessRule.length; i++) {\n      this.registry.onProcessRule[i](rule, sheet);\n    }\n\n    if (rule.style) this.onProcessStyle(rule.style, rule, sheet);\n    rule.isProcessed = true;\n  }\n  /**\n   * Call `onProcessStyle` hooks.\n   */\n  ;\n\n  _proto.onProcessStyle = function onProcessStyle(style, rule, sheet) {\n    for (var i = 0; i < this.registry.onProcessStyle.length; i++) {\n      // $FlowFixMe\n      rule.style = this.registry.onProcessStyle[i](rule.style, rule, sheet);\n    }\n  }\n  /**\n   * Call `onProcessSheet` hooks.\n   */\n  ;\n\n  _proto.onProcessSheet = function onProcessSheet(sheet) {\n    for (var i = 0; i < this.registry.onProcessSheet.length; i++) {\n      this.registry.onProcessSheet[i](sheet);\n    }\n  }\n  /**\n   * Call `onUpdate` hooks.\n   */\n  ;\n\n  _proto.onUpdate = function onUpdate(data, rule, sheet, options) {\n    for (var i = 0; i < this.registry.onUpdate.length; i++) {\n      this.registry.onUpdate[i](data, rule, sheet, options);\n    }\n  }\n  /**\n   * Call `onChangeValue` hooks.\n   */\n  ;\n\n  _proto.onChangeValue = function onChangeValue(value, prop, rule) {\n    var processedValue = value;\n\n    for (var i = 0; i < this.registry.onChangeValue.length; i++) {\n      processedValue = this.registry.onChangeValue[i](processedValue, prop, rule);\n    }\n\n    return processedValue;\n  }\n  /**\n   * Register a plugin.\n   */\n  ;\n\n  _proto.use = function use(newPlugin, options) {\n    if (options === void 0) {\n      options = {\n        queue: 'external'\n      };\n    }\n\n    var plugins = this.plugins[options.queue]; // Avoids applying same plugin twice, at least based on ref.\n\n    if (plugins.indexOf(newPlugin) !== -1) {\n      return;\n    }\n\n    plugins.push(newPlugin);\n    this.registry = [].concat(this.plugins.external, this.plugins.internal).reduce(function (registry, plugin) {\n      for (var name in plugin) {\n        if (name in registry) {\n          registry[name].push(plugin[name]);\n        } else {\n           true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Unknown hook \\\"\" + name + \"\\\".\") : undefined;\n        }\n      }\n\n      return registry;\n    }, {\n      onCreateRule: [],\n      onProcessRule: [],\n      onProcessStyle: [],\n      onProcessSheet: [],\n      onChangeValue: [],\n      onUpdate: []\n    });\n  };\n\n  return PluginsRegistry;\n}();\n\n/**\n * Sheets registry to access them all at one place.\n */\nvar SheetsRegistry =\n/*#__PURE__*/\nfunction () {\n  function SheetsRegistry() {\n    this.registry = [];\n  }\n\n  var _proto = SheetsRegistry.prototype;\n\n  /**\n   * Register a Style Sheet.\n   */\n  _proto.add = function add(sheet) {\n    var registry = this.registry;\n    var index = sheet.options.index;\n    if (registry.indexOf(sheet) !== -1) return;\n\n    if (registry.length === 0 || index >= this.index) {\n      registry.push(sheet);\n      return;\n    } // Find a position.\n\n\n    for (var i = 0; i < registry.length; i++) {\n      if (registry[i].options.index > index) {\n        registry.splice(i, 0, sheet);\n        return;\n      }\n    }\n  }\n  /**\n   * Reset the registry.\n   */\n  ;\n\n  _proto.reset = function reset() {\n    this.registry = [];\n  }\n  /**\n   * Remove a Style Sheet.\n   */\n  ;\n\n  _proto.remove = function remove(sheet) {\n    var index = this.registry.indexOf(sheet);\n    this.registry.splice(index, 1);\n  }\n  /**\n   * Convert all attached sheets to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n        attached = _ref.attached,\n        options = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(_ref, [\"attached\"]);\n\n    var css = '';\n\n    for (var i = 0; i < this.registry.length; i++) {\n      var sheet = this.registry[i];\n\n      if (attached != null && sheet.attached !== attached) {\n        continue;\n      }\n\n      if (css) css += '\\n';\n      css += sheet.toString(options);\n    }\n\n    return css;\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(SheetsRegistry, [{\n    key: \"index\",\n\n    /**\n     * Current highest index number.\n     */\n    get: function get() {\n      return this.registry.length === 0 ? 0 : this.registry[this.registry.length - 1].options.index;\n    }\n  }]);\n\n  return SheetsRegistry;\n}();\n\n/**\n * This is a global sheets registry. Only DomRenderer will add sheets to it.\n * On the server one should use an own SheetsRegistry instance and add the\n * sheets to it, because you need to make sure to create a new registry for\n * each request in order to not leak sheets across requests.\n */\n\nvar sheets = new SheetsRegistry();\n\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar globalThis = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\n\nvar ns = '2f1acc6c3a606b082e5eef5e54414ffb';\nif (globalThis[ns] == null) globalThis[ns] = 0; // Bundle may contain multiple JSS versions at the same time. In order to identify\n// the current version with just one short number and use it for classes generation\n// we use a counter. Also it is more accurate, because user can manually reevaluate\n// the module.\n\nvar moduleId = globalThis[ns]++;\n\nvar maxRules = 1e10;\n\n/**\n * Returns a function which generates unique class names based on counters.\n * When new generator function is created, rule counter is reseted.\n * We need to reset the rule counter for SSR for each request.\n */\nvar createGenerateId = function createGenerateId(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var ruleCounter = 0;\n  return function (rule, sheet) {\n    ruleCounter += 1;\n\n    if (ruleCounter > maxRules) {\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] You might have a memory leak. Rule counter is at \" + ruleCounter + \".\") : undefined;\n    }\n\n    var jssId = '';\n    var prefix = '';\n\n    if (sheet) {\n      if (sheet.options.classNamePrefix) {\n        prefix = sheet.options.classNamePrefix;\n      }\n\n      if (sheet.options.jss.id != null) {\n        jssId = String(sheet.options.jss.id);\n      }\n    }\n\n    if (options.minify) {\n      // Using \"c\" because a number can't be the first char in a class name.\n      return \"\" + (prefix || 'c') + moduleId + jssId + ruleCounter;\n    }\n\n    return prefix + rule.key + \"-\" + moduleId + (jssId ? \"-\" + jssId : '') + \"-\" + ruleCounter;\n  };\n};\n\n/**\n * Cache the value from the first time a function is called.\n */\nvar memoize = function memoize(fn) {\n  var value;\n  return function () {\n    if (!value) value = fn();\n    return value;\n  };\n};\n/**\n * Get a style property value.\n */\n\n\nfunction getPropertyValue(cssRule, prop) {\n  try {\n    // Support CSSTOM.\n    if (cssRule.attributeStyleMap) {\n      return cssRule.attributeStyleMap.get(prop);\n    }\n\n    return cssRule.style.getPropertyValue(prop);\n  } catch (err) {\n    // IE may throw if property is unknown.\n    return '';\n  }\n}\n/**\n * Set a style property.\n */\n\n\nfunction setProperty(cssRule, prop, value) {\n  try {\n    var cssValue = value;\n\n    if (Array.isArray(value)) {\n      cssValue = toCssValue(value, true);\n\n      if (value[value.length - 1] === '!important') {\n        cssRule.style.setProperty(prop, cssValue, 'important');\n        return true;\n      }\n    } // Support CSSTOM.\n\n\n    if (cssRule.attributeStyleMap) {\n      cssRule.attributeStyleMap.set(prop, cssValue);\n    } else {\n      cssRule.style.setProperty(prop, cssValue);\n    }\n  } catch (err) {\n    // IE may throw if property is unknown.\n    return false;\n  }\n\n  return true;\n}\n/**\n * Remove a style property.\n */\n\n\nfunction removeProperty(cssRule, prop) {\n  try {\n    // Support CSSTOM.\n    if (cssRule.attributeStyleMap) {\n      cssRule.attributeStyleMap.delete(prop);\n    } else {\n      cssRule.style.removeProperty(prop);\n    }\n  } catch (err) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] DOMException \\\"\" + err.message + \"\\\" was thrown. Tried to remove property \\\"\" + prop + \"\\\".\") : undefined;\n  }\n}\n/**\n * Set the selector.\n */\n\n\nfunction setSelector(cssRule, selectorText) {\n  cssRule.selectorText = selectorText; // Return false if setter was not successful.\n  // Currently works in chrome only.\n\n  return cssRule.selectorText === selectorText;\n}\n/**\n * Gets the `head` element upon the first call and caches it.\n * We assume it can't be null.\n */\n\n\nvar getHead = memoize(function () {\n  return document.querySelector('head');\n});\n/**\n * Find attached sheet with an index higher than the passed one.\n */\n\nfunction findHigherSheet(registry, options) {\n  for (var i = 0; i < registry.length; i++) {\n    var sheet = registry[i];\n\n    if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) {\n      return sheet;\n    }\n  }\n\n  return null;\n}\n/**\n * Find attached sheet with the highest index.\n */\n\n\nfunction findHighestSheet(registry, options) {\n  for (var i = registry.length - 1; i >= 0; i--) {\n    var sheet = registry[i];\n\n    if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) {\n      return sheet;\n    }\n  }\n\n  return null;\n}\n/**\n * Find a comment with \"jss\" inside.\n */\n\n\nfunction findCommentNode(text) {\n  var head = getHead();\n\n  for (var i = 0; i < head.childNodes.length; i++) {\n    var node = head.childNodes[i];\n\n    if (node.nodeType === 8 && node.nodeValue.trim() === text) {\n      return node;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Find a node before which we can insert the sheet.\n */\nfunction findPrevNode(options) {\n  var registry = sheets.registry;\n\n  if (registry.length > 0) {\n    // Try to insert before the next higher sheet.\n    var sheet = findHigherSheet(registry, options);\n\n    if (sheet && sheet.renderer) {\n      return {\n        parent: sheet.renderer.element.parentNode,\n        node: sheet.renderer.element\n      };\n    } // Otherwise insert after the last attached.\n\n\n    sheet = findHighestSheet(registry, options);\n\n    if (sheet && sheet.renderer) {\n      return {\n        parent: sheet.renderer.element.parentNode,\n        node: sheet.renderer.element.nextSibling\n      };\n    }\n  } // Try to find a comment placeholder if registry is empty.\n\n\n  var insertionPoint = options.insertionPoint;\n\n  if (insertionPoint && typeof insertionPoint === 'string') {\n    var comment = findCommentNode(insertionPoint);\n\n    if (comment) {\n      return {\n        parent: comment.parentNode,\n        node: comment.nextSibling\n      };\n    } // If user specifies an insertion point and it can't be found in the document -\n    // bad specificity issues may appear.\n\n\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Insertion point \\\"\" + insertionPoint + \"\\\" not found.\") : undefined;\n  }\n\n  return false;\n}\n/**\n * Insert style element into the DOM.\n */\n\n\nfunction insertStyle(style, options) {\n  var insertionPoint = options.insertionPoint;\n  var nextNode = findPrevNode(options);\n\n  if (nextNode !== false && nextNode.parent) {\n    nextNode.parent.insertBefore(style, nextNode.node);\n    return;\n  } // Works with iframes and any node types.\n\n\n  if (insertionPoint && typeof insertionPoint.nodeType === 'number') {\n    // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n    var insertionPointElement = insertionPoint;\n    var parentNode = insertionPointElement.parentNode;\n    if (parentNode) parentNode.insertBefore(style, insertionPointElement.nextSibling);else  true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, '[JSS] Insertion point is not in the DOM.') : undefined;\n    return;\n  }\n\n  getHead().appendChild(style);\n}\n/**\n * Read jss nonce setting from the page if the user has set it.\n */\n\n\nvar getNonce = memoize(function () {\n  var node = document.querySelector('meta[property=\"csp-nonce\"]');\n  return node ? node.getAttribute('content') : null;\n});\n\nvar _insertRule = function insertRule(container, rule, index) {\n  var maxIndex = container.cssRules.length; // In case previous insertion fails, passed index might be wrong\n\n  if (index === undefined || index > maxIndex) {\n    // eslint-disable-next-line no-param-reassign\n    index = maxIndex;\n  }\n\n  try {\n    if ('insertRule' in container) {\n      var c = container;\n      c.insertRule(rule, index);\n    } // Keyframes rule.\n    else if ('appendRule' in container) {\n        var _c = container;\n\n        _c.appendRule(rule);\n      }\n  } catch (err) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] \" + err.message) : undefined;\n    return false;\n  }\n\n  return container.cssRules[index];\n};\n\nvar createStyle = function createStyle() {\n  var el = document.createElement('style'); // Without it, IE will have a broken source order specificity if we\n  // insert rules after we insert the style tag.\n  // It seems to kick-off the source order specificity algorithm.\n\n  el.textContent = '\\n';\n  return el;\n};\n\nvar DomRenderer =\n/*#__PURE__*/\nfunction () {\n  // HTMLStyleElement needs fixing https://github.com/facebook/flow/issues/2696\n  function DomRenderer(sheet) {\n    this.getPropertyValue = getPropertyValue;\n    this.setProperty = setProperty;\n    this.removeProperty = removeProperty;\n    this.setSelector = setSelector;\n    this.element = void 0;\n    this.sheet = void 0;\n    this.hasInsertedRules = false;\n    // There is no sheet when the renderer is used from a standalone StyleRule.\n    if (sheet) sheets.add(sheet);\n    this.sheet = sheet;\n\n    var _ref = this.sheet ? this.sheet.options : {},\n        media = _ref.media,\n        meta = _ref.meta,\n        element = _ref.element;\n\n    this.element = element || createStyle();\n    this.element.setAttribute('data-jss', '');\n    if (media) this.element.setAttribute('media', media);\n    if (meta) this.element.setAttribute('data-meta', meta);\n    var nonce = getNonce();\n    if (nonce) this.element.setAttribute('nonce', nonce);\n  }\n  /**\n   * Insert style element into render tree.\n   */\n\n\n  var _proto = DomRenderer.prototype;\n\n  _proto.attach = function attach() {\n    // In the case the element node is external and it is already in the DOM.\n    if (this.element.parentNode || !this.sheet) return;\n    insertStyle(this.element, this.sheet.options); // When rules are inserted using `insertRule` API, after `sheet.detach().attach()`\n    // most browsers create a new CSSStyleSheet, except of all IEs.\n\n    var deployed = Boolean(this.sheet && this.sheet.deployed);\n\n    if (this.hasInsertedRules && deployed) {\n      this.hasInsertedRules = false;\n      this.deploy();\n    }\n  }\n  /**\n   * Remove style element from render tree.\n   */\n  ;\n\n  _proto.detach = function detach() {\n    var parentNode = this.element.parentNode;\n    if (parentNode) parentNode.removeChild(this.element);\n  }\n  /**\n   * Inject CSS string into element.\n   */\n  ;\n\n  _proto.deploy = function deploy() {\n    var sheet = this.sheet;\n    if (!sheet) return;\n\n    if (sheet.options.link) {\n      this.insertRules(sheet.rules);\n      return;\n    }\n\n    this.element.textContent = \"\\n\" + sheet.toString() + \"\\n\";\n  }\n  /**\n   * Insert RuleList into an element.\n   */\n  ;\n\n  _proto.insertRules = function insertRules(rules, nativeParent) {\n    for (var i = 0; i < rules.index.length; i++) {\n      this.insertRule(rules.index[i], i, nativeParent);\n    }\n  }\n  /**\n   * Insert a rule into element.\n   */\n  ;\n\n  _proto.insertRule = function insertRule(rule, index, nativeParent) {\n    if (nativeParent === void 0) {\n      nativeParent = this.element.sheet;\n    }\n\n    if (rule.rules) {\n      var parent = rule;\n      var latestNativeParent = nativeParent;\n\n      if (rule.type === 'conditional' || rule.type === 'keyframes') {\n        // We need to render the container without children first.\n        latestNativeParent = _insertRule(nativeParent, parent.toString({\n          children: false\n        }), index);\n\n        if (latestNativeParent === false) {\n          return false;\n        }\n      }\n\n      this.insertRules(parent.rules, latestNativeParent);\n      return latestNativeParent;\n    } // IE keeps the CSSStyleSheet after style node has been reattached,\n    // so we need to check if the `renderable` reference the right style sheet and not\n    // rerender those rules.\n\n\n    if (rule.renderable && rule.renderable.parentStyleSheet === this.element.sheet) {\n      return rule.renderable;\n    }\n\n    var ruleStr = rule.toString();\n    if (!ruleStr) return false;\n\n    var nativeRule = _insertRule(nativeParent, ruleStr, index);\n\n    if (nativeRule === false) {\n      return false;\n    }\n\n    this.hasInsertedRules = true;\n    rule.renderable = nativeRule;\n    return nativeRule;\n  }\n  /**\n   * Delete a rule.\n   */\n  ;\n\n  _proto.deleteRule = function deleteRule(cssRule) {\n    var sheet = this.element.sheet;\n    var index = this.indexOf(cssRule);\n    if (index === -1) return false;\n    sheet.deleteRule(index);\n    return true;\n  }\n  /**\n   * Get index of a CSS Rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(cssRule) {\n    var cssRules = this.element.sheet.cssRules;\n\n    for (var index = 0; index < cssRules.length; index++) {\n      if (cssRule === cssRules[index]) return index;\n    }\n\n    return -1;\n  }\n  /**\n   * Generate a new CSS rule and replace the existing one.\n   *\n   * Only used for some old browsers because they can't set a selector.\n   */\n  ;\n\n  _proto.replaceRule = function replaceRule(cssRule, rule) {\n    var index = this.indexOf(cssRule);\n    if (index === -1) return false;\n    this.element.sheet.deleteRule(index);\n    return this.insertRule(rule, index);\n  }\n  /**\n   * Get all rules elements.\n   */\n  ;\n\n  _proto.getRules = function getRules() {\n    return this.element.sheet.cssRules;\n  };\n\n  return DomRenderer;\n}();\n\nvar instanceCounter = 0;\n\nvar Jss =\n/*#__PURE__*/\nfunction () {\n  function Jss(options) {\n    this.id = instanceCounter++;\n    this.version = \"10.3.0\";\n    this.plugins = new PluginsRegistry();\n    this.options = {\n      id: {\n        minify: false\n      },\n      createGenerateId: createGenerateId,\n      Renderer: is_in_browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"] ? DomRenderer : null,\n      plugins: []\n    };\n    this.generateId = createGenerateId({\n      minify: false\n    });\n\n    for (var i = 0; i < plugins.length; i++) {\n      this.plugins.use(plugins[i], {\n        queue: 'internal'\n      });\n    }\n\n    this.setup(options);\n  }\n  /**\n   * Prepares various options, applies plugins.\n   * Should not be used twice on the same instance, because there is no plugins\n   * deduplication logic.\n   */\n\n\n  var _proto = Jss.prototype;\n\n  _proto.setup = function setup(options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    if (options.createGenerateId) {\n      this.options.createGenerateId = options.createGenerateId;\n    }\n\n    if (options.id) {\n      this.options.id = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, this.options.id, options.id);\n    }\n\n    if (options.createGenerateId || options.id) {\n      this.generateId = this.options.createGenerateId(this.options.id);\n    }\n\n    if (options.insertionPoint != null) this.options.insertionPoint = options.insertionPoint;\n\n    if ('Renderer' in options) {\n      this.options.Renderer = options.Renderer;\n    } // eslint-disable-next-line prefer-spread\n\n\n    if (options.plugins) this.use.apply(this, options.plugins);\n    return this;\n  }\n  /**\n   * Create a Style Sheet.\n   */\n  ;\n\n  _proto.createStyleSheet = function createStyleSheet(styles, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        index = _options.index;\n\n    if (typeof index !== 'number') {\n      index = sheets.index === 0 ? 0 : sheets.index + 1;\n    }\n\n    var sheet = new StyleSheet(styles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      jss: this,\n      generateId: options.generateId || this.generateId,\n      insertionPoint: this.options.insertionPoint,\n      Renderer: this.options.Renderer,\n      index: index\n    }));\n    this.plugins.onProcessSheet(sheet);\n    return sheet;\n  }\n  /**\n   * Detach the Style Sheet and remove it from the registry.\n   */\n  ;\n\n  _proto.removeStyleSheet = function removeStyleSheet(sheet) {\n    sheet.detach();\n    sheets.remove(sheet);\n    return this;\n  }\n  /**\n   * Create a rule without a Style Sheet.\n   * [Deprecated] will be removed in the next major version.\n   */\n  ;\n\n  _proto.createRule = function createRule$1(name, style, options) {\n    if (style === void 0) {\n      style = {};\n    }\n\n    if (options === void 0) {\n      options = {};\n    }\n\n    // Enable rule without name for inline styles.\n    if (typeof name === 'object') {\n      return this.createRule(undefined, name, style);\n    }\n\n    var ruleOptions = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      name: name,\n      jss: this,\n      Renderer: this.options.Renderer\n    });\n\n    if (!ruleOptions.generateId) ruleOptions.generateId = this.generateId;\n    if (!ruleOptions.classes) ruleOptions.classes = {};\n    if (!ruleOptions.keyframes) ruleOptions.keyframes = {};\n\n    var rule = createRule(name, style, ruleOptions);\n\n    if (rule) this.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Register plugin. Passed function will be invoked with a rule instance.\n   */\n  ;\n\n  _proto.use = function use() {\n    var _this = this;\n\n    for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n      plugins[_key] = arguments[_key];\n    }\n\n    plugins.forEach(function (plugin) {\n      _this.plugins.use(plugin);\n    });\n    return this;\n  };\n\n  return Jss;\n}();\n\n/**\n * Extracts a styles object with only props that contain function values.\n */\nfunction getDynamicStyles(styles) {\n  var to = null;\n\n  for (var key in styles) {\n    var value = styles[key];\n    var type = typeof value;\n\n    if (type === 'function') {\n      if (!to) to = {};\n      to[key] = value;\n    } else if (type === 'object' && value !== null && !Array.isArray(value)) {\n      var extracted = getDynamicStyles(value);\n\n      if (extracted) {\n        if (!to) to = {};\n        to[key] = extracted;\n      }\n    }\n  }\n\n  return to;\n}\n\n/**\n * SheetsManager is like a WeakMap which is designed to count StyleSheet\n * instances and attach/detach automatically.\n */\nvar SheetsManager =\n/*#__PURE__*/\nfunction () {\n  function SheetsManager() {\n    this.length = 0;\n    this.sheets = new WeakMap();\n  }\n\n  var _proto = SheetsManager.prototype;\n\n  _proto.get = function get(key) {\n    var entry = this.sheets.get(key);\n    return entry && entry.sheet;\n  };\n\n  _proto.add = function add(key, sheet) {\n    if (this.sheets.has(key)) return;\n    this.length++;\n    this.sheets.set(key, {\n      sheet: sheet,\n      refs: 0\n    });\n  };\n\n  _proto.manage = function manage(key) {\n    var entry = this.sheets.get(key);\n\n    if (entry) {\n      if (entry.refs === 0) {\n        entry.sheet.attach();\n      }\n\n      entry.refs++;\n      return entry.sheet;\n    }\n\n    Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] SheetsManager: can't find sheet to manage\");\n    return undefined;\n  };\n\n  _proto.unmanage = function unmanage(key) {\n    var entry = this.sheets.get(key);\n\n    if (entry) {\n      if (entry.refs > 0) {\n        entry.refs--;\n        if (entry.refs === 0) entry.sheet.detach();\n      }\n    } else {\n      Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"SheetsManager: can't find sheet to unmanage\");\n    }\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(SheetsManager, [{\n    key: \"size\",\n    get: function get() {\n      return this.length;\n    }\n  }]);\n\n  return SheetsManager;\n}();\n\n/**\n * A better abstraction over CSS.\n *\n * @copyright Oleg Isonen (Slobodskoi) / Isonen 2014-present\n * @website https://github.com/cssinjs/jss\n * @license MIT\n */\n\n/**\n * Export a constant indicating if this browser has CSSTOM support.\n * https://developers.google.com/web/updates/2018/03/cssom\n */\nvar hasCSSTOMSupport = typeof CSS !== 'undefined' && CSS && 'number' in CSS;\n/**\n * Creates a new instance of Jss.\n */\n\nvar create = function create(options) {\n  return new Jss(options);\n};\n/**\n * A global Jss instance.\n */\n\nvar index = create();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss/dist/jss.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n\n\n\n\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {};\n\nfunction getUniqueId() {\n  var key = '__global_unique_id__';\n  return commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1;\n}\n\nfunction objectIs(x, y) {\n  if (x === y) {\n    return x !== 0 || 1 / x === 1 / y;\n  } else {\n    return x !== x && y !== y;\n  }\n}\n\nfunction createEventEmitter(value) {\n  var handlers = [];\n  return {\n    on: function on(handler) {\n      handlers.push(handler);\n    },\n    off: function off(handler) {\n      handlers = handlers.filter(function (h) {\n        return h !== handler;\n      });\n    },\n    get: function get() {\n      return value;\n    },\n    set: function set(newValue, changedBits) {\n      value = newValue;\n      handlers.forEach(function (handler) {\n        return handler(value, changedBits);\n      });\n    }\n  };\n}\n\nfunction onlyChild(children) {\n  return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n  var _Provider$childContex, _Consumer$contextType;\n\n  var contextProp = '__create-react-context-' + getUniqueId() + '__';\n\n  var Provider = /*#__PURE__*/function (_Component) {\n    Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Provider, _Component);\n\n    function Provider() {\n      var _this;\n\n      _this = _Component.apply(this, arguments) || this;\n      _this.emitter = createEventEmitter(_this.props.value);\n      return _this;\n    }\n\n    var _proto = Provider.prototype;\n\n    _proto.getChildContext = function getChildContext() {\n      var _ref;\n\n      return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n    };\n\n    _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      if (this.props.value !== nextProps.value) {\n        var oldValue = this.props.value;\n        var newValue = nextProps.value;\n        var changedBits;\n\n        if (objectIs(oldValue, newValue)) {\n          changedBits = 0;\n        } else {\n          changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n          if (true) {\n            Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: ' + changedBits);\n          }\n\n          changedBits |= 0;\n\n          if (changedBits !== 0) {\n            this.emitter.set(nextProps.value, changedBits);\n          }\n        }\n      }\n    };\n\n    _proto.render = function render() {\n      return this.props.children;\n    };\n\n    return Provider;\n  }(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n  Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object.isRequired, _Provider$childContex);\n\n  var Consumer = /*#__PURE__*/function (_Component2) {\n    Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Consumer, _Component2);\n\n    function Consumer() {\n      var _this2;\n\n      _this2 = _Component2.apply(this, arguments) || this;\n      _this2.state = {\n        value: _this2.getValue()\n      };\n\n      _this2.onUpdate = function (newValue, changedBits) {\n        var observedBits = _this2.observedBits | 0;\n\n        if ((observedBits & changedBits) !== 0) {\n          _this2.setState({\n            value: _this2.getValue()\n          });\n        }\n      };\n\n      return _this2;\n    }\n\n    var _proto2 = Consumer.prototype;\n\n    _proto2.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      var observedBits = nextProps.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentDidMount = function componentDidMount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].on(this.onUpdate);\n      }\n\n      var observedBits = this.props.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentWillUnmount = function componentWillUnmount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].off(this.onUpdate);\n      }\n    };\n\n    _proto2.getValue = function getValue() {\n      if (this.context[contextProp]) {\n        return this.context[contextProp].get();\n      } else {\n        return defaultValue;\n      }\n    };\n\n    _proto2.render = function render() {\n      return onlyChild(this.props.children)(this.state.value);\n    };\n\n    return Consumer;\n  }(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n  Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object, _Consumer$contextType);\n  return {\n    Provider: Provider,\n    Consumer: Consumer\n  };\n}\n\nvar index = react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext || createReactContext;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/ms/index.js":
-/*!**********************************************!*\
-  !*** ./jaas-client/node_modules/ms/index.js ***!
-  \**********************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/ms/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/object-assign/index.js":
-/*!*********************************************************!*\
-  !*** ./jaas-client/node_modules/object-assign/index.js ***!
-  \*********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/object-assign/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/parseqs/index.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/node_modules/parseqs/index.js ***!
-  \***************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\r\n * Compiles a querystring\r\n * Returns string representation of the object\r\n *\r\n * @param {Object}\r\n * @api private\r\n */\r\n\r\nexports.encode = function (obj) {\r\n  var str = '';\r\n\r\n  for (var i in obj) {\r\n    if (obj.hasOwnProperty(i)) {\r\n      if (str.length) str += '&';\r\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\r\n    }\r\n  }\r\n\r\n  return str;\r\n};\r\n\r\n/**\r\n * Parses a simple querystring into an object\r\n *\r\n * @param {String} qs\r\n * @api private\r\n */\r\n\r\nexports.decode = function(qs){\r\n  var qry = {};\r\n  var pairs = qs.split('&');\r\n  for (var i = 0, l = pairs.length; i < l; i++) {\r\n    var pair = pairs[i].split('=');\r\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n  }\r\n  return qry;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/parseqs/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/parseuri/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/parseuri/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\r\n * Parses an URI\r\n *\r\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\r\n * @api private\r\n */\r\n\r\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\r\n\r\nvar parts = [\r\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\r\n];\r\n\r\nmodule.exports = function parseuri(str) {\r\n    var src = str,\r\n        b = str.indexOf('['),\r\n        e = str.indexOf(']');\r\n\r\n    if (b != -1 && e != -1) {\r\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\r\n    }\r\n\r\n    var m = re.exec(str || ''),\r\n        uri = {},\r\n        i = 14;\r\n\r\n    while (i--) {\r\n        uri[parts[i]] = m[i] || '';\r\n    }\r\n\r\n    if (b != -1 && e != -1) {\r\n        uri.source = src;\r\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\r\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\r\n        uri.ipv6uri = true;\r\n    }\r\n\r\n    return uri;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/parseuri/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/path-to-regexp/index.js":
-/*!**********************************************************!*\
-  !*** ./jaas-client/node_modules/path-to-regexp/index.js ***!
-  \**********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("var isarray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/isarray/index.js\")\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = []\n  var key = 0\n  var index = 0\n  var path = ''\n  var defaultDelimiter = options && options.delimiter || '/'\n  var res\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0]\n    var escaped = res[1]\n    var offset = res.index\n    path += str.slice(index, offset)\n    index = offset + m.length\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1]\n      continue\n    }\n\n    var next = str[index]\n    var prefix = res[2]\n    var name = res[3]\n    var capture = res[4]\n    var group = res[5]\n    var modifier = res[6]\n    var asterisk = res[7]\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path)\n      path = ''\n    }\n\n    var partial = prefix != null && next != null && next !== prefix\n    var repeat = modifier === '+' || modifier === '*'\n    var optional = modifier === '?' || modifier === '*'\n    var delimiter = res[2] || defaultDelimiter\n    var pattern = capture || group\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n    })\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index)\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path)\n  }\n\n  return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length)\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))\n    }\n  }\n\n  return function (obj, opts) {\n    var path = ''\n    var data = obj || {}\n    var options = opts || {}\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i]\n\n      if (typeof token === 'string') {\n        path += token\n\n        continue\n      }\n\n      var value = data[token.name]\n      var segment\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j])\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g)\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      })\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = []\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source)\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  var strict = options.strict\n  var end = options.end !== false\n  var route = ''\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i]\n\n    if (typeof token === 'string') {\n      route += escapeString(token)\n    } else {\n      var prefix = escapeString(token.prefix)\n      var capture = '(?:' + token.pattern + ')'\n\n      keys.push(token)\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*'\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?'\n        } else {\n          capture = prefix + '(' + capture + ')?'\n        }\n      } else {\n        capture = prefix + '(' + capture + ')'\n      }\n\n      route += capture\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/')\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n  }\n\n  if (end) {\n    route += '$'\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/path-to-regexp/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/checkPropTypes.js":
-/*!***************************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/checkPropTypes.js ***!
-  \***************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar printWarning = function() {};\n\nif (true) {\n  var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ \"./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js\");\n  var loggedTypeFailures = {};\n  var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n  printWarning = function(text) {\n    var message = 'Warning: ' + text;\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n  if (true) {\n    for (var typeSpecName in typeSpecs) {\n      if (has(typeSpecs, typeSpecName)) {\n        var error;\n        // Prop type validation may throw. In case they do, we don't want to\n        // fail the render phase where it didn't fail before. So we log it.\n        // After these have been cleaned up, we'll let them throw.\n        try {\n          // This is intentionally an invariant that gets caught. It's the same\n          // behavior as without this statement except with a better message.\n          if (typeof typeSpecs[typeSpecName] !== 'function') {\n            var err = Error(\n              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n            );\n            err.name = 'Invariant Violation';\n            throw err;\n          }\n          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n        } catch (ex) {\n          error = ex;\n        }\n        if (error && !(error instanceof Error)) {\n          printWarning(\n            (componentName || 'React class') + ': type specification of ' +\n            location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n            'You may have forgotten to pass an argument to the type checker ' +\n            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n            'shape all require an argument).'\n          );\n        }\n        if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n          // Only monitor this failure once because there tends to be a lot of the\n          // same error.\n          loggedTypeFailures[error.message] = true;\n\n          var stack = getStack ? getStack() : '';\n\n          printWarning(\n            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n          );\n        }\n      }\n    }\n  }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n  if (true) {\n    loggedTypeFailures = {};\n  }\n}\n\nmodule.exports = checkPropTypes;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/checkPropTypes.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js ***!
-  \************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\nvar assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\n\nvar ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ \"./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js\");\nvar checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\n\nvar has = Function.call.bind(Object.prototype.hasOwnProperty);\nvar printWarning = function() {};\n\nif (true) {\n  printWarning = function(text) {\n    var message = 'Warning: ' + text;\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n  return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n  /* global Symbol */\n  var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n  var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n  /**\n   * Returns the iterator method function contained on the iterable object.\n   *\n   * Be sure to invoke the function with the iterable as context:\n   *\n   *     var iteratorFn = getIteratorFn(myIterable);\n   *     if (iteratorFn) {\n   *       var iterator = iteratorFn.call(myIterable);\n   *       ...\n   *     }\n   *\n   * @param {?object} maybeIterable\n   * @return {?function}\n   */\n  function getIteratorFn(maybeIterable) {\n    var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n    if (typeof iteratorFn === 'function') {\n      return iteratorFn;\n    }\n  }\n\n  /**\n   * Collection of methods that allow declaration and validation of props that are\n   * supplied to React components. Example usage:\n   *\n   *   var Props = require('ReactPropTypes');\n   *   var MyArticle = React.createClass({\n   *     propTypes: {\n   *       // An optional string prop named \"description\".\n   *       description: Props.string,\n   *\n   *       // A required enum prop named \"category\".\n   *       category: Props.oneOf(['News','Photos']).isRequired,\n   *\n   *       // A prop named \"dialog\" that requires an instance of Dialog.\n   *       dialog: Props.instanceOf(Dialog).isRequired\n   *     },\n   *     render: function() { ... }\n   *   });\n   *\n   * A more formal specification of how these methods are used:\n   *\n   *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n   *   decl := ReactPropTypes.{type}(.isRequired)?\n   *\n   * Each and every declaration produces a function with the same signature. This\n   * allows the creation of custom validation functions. For example:\n   *\n   *  var MyLink = React.createClass({\n   *    propTypes: {\n   *      // An optional string or URI prop named \"href\".\n   *      href: function(props, propName, componentName) {\n   *        var propValue = props[propName];\n   *        if (propValue != null && typeof propValue !== 'string' &&\n   *            !(propValue instanceof URI)) {\n   *          return new Error(\n   *            'Expected a string or an URI for ' + propName + ' in ' +\n   *            componentName\n   *          );\n   *        }\n   *      }\n   *    },\n   *    render: function() {...}\n   *  });\n   *\n   * @internal\n   */\n\n  var ANONYMOUS = '<<anonymous>>';\n\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n  var ReactPropTypes = {\n    array: createPrimitiveTypeChecker('array'),\n    bool: createPrimitiveTypeChecker('boolean'),\n    func: createPrimitiveTypeChecker('function'),\n    number: createPrimitiveTypeChecker('number'),\n    object: createPrimitiveTypeChecker('object'),\n    string: createPrimitiveTypeChecker('string'),\n    symbol: createPrimitiveTypeChecker('symbol'),\n\n    any: createAnyTypeChecker(),\n    arrayOf: createArrayOfTypeChecker,\n    element: createElementTypeChecker(),\n    elementType: createElementTypeTypeChecker(),\n    instanceOf: createInstanceTypeChecker,\n    node: createNodeChecker(),\n    objectOf: createObjectOfTypeChecker,\n    oneOf: createEnumTypeChecker,\n    oneOfType: createUnionTypeChecker,\n    shape: createShapeTypeChecker,\n    exact: createStrictShapeTypeChecker,\n  };\n\n  /**\n   * inlined Object.is polyfill to avoid requiring consumers ship their own\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n   */\n  /*eslint-disable no-self-compare*/\n  function is(x, y) {\n    // SameValue algorithm\n    if (x === y) {\n      // Steps 1-5, 7-10\n      // Steps 6.b-6.e: +0 != -0\n      return x !== 0 || 1 / x === 1 / y;\n    } else {\n      // Step 6.a: NaN == NaN\n      return x !== x && y !== y;\n    }\n  }\n  /*eslint-enable no-self-compare*/\n\n  /**\n   * We use an Error-like object for backward compatibility as people may call\n   * PropTypes directly and inspect their output. However, we don't use real\n   * Errors anymore. We don't inspect their stack anyway, and creating them\n   * is prohibitively expensive if they are created too often, such as what\n   * happens in oneOfType() for any type before the one that matched.\n   */\n  function PropTypeError(message) {\n    this.message = message;\n    this.stack = '';\n  }\n  // Make `instanceof Error` still work for returned errors.\n  PropTypeError.prototype = Error.prototype;\n\n  function createChainableTypeChecker(validate) {\n    if (true) {\n      var manualPropTypeCallCache = {};\n      var manualPropTypeWarningCount = 0;\n    }\n    function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n      componentName = componentName || ANONYMOUS;\n      propFullName = propFullName || propName;\n\n      if (secret !== ReactPropTypesSecret) {\n        if (throwOnDirectAccess) {\n          // New behavior only for users of `prop-types` package\n          var err = new Error(\n            'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n            'Use `PropTypes.checkPropTypes()` to call them. ' +\n            'Read more at http://fb.me/use-check-prop-types'\n          );\n          err.name = 'Invariant Violation';\n          throw err;\n        } else if ( true && typeof console !== 'undefined') {\n          // Old behavior for people using React.PropTypes\n          var cacheKey = componentName + ':' + propName;\n          if (\n            !manualPropTypeCallCache[cacheKey] &&\n            // Avoid spamming the console because they are often not actionable except for lib authors\n            manualPropTypeWarningCount < 3\n          ) {\n            printWarning(\n              'You are manually calling a React.PropTypes validation ' +\n              'function for the `' + propFullName + '` prop on `' + componentName  + '`. This is deprecated ' +\n              'and will throw in the standalone `prop-types` package. ' +\n              'You may be seeing this warning due to a third-party PropTypes ' +\n              'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n            );\n            manualPropTypeCallCache[cacheKey] = true;\n            manualPropTypeWarningCount++;\n          }\n        }\n      }\n      if (props[propName] == null) {\n        if (isRequired) {\n          if (props[propName] === null) {\n            return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n          }\n          return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n        }\n        return null;\n      } else {\n        return validate(props, propName, componentName, location, propFullName);\n      }\n    }\n\n    var chainedCheckType = checkType.bind(null, false);\n    chainedCheckType.isRequired = checkType.bind(null, true);\n\n    return chainedCheckType;\n  }\n\n  function createPrimitiveTypeChecker(expectedType) {\n    function validate(props, propName, componentName, location, propFullName, secret) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== expectedType) {\n        // `propValue` being instance of, say, date/regexp, pass the 'object'\n        // check, but we can offer a more precise error message here rather than\n        // 'of type `object`'.\n        var preciseType = getPreciseType(propValue);\n\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createAnyTypeChecker() {\n    return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n  }\n\n  function createArrayOfTypeChecker(typeChecker) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (typeof typeChecker !== 'function') {\n        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n      }\n      var propValue = props[propName];\n      if (!Array.isArray(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n      }\n      for (var i = 0; i < propValue.length; i++) {\n        var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n        if (error instanceof Error) {\n          return error;\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createElementTypeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      if (!isValidElement(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createElementTypeTypeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      if (!ReactIs.isValidElementType(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createInstanceTypeChecker(expectedClass) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (!(props[propName] instanceof expectedClass)) {\n        var expectedClassName = expectedClass.name || ANONYMOUS;\n        var actualClassName = getClassName(props[propName]);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createEnumTypeChecker(expectedValues) {\n    if (!Array.isArray(expectedValues)) {\n      if (true) {\n        if (arguments.length > 1) {\n          printWarning(\n            'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n            'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n          );\n        } else {\n          printWarning('Invalid argument supplied to oneOf, expected an array.');\n        }\n      }\n      return emptyFunctionThatReturnsNull;\n    }\n\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      for (var i = 0; i < expectedValues.length; i++) {\n        if (is(propValue, expectedValues[i])) {\n          return null;\n        }\n      }\n\n      var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n        var type = getPreciseType(value);\n        if (type === 'symbol') {\n          return String(value);\n        }\n        return value;\n      });\n      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createObjectOfTypeChecker(typeChecker) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (typeof typeChecker !== 'function') {\n        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n      }\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n      }\n      for (var key in propValue) {\n        if (has(propValue, key)) {\n          var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n          if (error instanceof Error) {\n            return error;\n          }\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createUnionTypeChecker(arrayOfTypeCheckers) {\n    if (!Array.isArray(arrayOfTypeCheckers)) {\n       true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : undefined;\n      return emptyFunctionThatReturnsNull;\n    }\n\n    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n      var checker = arrayOfTypeCheckers[i];\n      if (typeof checker !== 'function') {\n        printWarning(\n          'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n          'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n        );\n        return emptyFunctionThatReturnsNull;\n      }\n    }\n\n    function validate(props, propName, componentName, location, propFullName) {\n      for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n        var checker = arrayOfTypeCheckers[i];\n        if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {\n          return null;\n        }\n      }\n\n      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createNodeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (!isNode(props[propName])) {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createShapeTypeChecker(shapeTypes) {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n      }\n      for (var key in shapeTypes) {\n        var checker = shapeTypes[key];\n        if (!checker) {\n          continue;\n        }\n        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error) {\n          return error;\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createStrictShapeTypeChecker(shapeTypes) {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n      }\n      // We need to check all keys in case some are required but missing from\n      // props.\n      var allKeys = assign({}, props[propName], shapeTypes);\n      for (var key in allKeys) {\n        var checker = shapeTypes[key];\n        if (!checker) {\n          return new PropTypeError(\n            'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n            '\\nBad object: ' + JSON.stringify(props[propName], null, '  ') +\n            '\\nValid keys: ' +  JSON.stringify(Object.keys(shapeTypes), null, '  ')\n          );\n        }\n        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error) {\n          return error;\n        }\n      }\n      return null;\n    }\n\n    return createChainableTypeChecker(validate);\n  }\n\n  function isNode(propValue) {\n    switch (typeof propValue) {\n      case 'number':\n      case 'string':\n      case 'undefined':\n        return true;\n      case 'boolean':\n        return !propValue;\n      case 'object':\n        if (Array.isArray(propValue)) {\n          return propValue.every(isNode);\n        }\n        if (propValue === null || isValidElement(propValue)) {\n          return true;\n        }\n\n        var iteratorFn = getIteratorFn(propValue);\n        if (iteratorFn) {\n          var iterator = iteratorFn.call(propValue);\n          var step;\n          if (iteratorFn !== propValue.entries) {\n            while (!(step = iterator.next()).done) {\n              if (!isNode(step.value)) {\n                return false;\n              }\n            }\n          } else {\n            // Iterator will provide entry [k,v] tuples rather than values.\n            while (!(step = iterator.next()).done) {\n              var entry = step.value;\n              if (entry) {\n                if (!isNode(entry[1])) {\n                  return false;\n                }\n              }\n            }\n          }\n        } else {\n          return false;\n        }\n\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  function isSymbol(propType, propValue) {\n    // Native Symbol.\n    if (propType === 'symbol') {\n      return true;\n    }\n\n    // falsy value can't be a Symbol\n    if (!propValue) {\n      return false;\n    }\n\n    // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n    if (propValue['@@toStringTag'] === 'Symbol') {\n      return true;\n    }\n\n    // Fallback for non-spec compliant Symbols which are polyfilled.\n    if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n      return true;\n    }\n\n    return false;\n  }\n\n  // Equivalent of `typeof` but with special handling for array and regexp.\n  function getPropType(propValue) {\n    var propType = typeof propValue;\n    if (Array.isArray(propValue)) {\n      return 'array';\n    }\n    if (propValue instanceof RegExp) {\n      // Old webkits (at least until Android 4.0) return 'function' rather than\n      // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n      // passes PropTypes.object.\n      return 'object';\n    }\n    if (isSymbol(propType, propValue)) {\n      return 'symbol';\n    }\n    return propType;\n  }\n\n  // This handles more types than `getPropType`. Only used for error messages.\n  // See `createPrimitiveTypeChecker`.\n  function getPreciseType(propValue) {\n    if (typeof propValue === 'undefined' || propValue === null) {\n      return '' + propValue;\n    }\n    var propType = getPropType(propValue);\n    if (propType === 'object') {\n      if (propValue instanceof Date) {\n        return 'date';\n      } else if (propValue instanceof RegExp) {\n        return 'regexp';\n      }\n    }\n    return propType;\n  }\n\n  // Returns a string that is postfixed to a warning about an invalid type.\n  // For example, \"undefined\" or \"of type array\"\n  function getPostfixForTypeWarning(value) {\n    var type = getPreciseType(value);\n    switch (type) {\n      case 'array':\n      case 'object':\n        return 'an ' + type;\n      case 'boolean':\n      case 'date':\n      case 'regexp':\n        return 'a ' + type;\n      default:\n        return type;\n    }\n  }\n\n  // Returns class name of the object, if any.\n  function getClassName(propValue) {\n    if (!propValue.constructor || !propValue.constructor.name) {\n      return ANONYMOUS;\n    }\n    return propValue.constructor.name;\n  }\n\n  ReactPropTypes.checkPropTypes = checkPropTypes;\n  ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/index.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/index.js ***!
-  \******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (true) {\n  var ReactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = __webpack_require__(/*! ./factoryWithTypeCheckers */ \"./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js\")(ReactIs.isElement, throwOnDirectAccess);\n} else {}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-dom/cjs/react-dom.development.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-dom/cjs/react-dom.development.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v16.13.1\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar React = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\nvar _assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\nvar Scheduler = __webpack_require__(/*! scheduler */ \"./jaas-client/node_modules/scheduler/index.js\");\nvar checkPropTypes = __webpack_require__(/*! prop-types/checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\nvar tracing = __webpack_require__(/*! scheduler/tracing */ \"./jaas-client/node_modules/scheduler/tracing.js\");\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.\n// Current owner and dispatcher used to share the same ref,\n// but PR #14548 split them out to better support the react-debug-tools package.\n\nif (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {\n  ReactSharedInternals.ReactCurrentDispatcher = {\n    current: null\n  };\n}\n\nif (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {\n  ReactSharedInternals.ReactCurrentBatchConfig = {\n    suspense: null\n  };\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n  {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    printWarning('warn', format, args);\n  }\n}\nfunction error(format) {\n  {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    printWarning('error', format, args);\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n    if (!hasExistingStack) {\n      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n      var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n      if (stack !== '') {\n        format += '%s';\n        args = args.concat([stack]);\n      }\n    }\n\n    var argsWithFormat = args.map(function (item) {\n      return '' + item;\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      throw new Error(message);\n    } catch (x) {}\n  }\n}\n\nif (!React) {\n  {\n    throw Error( \"ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.\" );\n  }\n}\n\nvar invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {\n  var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n  try {\n    func.apply(context, funcArgs);\n  } catch (error) {\n    this.onError(error);\n  }\n};\n\n{\n  // In DEV mode, we swap out invokeGuardedCallback for a special version\n  // that plays more nicely with the browser's DevTools. The idea is to preserve\n  // \"Pause on exceptions\" behavior. Because React wraps all user-provided\n  // functions in invokeGuardedCallback, and the production version of\n  // invokeGuardedCallback uses a try-catch, all user exceptions are treated\n  // like caught exceptions, and the DevTools won't pause unless the developer\n  // takes the extra step of enabling pause on caught exceptions. This is\n  // unintuitive, though, because even though React has caught the error, from\n  // the developer's perspective, the error is uncaught.\n  //\n  // To preserve the expected \"Pause on exceptions\" behavior, we don't use a\n  // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake\n  // DOM node, and call the user-provided callback from inside an event handler\n  // for that fake event. If the callback throws, the error is \"captured\" using\n  // a global event handler. But because the error happens in a different\n  // event loop context, it does not interrupt the normal program flow.\n  // Effectively, this gives us try-catch behavior without actually using\n  // try-catch. Neat!\n  // Check that the browser supports the APIs we need to implement our special\n  // DEV version of invokeGuardedCallback\n  if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n    var fakeNode = document.createElement('react');\n\n    var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {\n      // If document doesn't exist we know for sure we will crash in this method\n      // when we call document.createEvent(). However this can cause confusing\n      // errors: https://github.com/facebookincubator/create-react-app/issues/3482\n      // So we preemptively throw with a better message instead.\n      if (!(typeof document !== 'undefined')) {\n        {\n          throw Error( \"The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.\" );\n        }\n      }\n\n      var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We\n      // set this to true at the beginning, then set it to false right after\n      // calling the function. If the function errors, `didError` will never be\n      // set to false. This strategy works even if the browser is flaky and\n      // fails to call our global error handler, because it doesn't rely on\n      // the error event at all.\n\n      var didError = true; // Keeps track of the value of window.event so that we can reset it\n      // during the callback to let user code access window.event in the\n      // browsers that support it.\n\n      var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event\n      // dispatching: https://github.com/facebook/react/issues/13688\n\n      var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously\n      // dispatch our fake event using `dispatchEvent`. Inside the handler, we\n      // call the user-provided callback.\n\n      var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n      function callCallback() {\n        // We immediately remove the callback from event listeners so that\n        // nested `invokeGuardedCallback` calls do not clash. Otherwise, a\n        // nested call would trigger the fake event handlers of any call higher\n        // in the stack.\n        fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the\n        // window.event assignment in both IE <= 10 as they throw an error\n        // \"Member not found\" in strict mode, and in Firefox which does not\n        // support window.event.\n\n        if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {\n          window.event = windowEvent;\n        }\n\n        func.apply(context, funcArgs);\n        didError = false;\n      } // Create a global error event handler. We use this to capture the value\n      // that was thrown. It's possible that this error handler will fire more\n      // than once; for example, if non-React code also calls `dispatchEvent`\n      // and a handler for that event throws. We should be resilient to most of\n      // those cases. Even if our error event handler fires more than once, the\n      // last error event is always used. If the callback actually does error,\n      // we know that the last error event is the correct one, because it's not\n      // possible for anything else to have happened in between our callback\n      // erroring and the code that follows the `dispatchEvent` call below. If\n      // the callback doesn't error, but the error event was fired, we know to\n      // ignore it because `didError` will be false, as described above.\n\n\n      var error; // Use this to track whether the error event is ever called.\n\n      var didSetError = false;\n      var isCrossOriginError = false;\n\n      function handleWindowError(event) {\n        error = event.error;\n        didSetError = true;\n\n        if (error === null && event.colno === 0 && event.lineno === 0) {\n          isCrossOriginError = true;\n        }\n\n        if (event.defaultPrevented) {\n          // Some other error handler has prevented default.\n          // Browsers silence the error report if this happens.\n          // We'll remember this to later decide whether to log it or not.\n          if (error != null && typeof error === 'object') {\n            try {\n              error._suppressLogging = true;\n            } catch (inner) {// Ignore.\n            }\n          }\n        }\n      } // Create a fake event type.\n\n\n      var evtType = \"react-\" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers\n\n      window.addEventListener('error', handleWindowError);\n      fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function\n      // errors, it will trigger our global error handler.\n\n      evt.initEvent(evtType, false, false);\n      fakeNode.dispatchEvent(evt);\n\n      if (windowEventDescriptor) {\n        Object.defineProperty(window, 'event', windowEventDescriptor);\n      }\n\n      if (didError) {\n        if (!didSetError) {\n          // The callback errored, but the error event never fired.\n          error = new Error('An error was thrown inside one of your components, but React ' + \"doesn't know what it was. This is likely due to browser \" + 'flakiness. React does its best to preserve the \"Pause on ' + 'exceptions\" behavior of the DevTools, which requires some ' + \"DEV-mode only tricks. It's possible that these don't work in \" + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');\n        } else if (isCrossOriginError) {\n          error = new Error(\"A cross-origin error was thrown. React doesn't have access to \" + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');\n        }\n\n        this.onError(error);\n      } // Remove our event listeners\n\n\n      window.removeEventListener('error', handleWindowError);\n    };\n\n    invokeGuardedCallbackImpl = invokeGuardedCallbackDev;\n  }\n}\n\nvar invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;\n\nvar hasError = false;\nvar caughtError = null; // Used by event system to capture/rethrow the first error.\n\nvar hasRethrowError = false;\nvar rethrowError = null;\nvar reporter = {\n  onError: function (error) {\n    hasError = true;\n    caughtError = error;\n  }\n};\n/**\n * Call a function while guarding against errors that happens within it.\n * Returns an error if it throws, otherwise null.\n *\n * In production, this is implemented using a try-catch. The reason we don't\n * use a try-catch directly is so that we can swap out a different\n * implementation in DEV mode.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n\nfunction invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {\n  hasError = false;\n  caughtError = null;\n  invokeGuardedCallbackImpl$1.apply(reporter, arguments);\n}\n/**\n * Same as invokeGuardedCallback, but instead of returning an error, it stores\n * it in a global so it can be rethrown by `rethrowCaughtError` later.\n * TODO: See if caughtError and rethrowError can be unified.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n\nfunction invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {\n  invokeGuardedCallback.apply(this, arguments);\n\n  if (hasError) {\n    var error = clearCaughtError();\n\n    if (!hasRethrowError) {\n      hasRethrowError = true;\n      rethrowError = error;\n    }\n  }\n}\n/**\n * During execution of guarded functions we will capture the first error which\n * we will rethrow to be handled by the top level error handler.\n */\n\nfunction rethrowCaughtError() {\n  if (hasRethrowError) {\n    var error = rethrowError;\n    hasRethrowError = false;\n    rethrowError = null;\n    throw error;\n  }\n}\nfunction hasCaughtError() {\n  return hasError;\n}\nfunction clearCaughtError() {\n  if (hasError) {\n    var error = caughtError;\n    hasError = false;\n    caughtError = null;\n    return error;\n  } else {\n    {\n      {\n        throw Error( \"clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n}\n\nvar getFiberCurrentPropsFromNode = null;\nvar getInstanceFromNode = null;\nvar getNodeFromInstance = null;\nfunction setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {\n  getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;\n  getInstanceFromNode = getInstanceFromNodeImpl;\n  getNodeFromInstance = getNodeFromInstanceImpl;\n\n  {\n    if (!getNodeFromInstance || !getInstanceFromNode) {\n      error('EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.');\n    }\n  }\n}\nvar validateEventDispatches;\n\n{\n  validateEventDispatches = function (event) {\n    var dispatchListeners = event._dispatchListeners;\n    var dispatchInstances = event._dispatchInstances;\n    var listenersIsArr = Array.isArray(dispatchListeners);\n    var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n    var instancesIsArr = Array.isArray(dispatchInstances);\n    var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n\n    if (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) {\n      error('EventPluginUtils: Invalid `event`.');\n    }\n  };\n}\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {function} listener Application-level callback\n * @param {*} inst Internal component instance\n */\n\n\nfunction executeDispatch(event, listener, inst) {\n  var type = event.type || 'unknown-event';\n  event.currentTarget = getNodeFromInstance(inst);\n  invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);\n  event.currentTarget = null;\n}\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\n\nfunction executeDispatchesInOrder(event) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchInstances = event._dispatchInstances;\n\n  {\n    validateEventDispatches(event);\n  }\n\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      } // Listeners and Instances are two parallel arrays that are always in sync.\n\n\n      executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);\n    }\n  } else if (dispatchListeners) {\n    executeDispatch(event, dispatchListeners, dispatchInstances);\n  }\n\n  event._dispatchListeners = null;\n  event._dispatchInstances = null;\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar FundamentalComponent = 20;\nvar ScopeComponent = 21;\nvar Block = 22;\n\n/**\n * Injectable ordering of event plugins.\n */\nvar eventPluginOrder = null;\n/**\n * Injectable mapping from names to event plugin modules.\n */\n\nvar namesToPlugins = {};\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\n\nfunction recomputePluginOrdering() {\n  if (!eventPluginOrder) {\n    // Wait until an `eventPluginOrder` is injected.\n    return;\n  }\n\n  for (var pluginName in namesToPlugins) {\n    var pluginModule = namesToPlugins[pluginName];\n    var pluginIndex = eventPluginOrder.indexOf(pluginName);\n\n    if (!(pluginIndex > -1)) {\n      {\n        throw Error( \"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `\" + pluginName + \"`.\" );\n      }\n    }\n\n    if (plugins[pluginIndex]) {\n      continue;\n    }\n\n    if (!pluginModule.extractEvents) {\n      {\n        throw Error( \"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `\" + pluginName + \"` does not.\" );\n      }\n    }\n\n    plugins[pluginIndex] = pluginModule;\n    var publishedEvents = pluginModule.eventTypes;\n\n    for (var eventName in publishedEvents) {\n      if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) {\n        {\n          throw Error( \"EventPluginRegistry: Failed to publish event `\" + eventName + \"` for plugin `\" + pluginName + \"`.\" );\n        }\n      }\n    }\n  }\n}\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\n\n\nfunction publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n  if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n    {\n      throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same event name, `\" + eventName + \"`.\" );\n    }\n  }\n\n  eventNameDispatchConfigs[eventName] = dispatchConfig;\n  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n\n  if (phasedRegistrationNames) {\n    for (var phaseName in phasedRegistrationNames) {\n      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n        var phasedRegistrationName = phasedRegistrationNames[phaseName];\n        publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n      }\n    }\n\n    return true;\n  } else if (dispatchConfig.registrationName) {\n    publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);\n    return true;\n  }\n\n  return false;\n}\n/**\n * Publishes a registration name that is used to identify dispatched events.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\n\n\nfunction publishRegistrationName(registrationName, pluginModule, eventName) {\n  if (!!registrationNameModules[registrationName]) {\n    {\n      throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same registration name, `\" + registrationName + \"`.\" );\n    }\n  }\n\n  registrationNameModules[registrationName] = pluginModule;\n  registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n\n  {\n    var lowerCasedName = registrationName.toLowerCase();\n    possibleRegistrationNames[lowerCasedName] = registrationName;\n\n    if (registrationName === 'onDoubleClick') {\n      possibleRegistrationNames.ondblclick = registrationName;\n    }\n  }\n}\n/**\n * Registers plugins so that they can extract and dispatch events.\n */\n\n/**\n * Ordered list of injected plugins.\n */\n\n\nvar plugins = [];\n/**\n * Mapping from event name to dispatch config\n */\n\nvar eventNameDispatchConfigs = {};\n/**\n * Mapping from registration name to plugin module\n */\n\nvar registrationNameModules = {};\n/**\n * Mapping from registration name to event name\n */\n\nvar registrationNameDependencies = {};\n/**\n * Mapping from lowercase registration names to the properly cased version,\n * used to warn in the case of missing event handlers. Available\n * only in true.\n * @type {Object}\n */\n\nvar possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true\n\n/**\n * Injects an ordering of plugins (by plugin name). This allows the ordering\n * to be decoupled from injection of the actual plugins so that ordering is\n * always deterministic regardless of packaging, on-the-fly injection, etc.\n *\n * @param {array} InjectedEventPluginOrder\n * @internal\n */\n\nfunction injectEventPluginOrder(injectedEventPluginOrder) {\n  if (!!eventPluginOrder) {\n    {\n      throw Error( \"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\" );\n    }\n  } // Clone the ordering so it cannot be dynamically mutated.\n\n\n  eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);\n  recomputePluginOrdering();\n}\n/**\n * Injects plugins to be used by plugin event system. The plugin names must be\n * in the ordering injected by `injectEventPluginOrder`.\n *\n * Plugins can be injected as part of page initialization or on-the-fly.\n *\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n * @internal\n */\n\nfunction injectEventPluginsByName(injectedNamesToPlugins) {\n  var isOrderingDirty = false;\n\n  for (var pluginName in injectedNamesToPlugins) {\n    if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n      continue;\n    }\n\n    var pluginModule = injectedNamesToPlugins[pluginName];\n\n    if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {\n      if (!!namesToPlugins[pluginName]) {\n        {\n          throw Error( \"EventPluginRegistry: Cannot inject two different event plugins using the same name, `\" + pluginName + \"`.\" );\n        }\n      }\n\n      namesToPlugins[pluginName] = pluginModule;\n      isOrderingDirty = true;\n    }\n  }\n\n  if (isOrderingDirty) {\n    recomputePluginOrdering();\n  }\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\nvar PLUGIN_EVENT_SYSTEM = 1;\nvar IS_REPLAYED = 1 << 5;\nvar IS_FIRST_ANCESTOR = 1 << 6;\n\nvar restoreImpl = null;\nvar restoreTarget = null;\nvar restoreQueue = null;\n\nfunction restoreStateOfTarget(target) {\n  // We perform this translation at the end of the event loop so that we\n  // always receive the correct fiber here\n  var internalInstance = getInstanceFromNode(target);\n\n  if (!internalInstance) {\n    // Unmounted\n    return;\n  }\n\n  if (!(typeof restoreImpl === 'function')) {\n    {\n      throw Error( \"setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.\n\n  if (stateNode) {\n    var _props = getFiberCurrentPropsFromNode(stateNode);\n\n    restoreImpl(internalInstance.stateNode, internalInstance.type, _props);\n  }\n}\n\nfunction setRestoreImplementation(impl) {\n  restoreImpl = impl;\n}\nfunction enqueueStateRestore(target) {\n  if (restoreTarget) {\n    if (restoreQueue) {\n      restoreQueue.push(target);\n    } else {\n      restoreQueue = [target];\n    }\n  } else {\n    restoreTarget = target;\n  }\n}\nfunction needsStateRestore() {\n  return restoreTarget !== null || restoreQueue !== null;\n}\nfunction restoreStateIfNeeded() {\n  if (!restoreTarget) {\n    return;\n  }\n\n  var target = restoreTarget;\n  var queuedTargets = restoreQueue;\n  restoreTarget = null;\n  restoreQueue = null;\n  restoreStateOfTarget(target);\n\n  if (queuedTargets) {\n    for (var i = 0; i < queuedTargets.length; i++) {\n      restoreStateOfTarget(queuedTargets[i]);\n    }\n  }\n}\n\nvar enableProfilerTimer = true; // Trace which interactions trigger each commit.\n\nvar enableDeprecatedFlareAPI = false; // Experimental Host Component support.\n\nvar enableFundamentalAPI = false; // Experimental Scope support.\nvar warnAboutStringRefs = false;\n\n// the renderer. Such as when we're dispatching events or if third party\n// libraries need to call batchedUpdates. Eventually, this API will go away when\n// everything is batched by default. We'll then have a similar API to opt-out of\n// scheduled work and instead do synchronous work.\n// Defaults\n\nvar batchedUpdatesImpl = function (fn, bookkeeping) {\n  return fn(bookkeeping);\n};\n\nvar discreteUpdatesImpl = function (fn, a, b, c, d) {\n  return fn(a, b, c, d);\n};\n\nvar flushDiscreteUpdatesImpl = function () {};\n\nvar batchedEventUpdatesImpl = batchedUpdatesImpl;\nvar isInsideEventHandler = false;\nvar isBatchingEventUpdates = false;\n\nfunction finishEventHandler() {\n  // Here we wait until all updates have propagated, which is important\n  // when using controlled components within layers:\n  // https://github.com/facebook/react/issues/1698\n  // Then we restore state of any controlled component.\n  var controlledComponentsHavePendingUpdates = needsStateRestore();\n\n  if (controlledComponentsHavePendingUpdates) {\n    // If a controlled event was fired, we may need to restore the state of\n    // the DOM node back to the controlled value. This is necessary when React\n    // bails out of the update without touching the DOM.\n    flushDiscreteUpdatesImpl();\n    restoreStateIfNeeded();\n  }\n}\n\nfunction batchedUpdates(fn, bookkeeping) {\n  if (isInsideEventHandler) {\n    // If we are currently inside another batch, we need to wait until it\n    // fully completes before restoring state.\n    return fn(bookkeeping);\n  }\n\n  isInsideEventHandler = true;\n\n  try {\n    return batchedUpdatesImpl(fn, bookkeeping);\n  } finally {\n    isInsideEventHandler = false;\n    finishEventHandler();\n  }\n}\nfunction batchedEventUpdates(fn, a, b) {\n  if (isBatchingEventUpdates) {\n    // If we are currently inside another batch, we need to wait until it\n    // fully completes before restoring state.\n    return fn(a, b);\n  }\n\n  isBatchingEventUpdates = true;\n\n  try {\n    return batchedEventUpdatesImpl(fn, a, b);\n  } finally {\n    isBatchingEventUpdates = false;\n    finishEventHandler();\n  }\n} // This is for the React Flare event system\nfunction discreteUpdates(fn, a, b, c, d) {\n  var prevIsInsideEventHandler = isInsideEventHandler;\n  isInsideEventHandler = true;\n\n  try {\n    return discreteUpdatesImpl(fn, a, b, c, d);\n  } finally {\n    isInsideEventHandler = prevIsInsideEventHandler;\n\n    if (!isInsideEventHandler) {\n      finishEventHandler();\n    }\n  }\n}\nfunction flushDiscreteUpdatesIfNeeded(timeStamp) {\n  // event.timeStamp isn't overly reliable due to inconsistencies in\n  // how different browsers have historically provided the time stamp.\n  // Some browsers provide high-resolution time stamps for all events,\n  // some provide low-resolution time stamps for all events. FF < 52\n  // even mixes both time stamps together. Some browsers even report\n  // negative time stamps or time stamps that are 0 (iOS9) in some cases.\n  // Given we are only comparing two time stamps with equality (!==),\n  // we are safe from the resolution differences. If the time stamp is 0\n  // we bail-out of preventing the flush, which can affect semantics,\n  // such as if an earlier flush removes or adds event listeners that\n  // are fired in the subsequent flush. However, this is the same\n  // behaviour as we had before this change, so the risks are low.\n  if (!isInsideEventHandler && (!enableDeprecatedFlareAPI  )) {\n    flushDiscreteUpdatesImpl();\n  }\n}\nfunction setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) {\n  batchedUpdatesImpl = _batchedUpdatesImpl;\n  discreteUpdatesImpl = _discreteUpdatesImpl;\n  flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl;\n  batchedEventUpdatesImpl = _batchedEventUpdatesImpl;\n}\n\nvar DiscreteEvent = 0;\nvar UserBlockingEvent = 1;\nvar ContinuousEvent = 2;\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nvar RESERVED = 0; // A simple string attribute.\n// Attributes that aren't in the whitelist are presumed to have this type.\n\nvar STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\n\nvar BOOLEANISH_STRING = 2; // A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n\nvar BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\n\nvar OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\n\nvar NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\n\nvar POSITIVE_NUMERIC = 6;\n\n/* eslint-disable max-len */\nvar ATTRIBUTE_NAME_START_CHAR = \":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n/* eslint-enable max-len */\n\nvar ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\nvar ROOT_ATTRIBUTE_NAME = 'data-reactroot';\nvar VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {\n    return true;\n  }\n\n  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {\n    return false;\n  }\n\n  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n    validatedAttributeNameCache[attributeName] = true;\n    return true;\n  }\n\n  illegalAttributeNameCache[attributeName] = true;\n\n  {\n    error('Invalid attribute name: `%s`', attributeName);\n  }\n\n  return false;\n}\nfunction shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {\n  if (propertyInfo !== null) {\n    return propertyInfo.type === RESERVED;\n  }\n\n  if (isCustomComponentTag) {\n    return false;\n  }\n\n  if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {\n    return true;\n  }\n\n  return false;\n}\nfunction shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {\n  if (propertyInfo !== null && propertyInfo.type === RESERVED) {\n    return false;\n  }\n\n  switch (typeof value) {\n    case 'function': // $FlowIssue symbol is perfectly valid here\n\n    case 'symbol':\n      // eslint-disable-line\n      return true;\n\n    case 'boolean':\n      {\n        if (isCustomComponentTag) {\n          return false;\n        }\n\n        if (propertyInfo !== null) {\n          return !propertyInfo.acceptsBooleans;\n        } else {\n          var prefix = name.toLowerCase().slice(0, 5);\n          return prefix !== 'data-' && prefix !== 'aria-';\n        }\n      }\n\n    default:\n      return false;\n  }\n}\nfunction shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {\n  if (value === null || typeof value === 'undefined') {\n    return true;\n  }\n\n  if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {\n    return true;\n  }\n\n  if (isCustomComponentTag) {\n    return false;\n  }\n\n  if (propertyInfo !== null) {\n    switch (propertyInfo.type) {\n      case BOOLEAN:\n        return !value;\n\n      case OVERLOADED_BOOLEAN:\n        return value === false;\n\n      case NUMERIC:\n        return isNaN(value);\n\n      case POSITIVE_NUMERIC:\n        return isNaN(value) || value < 1;\n    }\n  }\n\n  return false;\n}\nfunction getPropertyInfo(name) {\n  return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {\n  this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;\n  this.attributeName = attributeName;\n  this.attributeNamespace = attributeNamespace;\n  this.mustUseProperty = mustUseProperty;\n  this.propertyName = name;\n  this.type = type;\n  this.sanitizeURL = sanitizeURL;\n} // When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\n\n\nvar properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.\n\nvar reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular\n// elements (not just inputs). Now that ReactDOMInput assigns to the\n// defaultValue property -- do we need this?\n'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];\n\nreservedProps.forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n\n[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {\n  var name = _ref[0],\n      attributeName = _ref[1];\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n\n['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML boolean attributes.\n\n['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM\n// on the client side because the browsers are inconsistent. Instead we call focus().\n'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata\n'itemScope'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n\n['checked', // Note: `option.selected` is not updated if `select.multiple` is\n// disabled with `removeAttribute`. We have special logic for handling this.\n'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n\n['capture', 'download' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that must be positive numbers.\n\n['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that must be numbers.\n\n['rowSpan', 'start'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n});\nvar CAMELIZE = /[\\-\\:]([a-z])/g;\n\nvar capitalize = function (token) {\n  return token[1].toUpperCase();\n}; // This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML whitelist.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n\n\n['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, null, // attributeNamespace\n  false);\n}); // String SVG attributes with the xlink namespace.\n\n['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, 'http://www.w3.org/1999/xlink', false);\n}); // String SVG attributes with the xml namespace.\n\n['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, 'http://www.w3.org/XML/1998/namespace', false);\n}); // These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n\n['tabIndex', 'crossOrigin'].forEach(function (attributeName) {\n  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n  attributeName.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\n\nvar xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty\n'xlink:href', 'http://www.w3.org/1999/xlink', true);\n['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {\n  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n  attributeName.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  true);\n});\n\nvar ReactDebugCurrentFrame = null;\n\n{\n  ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n} // A javascript: URL can contain leading C0 control or \\u0020 SPACE,\n// and any newline or tab are filtered out as if they're not part of the URL.\n// https://url.spec.whatwg.org/#url-parsing\n// Tab or newline are defined as \\r\\n\\t:\n// https://infra.spec.whatwg.org/#ascii-tab-or-newline\n// A C0 control is a code point in the range \\u0000 NULL to \\u001F\n// INFORMATION SEPARATOR ONE, inclusive:\n// https://infra.spec.whatwg.org/#c0-control-or-space\n\n/* eslint-disable max-len */\n\n\nvar isJavaScriptProtocol = /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*\\:/i;\nvar didWarn = false;\n\nfunction sanitizeURL(url) {\n  {\n    if (!didWarn && isJavaScriptProtocol.test(url)) {\n      didWarn = true;\n\n      error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));\n    }\n  }\n}\n\n/**\n * Get the value for a property on a node. Only used in DEV for SSR validation.\n * The \"expected\" argument is used as a hint of what the expected value is.\n * Some properties have multiple equivalent values.\n */\nfunction getValueForProperty(node, name, expected, propertyInfo) {\n  {\n    if (propertyInfo.mustUseProperty) {\n      var propertyName = propertyInfo.propertyName;\n      return node[propertyName];\n    } else {\n      if ( propertyInfo.sanitizeURL) {\n        // If we haven't fully disabled javascript: URLs, and if\n        // the hydration is successful of a javascript: URL, we\n        // still want to warn on the client.\n        sanitizeURL('' + expected);\n      }\n\n      var attributeName = propertyInfo.attributeName;\n      var stringValue = null;\n\n      if (propertyInfo.type === OVERLOADED_BOOLEAN) {\n        if (node.hasAttribute(attributeName)) {\n          var value = node.getAttribute(attributeName);\n\n          if (value === '') {\n            return true;\n          }\n\n          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n            return value;\n          }\n\n          if (value === '' + expected) {\n            return expected;\n          }\n\n          return value;\n        }\n      } else if (node.hasAttribute(attributeName)) {\n        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n          // We had an attribute but shouldn't have had one, so read it\n          // for the error message.\n          return node.getAttribute(attributeName);\n        }\n\n        if (propertyInfo.type === BOOLEAN) {\n          // If this was a boolean, it doesn't matter what the value is\n          // the fact that we have it is the same as the expected.\n          return expected;\n        } // Even if this property uses a namespace we use getAttribute\n        // because we assume its namespaced name is the same as our config.\n        // To use getAttributeNS we need the local name which we don't have\n        // in our config atm.\n\n\n        stringValue = node.getAttribute(attributeName);\n      }\n\n      if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n        return stringValue === null ? expected : stringValue;\n      } else if (stringValue === '' + expected) {\n        return expected;\n      } else {\n        return stringValue;\n      }\n    }\n  }\n}\n/**\n * Get the value for a attribute on a node. Only used in DEV for SSR validation.\n * The third argument is used as a hint of what the expected value is. Some\n * attributes have multiple equivalent values.\n */\n\nfunction getValueForAttribute(node, name, expected) {\n  {\n    if (!isAttributeNameSafe(name)) {\n      return;\n    }\n\n    if (!node.hasAttribute(name)) {\n      return expected === undefined ? undefined : null;\n    }\n\n    var value = node.getAttribute(name);\n\n    if (value === '' + expected) {\n      return expected;\n    }\n\n    return value;\n  }\n}\n/**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\n\nfunction setValueForProperty(node, name, value, isCustomComponentTag) {\n  var propertyInfo = getPropertyInfo(name);\n\n  if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {\n    return;\n  }\n\n  if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {\n    value = null;\n  } // If the prop isn't in the special list, treat it as a simple attribute.\n\n\n  if (isCustomComponentTag || propertyInfo === null) {\n    if (isAttributeNameSafe(name)) {\n      var _attributeName = name;\n\n      if (value === null) {\n        node.removeAttribute(_attributeName);\n      } else {\n        node.setAttribute(_attributeName,  '' + value);\n      }\n    }\n\n    return;\n  }\n\n  var mustUseProperty = propertyInfo.mustUseProperty;\n\n  if (mustUseProperty) {\n    var propertyName = propertyInfo.propertyName;\n\n    if (value === null) {\n      var type = propertyInfo.type;\n      node[propertyName] = type === BOOLEAN ? false : '';\n    } else {\n      // Contrary to `setAttribute`, object properties are properly\n      // `toString`ed by IE8/9.\n      node[propertyName] = value;\n    }\n\n    return;\n  } // The rest are treated as attributes with special cases.\n\n\n  var attributeName = propertyInfo.attributeName,\n      attributeNamespace = propertyInfo.attributeNamespace;\n\n  if (value === null) {\n    node.removeAttribute(attributeName);\n  } else {\n    var _type = propertyInfo.type;\n    var attributeValue;\n\n    if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {\n      // If attribute type is boolean, we know for sure it won't be an execution sink\n      // and we won't require Trusted Type here.\n      attributeValue = '';\n    } else {\n      // `setAttribute` with objects becomes only `[object]` in IE8/9,\n      // ('' + value) makes it output the correct toString()-value.\n      {\n        attributeValue = '' + value;\n      }\n\n      if (propertyInfo.sanitizeURL) {\n        sanitizeURL(attributeValue.toString());\n      }\n    }\n\n    if (attributeNamespace) {\n      node.setAttributeNS(attributeNamespace, attributeName, attributeValue);\n    } else {\n      node.setAttribute(attributeName, attributeValue);\n    }\n  }\n}\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n  var sourceInfo = '';\n\n  if (source) {\n    var path = source.fileName;\n    var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n    {\n      // In DEV, include code for a common special case:\n      // prefer \"folder/index.js\" instead of just \"index.js\".\n      if (/^index\\./.test(fileName)) {\n        var match = path.match(BEFORE_SLASH_RE);\n\n        if (match) {\n          var pathBeforeSlash = match[1];\n\n          if (pathBeforeSlash) {\n            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n            fileName = folderName + '/' + fileName;\n          }\n        }\n      }\n    }\n\n    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n  } else if (ownerName) {\n    sourceInfo = ' (created by ' + ownerName + ')';\n  }\n\n  return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n}\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\nvar Uninitialized = -1;\nvar Pending = 0;\nvar Resolved = 1;\nvar Rejected = 2;\nfunction refineResolvedLazyComponent(lazyComponent) {\n  return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\nfunction initializeLazyComponentType(lazyComponent) {\n  if (lazyComponent._status === Uninitialized) {\n    lazyComponent._status = Pending;\n    var ctor = lazyComponent._ctor;\n    var thenable = ctor();\n    lazyComponent._result = thenable;\n    thenable.then(function (moduleObject) {\n      if (lazyComponent._status === Pending) {\n        var defaultExport = moduleObject.default;\n\n        {\n          if (defaultExport === undefined) {\n            error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\\n\\nYour code should look like: \\n  ' + \"const MyComponent = lazy(() => import('./MyComponent'))\", moduleObject);\n          }\n        }\n\n        lazyComponent._status = Resolved;\n        lazyComponent._result = defaultExport;\n      }\n    }, function (error) {\n      if (lazyComponent._status === Pending) {\n        lazyComponent._status = Rejected;\n        lazyComponent._result = error;\n      }\n    });\n  }\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = innerType.displayName || innerType.name || '';\n  return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        return 'Context.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        return 'Context.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        return getComponentName(type.type);\n\n      case REACT_BLOCK_TYPE:\n        return getComponentName(type.render);\n\n      case REACT_LAZY_TYPE:\n        {\n          var thenable = type;\n          var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n          if (resolvedThenable) {\n            return getComponentName(resolvedThenable);\n          }\n\n          break;\n        }\n    }\n  }\n\n  return null;\n}\n\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction describeFiber(fiber) {\n  switch (fiber.tag) {\n    case HostRoot:\n    case HostPortal:\n    case HostText:\n    case Fragment:\n    case ContextProvider:\n    case ContextConsumer:\n      return '';\n\n    default:\n      var owner = fiber._debugOwner;\n      var source = fiber._debugSource;\n      var name = getComponentName(fiber.type);\n      var ownerName = null;\n\n      if (owner) {\n        ownerName = getComponentName(owner.type);\n      }\n\n      return describeComponentFrame(name, source, ownerName);\n  }\n}\n\nfunction getStackByFiberInDevAndProd(workInProgress) {\n  var info = '';\n  var node = workInProgress;\n\n  do {\n    info += describeFiber(node);\n    node = node.return;\n  } while (node);\n\n  return info;\n}\nvar current = null;\nvar isRendering = false;\nfunction getCurrentFiberOwnerNameInDevOrNull() {\n  {\n    if (current === null) {\n      return null;\n    }\n\n    var owner = current._debugOwner;\n\n    if (owner !== null && typeof owner !== 'undefined') {\n      return getComponentName(owner.type);\n    }\n  }\n\n  return null;\n}\nfunction getCurrentFiberStackInDev() {\n  {\n    if (current === null) {\n      return '';\n    } // Safe because if current fiber exists, we are reconciling,\n    // and it is guaranteed to be the work-in-progress version.\n\n\n    return getStackByFiberInDevAndProd(current);\n  }\n}\nfunction resetCurrentFiber() {\n  {\n    ReactDebugCurrentFrame$1.getCurrentStack = null;\n    current = null;\n    isRendering = false;\n  }\n}\nfunction setCurrentFiber(fiber) {\n  {\n    ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackInDev;\n    current = fiber;\n    isRendering = false;\n  }\n}\nfunction setIsRendering(rendering) {\n  {\n    isRendering = rendering;\n  }\n}\n\n// Flow does not allow string concatenation of most non-string types. To work\n// around this limitation, we use an opaque type that can only be obtained by\n// passing the value through getToStringValue first.\nfunction toString(value) {\n  return '' + value;\n}\nfunction getToStringValue(value) {\n  switch (typeof value) {\n    case 'boolean':\n    case 'number':\n    case 'object':\n    case 'string':\n    case 'undefined':\n      return value;\n\n    default:\n      // function, symbol are assigned as empty strings\n      return '';\n  }\n}\n\nvar ReactDebugCurrentFrame$2 = null;\nvar ReactControlledValuePropTypes = {\n  checkPropTypes: null\n};\n\n{\n  ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;\n  var hasReadOnlyValue = {\n    button: true,\n    checkbox: true,\n    image: true,\n    hidden: true,\n    radio: true,\n    reset: true,\n    submit: true\n  };\n  var propTypes = {\n    value: function (props, propName, componentName) {\n      if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n        return null;\n      }\n\n      return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n    },\n    checked: function (props, propName, componentName) {\n      if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n        return null;\n      }\n\n      return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n    }\n  };\n  /**\n   * Provide a linked `value` attribute for controlled forms. You should not use\n   * this outside of the ReactDOM controlled form components.\n   */\n\n  ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {\n    checkPropTypes(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);\n  };\n}\n\nfunction isCheckable(elem) {\n  var type = elem.type;\n  var nodeName = elem.nodeName;\n  return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');\n}\n\nfunction getTracker(node) {\n  return node._valueTracker;\n}\n\nfunction detachTracker(node) {\n  node._valueTracker = null;\n}\n\nfunction getValueFromNode(node) {\n  var value = '';\n\n  if (!node) {\n    return value;\n  }\n\n  if (isCheckable(node)) {\n    value = node.checked ? 'true' : 'false';\n  } else {\n    value = node.value;\n  }\n\n  return value;\n}\n\nfunction trackValueOnNode(node) {\n  var valueField = isCheckable(node) ? 'checked' : 'value';\n  var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);\n  var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail\n  // and don't track value will cause over reporting of changes,\n  // but it's better then a hard failure\n  // (needed for certain tests that spyOn input values and Safari)\n\n  if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {\n    return;\n  }\n\n  var get = descriptor.get,\n      set = descriptor.set;\n  Object.defineProperty(node, valueField, {\n    configurable: true,\n    get: function () {\n      return get.call(this);\n    },\n    set: function (value) {\n      currentValue = '' + value;\n      set.call(this, value);\n    }\n  }); // We could've passed this the first time\n  // but it triggers a bug in IE11 and Edge 14/15.\n  // Calling defineProperty() again should be equivalent.\n  // https://github.com/facebook/react/issues/11768\n\n  Object.defineProperty(node, valueField, {\n    enumerable: descriptor.enumerable\n  });\n  var tracker = {\n    getValue: function () {\n      return currentValue;\n    },\n    setValue: function (value) {\n      currentValue = '' + value;\n    },\n    stopTracking: function () {\n      detachTracker(node);\n      delete node[valueField];\n    }\n  };\n  return tracker;\n}\n\nfunction track(node) {\n  if (getTracker(node)) {\n    return;\n  } // TODO: Once it's just Fiber we can move this to node._wrapperState\n\n\n  node._valueTracker = trackValueOnNode(node);\n}\nfunction updateValueIfChanged(node) {\n  if (!node) {\n    return false;\n  }\n\n  var tracker = getTracker(node); // if there is no tracker at this point it's unlikely\n  // that trying again will succeed\n\n  if (!tracker) {\n    return true;\n  }\n\n  var lastValue = tracker.getValue();\n  var nextValue = getValueFromNode(node);\n\n  if (nextValue !== lastValue) {\n    tracker.setValue(nextValue);\n    return true;\n  }\n\n  return false;\n}\n\nvar didWarnValueDefaultValue = false;\nvar didWarnCheckedDefaultChecked = false;\nvar didWarnControlledToUncontrolled = false;\nvar didWarnUncontrolledToControlled = false;\n\nfunction isControlled(props) {\n  var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n  return usesChecked ? props.checked != null : props.value != null;\n}\n/**\n * Implements an <input> host component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\n\n\nfunction getHostProps(element, props) {\n  var node = element;\n  var checked = props.checked;\n\n  var hostProps = _assign({}, props, {\n    defaultChecked: undefined,\n    defaultValue: undefined,\n    value: undefined,\n    checked: checked != null ? checked : node._wrapperState.initialChecked\n  });\n\n  return hostProps;\n}\nfunction initWrapperState(element, props) {\n  {\n    ReactControlledValuePropTypes.checkPropTypes('input', props);\n\n    if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n      error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n      didWarnCheckedDefaultChecked = true;\n    }\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n      error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n      didWarnValueDefaultValue = true;\n    }\n  }\n\n  var node = element;\n  var defaultValue = props.defaultValue == null ? '' : props.defaultValue;\n  node._wrapperState = {\n    initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n    initialValue: getToStringValue(props.value != null ? props.value : defaultValue),\n    controlled: isControlled(props)\n  };\n}\nfunction updateChecked(element, props) {\n  var node = element;\n  var checked = props.checked;\n\n  if (checked != null) {\n    setValueForProperty(node, 'checked', checked, false);\n  }\n}\nfunction updateWrapper(element, props) {\n  var node = element;\n\n  {\n    var controlled = isControlled(props);\n\n    if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n      error('A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n      didWarnUncontrolledToControlled = true;\n    }\n\n    if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n      error('A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n      didWarnControlledToUncontrolled = true;\n    }\n  }\n\n  updateChecked(element, props);\n  var value = getToStringValue(props.value);\n  var type = props.type;\n\n  if (value != null) {\n    if (type === 'number') {\n      if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.\n      // eslint-disable-next-line\n      node.value != value) {\n        node.value = toString(value);\n      }\n    } else if (node.value !== toString(value)) {\n      node.value = toString(value);\n    }\n  } else if (type === 'submit' || type === 'reset') {\n    // Submit/reset inputs need the attribute removed completely to avoid\n    // blank-text buttons.\n    node.removeAttribute('value');\n    return;\n  }\n\n  {\n    // When syncing the value attribute, the value comes from a cascade of\n    // properties:\n    //  1. The value React property\n    //  2. The defaultValue React property\n    //  3. Otherwise there should be no change\n    if (props.hasOwnProperty('value')) {\n      setDefaultValue(node, props.type, value);\n    } else if (props.hasOwnProperty('defaultValue')) {\n      setDefaultValue(node, props.type, getToStringValue(props.defaultValue));\n    }\n  }\n\n  {\n    // When syncing the checked attribute, it only changes when it needs\n    // to be removed, such as transitioning from a checkbox into a text input\n    if (props.checked == null && props.defaultChecked != null) {\n      node.defaultChecked = !!props.defaultChecked;\n    }\n  }\n}\nfunction postMountWrapper(element, props, isHydrating) {\n  var node = element; // Do not assign value if it is already set. This prevents user text input\n  // from being lost during SSR hydration.\n\n  if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {\n    var type = props.type;\n    var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the\n    // default value provided by the browser. See: #12872\n\n    if (isButton && (props.value === undefined || props.value === null)) {\n      return;\n    }\n\n    var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input\n    // from being lost during SSR hydration.\n\n    if (!isHydrating) {\n      {\n        // When syncing the value attribute, the value property should use\n        // the wrapperState._initialValue property. This uses:\n        //\n        //   1. The value React property when present\n        //   2. The defaultValue React property when present\n        //   3. An empty string\n        if (initialValue !== node.value) {\n          node.value = initialValue;\n        }\n      }\n    }\n\n    {\n      // Otherwise, the value attribute is synchronized to the property,\n      // so we assign defaultValue to the same thing as the value property\n      // assignment step above.\n      node.defaultValue = initialValue;\n    }\n  } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n  // this is needed to work around a chrome bug where setting defaultChecked\n  // will sometimes influence the value of checked (even after detachment).\n  // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n  // We need to temporarily unset name to avoid disrupting radio button groups.\n\n\n  var name = node.name;\n\n  if (name !== '') {\n    node.name = '';\n  }\n\n  {\n    // When syncing the checked attribute, both the checked property and\n    // attribute are assigned at the same time using defaultChecked. This uses:\n    //\n    //   1. The checked React property when present\n    //   2. The defaultChecked React property when present\n    //   3. Otherwise, false\n    node.defaultChecked = !node.defaultChecked;\n    node.defaultChecked = !!node._wrapperState.initialChecked;\n  }\n\n  if (name !== '') {\n    node.name = name;\n  }\n}\nfunction restoreControlledState(element, props) {\n  var node = element;\n  updateWrapper(node, props);\n  updateNamedCousins(node, props);\n}\n\nfunction updateNamedCousins(rootNode, props) {\n  var name = props.name;\n\n  if (props.type === 'radio' && name != null) {\n    var queryRoot = rootNode;\n\n    while (queryRoot.parentNode) {\n      queryRoot = queryRoot.parentNode;\n    } // If `rootNode.form` was non-null, then we could try `form.elements`,\n    // but that sometimes behaves strangely in IE8. We could also try using\n    // `form.getElementsByName`, but that will only return direct children\n    // and won't include inputs that use the HTML5 `form=` attribute. Since\n    // the input might not even be in a form. It might not even be in the\n    // document. Let's just use the local `querySelectorAll` to ensure we don't\n    // miss anything.\n\n\n    var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n    for (var i = 0; i < group.length; i++) {\n      var otherNode = group[i];\n\n      if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n        continue;\n      } // This will throw if radio buttons rendered by different copies of React\n      // and the same name are rendered into the same form (same as #1939).\n      // That's probably okay; we don't support it just as we don't support\n      // mixing React radio buttons with non-React ones.\n\n\n      var otherProps = getFiberCurrentPropsFromNode$1(otherNode);\n\n      if (!otherProps) {\n        {\n          throw Error( \"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\" );\n        }\n      } // We need update the tracked value on the named cousin since the value\n      // was changed but the input saw no event or value set\n\n\n      updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that\n      // was previously checked to update will cause it to be come re-checked\n      // as appropriate.\n\n      updateWrapper(otherNode, otherProps);\n    }\n  }\n} // In Chrome, assigning defaultValue to certain input types triggers input validation.\n// For number inputs, the display value loses trailing decimal points. For email inputs,\n// Chrome raises \"The specified value <x> is not a valid email address\".\n//\n// Here we check to see if the defaultValue has actually changed, avoiding these problems\n// when the user is inputting text\n//\n// https://github.com/facebook/react/issues/7253\n\n\nfunction setDefaultValue(node, type, value) {\n  if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js\n  type !== 'number' || node.ownerDocument.activeElement !== node) {\n    if (value == null) {\n      node.defaultValue = toString(node._wrapperState.initialValue);\n    } else if (node.defaultValue !== toString(value)) {\n      node.defaultValue = toString(value);\n    }\n  }\n}\n\nvar didWarnSelectedSetOnOption = false;\nvar didWarnInvalidChild = false;\n\nfunction flattenChildren(children) {\n  var content = ''; // Flatten children. We'll warn if they are invalid\n  // during validateProps() which runs for hydration too.\n  // Note that this would throw on non-element objects.\n  // Elements are stringified (which is normally irrelevant\n  // but matters for <fbt>).\n\n  React.Children.forEach(children, function (child) {\n    if (child == null) {\n      return;\n    }\n\n    content += child; // Note: we don't warn about invalid children here.\n    // Instead, this is done separately below so that\n    // it happens during the hydration codepath too.\n  });\n  return content;\n}\n/**\n * Implements an <option> host component that warns when `selected` is set.\n */\n\n\nfunction validateProps(element, props) {\n  {\n    // This mirrors the codepath above, but runs for hydration too.\n    // Warn about invalid children here so that client and hydration are consistent.\n    // TODO: this seems like it could cause a DEV-only throw for hydration\n    // if children contains a non-element object. We should try to avoid that.\n    if (typeof props.children === 'object' && props.children !== null) {\n      React.Children.forEach(props.children, function (child) {\n        if (child == null) {\n          return;\n        }\n\n        if (typeof child === 'string' || typeof child === 'number') {\n          return;\n        }\n\n        if (typeof child.type !== 'string') {\n          return;\n        }\n\n        if (!didWarnInvalidChild) {\n          didWarnInvalidChild = true;\n\n          error('Only strings and numbers are supported as <option> children.');\n        }\n      });\n    } // TODO: Remove support for `selected` in <option>.\n\n\n    if (props.selected != null && !didWarnSelectedSetOnOption) {\n      error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');\n\n      didWarnSelectedSetOnOption = true;\n    }\n  }\n}\nfunction postMountWrapper$1(element, props) {\n  // value=\"\" should make a value attribute (#6219)\n  if (props.value != null) {\n    element.setAttribute('value', toString(getToStringValue(props.value)));\n  }\n}\nfunction getHostProps$1(element, props) {\n  var hostProps = _assign({\n    children: undefined\n  }, props);\n\n  var content = flattenChildren(props.children);\n\n  if (content) {\n    hostProps.children = content;\n  }\n\n  return hostProps;\n}\n\nvar didWarnValueDefaultValue$1;\n\n{\n  didWarnValueDefaultValue$1 = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n  var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n  if (ownerName) {\n    return '\\n\\nCheck the render method of `' + ownerName + '`.';\n  }\n\n  return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n/**\n * Validation function for `value` and `defaultValue`.\n */\n\nfunction checkSelectPropTypes(props) {\n  {\n    ReactControlledValuePropTypes.checkPropTypes('select', props);\n\n    for (var i = 0; i < valuePropNames.length; i++) {\n      var propName = valuePropNames[i];\n\n      if (props[propName] == null) {\n        continue;\n      }\n\n      var isArray = Array.isArray(props[propName]);\n\n      if (props.multiple && !isArray) {\n        error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());\n      } else if (!props.multiple && isArray) {\n        error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());\n      }\n    }\n  }\n}\n\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n  var options = node.options;\n\n  if (multiple) {\n    var selectedValues = propValue;\n    var selectedValue = {};\n\n    for (var i = 0; i < selectedValues.length; i++) {\n      // Prefix to avoid chaos with special keys.\n      selectedValue['$' + selectedValues[i]] = true;\n    }\n\n    for (var _i = 0; _i < options.length; _i++) {\n      var selected = selectedValue.hasOwnProperty('$' + options[_i].value);\n\n      if (options[_i].selected !== selected) {\n        options[_i].selected = selected;\n      }\n\n      if (selected && setDefaultSelected) {\n        options[_i].defaultSelected = true;\n      }\n    }\n  } else {\n    // Do not set `select.value` as exact behavior isn't consistent across all\n    // browsers for all cases.\n    var _selectedValue = toString(getToStringValue(propValue));\n\n    var defaultSelected = null;\n\n    for (var _i2 = 0; _i2 < options.length; _i2++) {\n      if (options[_i2].value === _selectedValue) {\n        options[_i2].selected = true;\n\n        if (setDefaultSelected) {\n          options[_i2].defaultSelected = true;\n        }\n\n        return;\n      }\n\n      if (defaultSelected === null && !options[_i2].disabled) {\n        defaultSelected = options[_i2];\n      }\n    }\n\n    if (defaultSelected !== null) {\n      defaultSelected.selected = true;\n    }\n  }\n}\n/**\n * Implements a <select> host component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\n\n\nfunction getHostProps$2(element, props) {\n  return _assign({}, props, {\n    value: undefined\n  });\n}\nfunction initWrapperState$1(element, props) {\n  var node = element;\n\n  {\n    checkSelectPropTypes(props);\n  }\n\n  node._wrapperState = {\n    wasMultiple: !!props.multiple\n  };\n\n  {\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {\n      error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');\n\n      didWarnValueDefaultValue$1 = true;\n    }\n  }\n}\nfunction postMountWrapper$2(element, props) {\n  var node = element;\n  node.multiple = !!props.multiple;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  } else if (props.defaultValue != null) {\n    updateOptions(node, !!props.multiple, props.defaultValue, true);\n  }\n}\nfunction postUpdateWrapper(element, props) {\n  var node = element;\n  var wasMultiple = node._wrapperState.wasMultiple;\n  node._wrapperState.wasMultiple = !!props.multiple;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  } else if (wasMultiple !== !!props.multiple) {\n    // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n    if (props.defaultValue != null) {\n      updateOptions(node, !!props.multiple, props.defaultValue, true);\n    } else {\n      // Revert the select back to its default unselected state.\n      updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);\n    }\n  }\n}\nfunction restoreControlledState$1(element, props) {\n  var node = element;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  }\n}\n\nvar didWarnValDefaultVal = false;\n\n/**\n * Implements a <textarea> host component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nfunction getHostProps$3(element, props) {\n  var node = element;\n\n  if (!(props.dangerouslySetInnerHTML == null)) {\n    {\n      throw Error( \"`dangerouslySetInnerHTML` does not make sense on <textarea>.\" );\n    }\n  } // Always set children to the same thing. In IE9, the selection range will\n  // get reset if `textContent` is mutated.  We could add a check in setTextContent\n  // to only set the value if/when the value differs from the node value (which would\n  // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this\n  // solution. The value can be a boolean or object so that's why it's forced\n  // to be a string.\n\n\n  var hostProps = _assign({}, props, {\n    value: undefined,\n    defaultValue: undefined,\n    children: toString(node._wrapperState.initialValue)\n  });\n\n  return hostProps;\n}\nfunction initWrapperState$2(element, props) {\n  var node = element;\n\n  {\n    ReactControlledValuePropTypes.checkPropTypes('textarea', props);\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {\n      error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');\n\n      didWarnValDefaultVal = true;\n    }\n  }\n\n  var initialValue = props.value; // Only bother fetching default value if we're going to use it\n\n  if (initialValue == null) {\n    var children = props.children,\n        defaultValue = props.defaultValue;\n\n    if (children != null) {\n      {\n        error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');\n      }\n\n      {\n        if (!(defaultValue == null)) {\n          {\n            throw Error( \"If you supply `defaultValue` on a <textarea>, do not pass children.\" );\n          }\n        }\n\n        if (Array.isArray(children)) {\n          if (!(children.length <= 1)) {\n            {\n              throw Error( \"<textarea> can only have at most one child.\" );\n            }\n          }\n\n          children = children[0];\n        }\n\n        defaultValue = children;\n      }\n    }\n\n    if (defaultValue == null) {\n      defaultValue = '';\n    }\n\n    initialValue = defaultValue;\n  }\n\n  node._wrapperState = {\n    initialValue: getToStringValue(initialValue)\n  };\n}\nfunction updateWrapper$1(element, props) {\n  var node = element;\n  var value = getToStringValue(props.value);\n  var defaultValue = getToStringValue(props.defaultValue);\n\n  if (value != null) {\n    // Cast `value` to a string to ensure the value is set correctly. While\n    // browsers typically do this as necessary, jsdom doesn't.\n    var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed\n\n    if (newValue !== node.value) {\n      node.value = newValue;\n    }\n\n    if (props.defaultValue == null && node.defaultValue !== newValue) {\n      node.defaultValue = newValue;\n    }\n  }\n\n  if (defaultValue != null) {\n    node.defaultValue = toString(defaultValue);\n  }\n}\nfunction postMountWrapper$3(element, props) {\n  var node = element; // This is in postMount because we need access to the DOM node, which is not\n  // available until after the component has mounted.\n\n  var textContent = node.textContent; // Only set node.value if textContent is equal to the expected\n  // initial value. In IE10/IE11 there is a bug where the placeholder attribute\n  // will populate textContent as well.\n  // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/\n\n  if (textContent === node._wrapperState.initialValue) {\n    if (textContent !== '' && textContent !== null) {\n      node.value = textContent;\n    }\n  }\n}\nfunction restoreControlledState$2(element, props) {\n  // DOM component is still mounted; update\n  updateWrapper$1(element, props);\n}\n\nvar HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nvar MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\nvar SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nvar Namespaces = {\n  html: HTML_NAMESPACE,\n  mathml: MATH_NAMESPACE,\n  svg: SVG_NAMESPACE\n}; // Assumes there is no parent namespace.\n\nfunction getIntrinsicNamespace(type) {\n  switch (type) {\n    case 'svg':\n      return SVG_NAMESPACE;\n\n    case 'math':\n      return MATH_NAMESPACE;\n\n    default:\n      return HTML_NAMESPACE;\n  }\n}\nfunction getChildNamespace(parentNamespace, type) {\n  if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {\n    // No (or default) parent namespace: potential entry point.\n    return getIntrinsicNamespace(type);\n  }\n\n  if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {\n    // We're leaving SVG.\n    return HTML_NAMESPACE;\n  } // By default, pass namespace below.\n\n\n  return parentNamespace;\n}\n\n/* globals MSApp */\n\n/**\n * Create a function which has 'unsafe' privileges (required by windows8 apps)\n */\nvar createMicrosoftUnsafeLocalFunction = function (func) {\n  if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n    return function (arg0, arg1, arg2, arg3) {\n      MSApp.execUnsafeLocalFunction(function () {\n        return func(arg0, arg1, arg2, arg3);\n      });\n    };\n  } else {\n    return func;\n  }\n};\n\nvar reusableSVGContainer;\n/**\n * Set the innerHTML property of a node\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\n\nvar setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {\n  if (node.namespaceURI === Namespaces.svg) {\n\n    if (!('innerHTML' in node)) {\n      // IE does not have innerHTML for SVG nodes, so instead we inject the\n      // new markup in a temp node and then move the child nodes across into\n      // the target node\n      reusableSVGContainer = reusableSVGContainer || document.createElement('div');\n      reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';\n      var svgNode = reusableSVGContainer.firstChild;\n\n      while (node.firstChild) {\n        node.removeChild(node.firstChild);\n      }\n\n      while (svgNode.firstChild) {\n        node.appendChild(svgNode.firstChild);\n      }\n\n      return;\n    }\n  }\n\n  node.innerHTML = html;\n});\n\n/**\n * HTML nodeType values that represent the type of the node\n */\nvar ELEMENT_NODE = 1;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\nvar DOCUMENT_NODE = 9;\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\n/**\n * Set the textContent property of a node. For text updates, it's faster\n * to set the `nodeValue` of the Text node directly instead of using\n * `.textContent` which will remove the existing node and create a new one.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\n\nvar setTextContent = function (node, text) {\n  if (text) {\n    var firstChild = node.firstChild;\n\n    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {\n      firstChild.nodeValue = text;\n      return;\n    }\n  }\n\n  node.textContent = text;\n};\n\n// Do not use the below two methods directly!\n// Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.\n// (It is the only module that is allowed to access these methods.)\nfunction unsafeCastStringToDOMTopLevelType(topLevelType) {\n  return topLevelType;\n}\nfunction unsafeCastDOMTopLevelTypeToString(topLevelType) {\n  return topLevelType;\n}\n\n/**\n * Generate a mapping of standard vendor prefixes using the defined style property and event name.\n *\n * @param {string} styleProp\n * @param {string} eventName\n * @returns {object}\n */\n\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes['Webkit' + styleProp] = 'webkit' + eventName;\n  prefixes['Moz' + styleProp] = 'moz' + eventName;\n  return prefixes;\n}\n/**\n * A list of event names to a configurable list of vendor prefixes.\n */\n\n\nvar vendorPrefixes = {\n  animationend: makePrefixMap('Animation', 'AnimationEnd'),\n  animationiteration: makePrefixMap('Animation', 'AnimationIteration'),\n  animationstart: makePrefixMap('Animation', 'AnimationStart'),\n  transitionend: makePrefixMap('Transition', 'TransitionEnd')\n};\n/**\n * Event names that have already been detected and prefixed (if applicable).\n */\n\nvar prefixedEventNames = {};\n/**\n * Element to check for prefixes on.\n */\n\nvar style = {};\n/**\n * Bootstrap if a DOM exists.\n */\n\nif (canUseDOM) {\n  style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,\n  // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n  // style object but the events that fire will still be prefixed, so we need\n  // to check if the un-prefixed events are usable, and if not remove them from the map.\n\n  if (!('AnimationEvent' in window)) {\n    delete vendorPrefixes.animationend.animation;\n    delete vendorPrefixes.animationiteration.animation;\n    delete vendorPrefixes.animationstart.animation;\n  } // Same as above\n\n\n  if (!('TransitionEvent' in window)) {\n    delete vendorPrefixes.transitionend.transition;\n  }\n}\n/**\n * Attempts to determine the correct vendor prefixed event name.\n *\n * @param {string} eventName\n * @returns {string}\n */\n\n\nfunction getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) {\n    return prefixedEventNames[eventName];\n  } else if (!vendorPrefixes[eventName]) {\n    return eventName;\n  }\n\n  var prefixMap = vendorPrefixes[eventName];\n\n  for (var styleProp in prefixMap) {\n    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {\n      return prefixedEventNames[eventName] = prefixMap[styleProp];\n    }\n  }\n\n  return eventName;\n}\n\n/**\n * To identify top level events in ReactDOM, we use constants defined by this\n * module. This is the only module that uses the unsafe* methods to express\n * that the constants actually correspond to the browser event names. This lets\n * us save some bundle size by avoiding a top level type -> event name map.\n * The rest of ReactDOM code should import top level types from this file.\n */\n\nvar TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');\nvar TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));\nvar TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));\nvar TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));\nvar TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');\nvar TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');\nvar TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');\nvar TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');\nvar TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');\nvar TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');\nvar TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');\nvar TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');\nvar TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');\nvar TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');\nvar TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');\nvar TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');\nvar TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');\nvar TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');\nvar TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');\nvar TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');\nvar TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');\nvar TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');\nvar TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');\nvar TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');\nvar TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');\nvar TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');\nvar TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');\nvar TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');\nvar TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');\nvar TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');\nvar TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');\nvar TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');\nvar TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');\nvar TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');\nvar TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');\nvar TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');\nvar TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');\nvar TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');\nvar TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');\nvar TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');\nvar TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');\nvar TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');\nvar TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');\nvar TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');\nvar TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');\nvar TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');\nvar TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');\nvar TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');\nvar TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');\nvar TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');\nvar TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');\nvar TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');\nvar TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');\nvar TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');\nvar TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');\nvar TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');\nvar TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');\nvar TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');\nvar TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');\nvar TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');\nvar TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');\nvar TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');\nvar TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');\nvar TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');\nvar TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');\nvar TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');\nvar TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');\nvar TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');\nvar TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');\nvar TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');\nvar TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');\nvar TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');\nvar TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');\nvar TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');\nvar TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');\nvar TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');\nvar TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));\nvar TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');\nvar TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');\nvar TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements.\n// Note that events in this list will *not* be listened to at the top level\n// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.\n\nvar mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];\nfunction getRawEventName(topLevelType) {\n  return unsafeCastDOMTopLevelTypeToString(topLevelType);\n}\n\nvar PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // prettier-ignore\n\nvar elementListenerMap = new PossiblyWeakMap();\nfunction getListenerMapForElement(element) {\n  var listenerMap = elementListenerMap.get(element);\n\n  if (listenerMap === undefined) {\n    listenerMap = new Map();\n    elementListenerMap.set(element, listenerMap);\n  }\n\n  return listenerMap;\n}\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n *\n * Note that this module is currently shared and assumed to be stateless.\n * If this becomes an actual Map, that will break.\n */\nfunction get(key) {\n  return key._reactInternalFiber;\n}\nfunction has(key) {\n  return key._reactInternalFiber !== undefined;\n}\nfunction set(key, value) {\n  key._reactInternalFiber = value;\n}\n\n// Don't change these two values. They're used by React Dev Tools.\nvar NoEffect =\n/*              */\n0;\nvar PerformedWork =\n/*         */\n1; // You can change the rest (and add more).\n\nvar Placement =\n/*             */\n2;\nvar Update =\n/*                */\n4;\nvar PlacementAndUpdate =\n/*    */\n6;\nvar Deletion =\n/*              */\n8;\nvar ContentReset =\n/*          */\n16;\nvar Callback =\n/*              */\n32;\nvar DidCapture =\n/*            */\n64;\nvar Ref =\n/*                   */\n128;\nvar Snapshot =\n/*              */\n256;\nvar Passive =\n/*               */\n512;\nvar Hydrating =\n/*             */\n1024;\nvar HydratingAndUpdate =\n/*    */\n1028; // Passive & Update & Callback & Ref & Snapshot\n\nvar LifecycleEffectMask =\n/*   */\n932; // Union of all host effects\n\nvar HostEffectMask =\n/*        */\n2047;\nvar Incomplete =\n/*            */\n2048;\nvar ShouldCapture =\n/*         */\n4096;\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nfunction getNearestMountedFiber(fiber) {\n  var node = fiber;\n  var nearestMounted = fiber;\n\n  if (!fiber.alternate) {\n    // If there is no alternate, this might be a new tree that isn't inserted\n    // yet. If it is, then it will have a pending insertion effect on it.\n    var nextNode = node;\n\n    do {\n      node = nextNode;\n\n      if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) {\n        // This is an insertion or in-progress hydration. The nearest possible\n        // mounted fiber is the parent but we need to continue to figure out\n        // if that one is still mounted.\n        nearestMounted = node.return;\n      }\n\n      nextNode = node.return;\n    } while (nextNode);\n  } else {\n    while (node.return) {\n      node = node.return;\n    }\n  }\n\n  if (node.tag === HostRoot) {\n    // TODO: Check if this was a nested HostRoot when used with\n    // renderContainerIntoSubtree.\n    return nearestMounted;\n  } // If we didn't hit the root, that means that we're in an disconnected tree\n  // that has been unmounted.\n\n\n  return null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n  if (fiber.tag === SuspenseComponent) {\n    var suspenseState = fiber.memoizedState;\n\n    if (suspenseState === null) {\n      var current = fiber.alternate;\n\n      if (current !== null) {\n        suspenseState = current.memoizedState;\n      }\n    }\n\n    if (suspenseState !== null) {\n      return suspenseState.dehydrated;\n    }\n  }\n\n  return null;\n}\nfunction getContainerFromFiber(fiber) {\n  return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;\n}\nfunction isFiberMounted(fiber) {\n  return getNearestMountedFiber(fiber) === fiber;\n}\nfunction isMounted(component) {\n  {\n    var owner = ReactCurrentOwner.current;\n\n    if (owner !== null && owner.tag === ClassComponent) {\n      var ownerFiber = owner;\n      var instance = ownerFiber.stateNode;\n\n      if (!instance._warnedAboutRefsInRender) {\n        error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component');\n      }\n\n      instance._warnedAboutRefsInRender = true;\n    }\n  }\n\n  var fiber = get(component);\n\n  if (!fiber) {\n    return false;\n  }\n\n  return getNearestMountedFiber(fiber) === fiber;\n}\n\nfunction assertIsMounted(fiber) {\n  if (!(getNearestMountedFiber(fiber) === fiber)) {\n    {\n      throw Error( \"Unable to find node on an unmounted component.\" );\n    }\n  }\n}\n\nfunction findCurrentFiberUsingSlowPath(fiber) {\n  var alternate = fiber.alternate;\n\n  if (!alternate) {\n    // If there is no alternate, then we only need to check if it is mounted.\n    var nearestMounted = getNearestMountedFiber(fiber);\n\n    if (!(nearestMounted !== null)) {\n      {\n        throw Error( \"Unable to find node on an unmounted component.\" );\n      }\n    }\n\n    if (nearestMounted !== fiber) {\n      return null;\n    }\n\n    return fiber;\n  } // If we have two possible branches, we'll walk backwards up to the root\n  // to see what path the root points to. On the way we may hit one of the\n  // special cases and we'll deal with them.\n\n\n  var a = fiber;\n  var b = alternate;\n\n  while (true) {\n    var parentA = a.return;\n\n    if (parentA === null) {\n      // We're at the root.\n      break;\n    }\n\n    var parentB = parentA.alternate;\n\n    if (parentB === null) {\n      // There is no alternate. This is an unusual case. Currently, it only\n      // happens when a Suspense component is hidden. An extra fragment fiber\n      // is inserted in between the Suspense fiber and its children. Skip\n      // over this extra fragment fiber and proceed to the next parent.\n      var nextParent = parentA.return;\n\n      if (nextParent !== null) {\n        a = b = nextParent;\n        continue;\n      } // If there's no parent, we're at the root.\n\n\n      break;\n    } // If both copies of the parent fiber point to the same child, we can\n    // assume that the child is current. This happens when we bailout on low\n    // priority: the bailed out fiber's child reuses the current child.\n\n\n    if (parentA.child === parentB.child) {\n      var child = parentA.child;\n\n      while (child) {\n        if (child === a) {\n          // We've determined that A is the current branch.\n          assertIsMounted(parentA);\n          return fiber;\n        }\n\n        if (child === b) {\n          // We've determined that B is the current branch.\n          assertIsMounted(parentA);\n          return alternate;\n        }\n\n        child = child.sibling;\n      } // We should never have an alternate for any mounting node. So the only\n      // way this could possibly happen is if this was unmounted, if at all.\n\n\n      {\n        {\n          throw Error( \"Unable to find node on an unmounted component.\" );\n        }\n      }\n    }\n\n    if (a.return !== b.return) {\n      // The return pointer of A and the return pointer of B point to different\n      // fibers. We assume that return pointers never criss-cross, so A must\n      // belong to the child set of A.return, and B must belong to the child\n      // set of B.return.\n      a = parentA;\n      b = parentB;\n    } else {\n      // The return pointers point to the same fiber. We'll have to use the\n      // default, slow path: scan the child sets of each parent alternate to see\n      // which child belongs to which set.\n      //\n      // Search parent A's child set\n      var didFindChild = false;\n      var _child = parentA.child;\n\n      while (_child) {\n        if (_child === a) {\n          didFindChild = true;\n          a = parentA;\n          b = parentB;\n          break;\n        }\n\n        if (_child === b) {\n          didFindChild = true;\n          b = parentA;\n          a = parentB;\n          break;\n        }\n\n        _child = _child.sibling;\n      }\n\n      if (!didFindChild) {\n        // Search parent B's child set\n        _child = parentB.child;\n\n        while (_child) {\n          if (_child === a) {\n            didFindChild = true;\n            a = parentB;\n            b = parentA;\n            break;\n          }\n\n          if (_child === b) {\n            didFindChild = true;\n            b = parentB;\n            a = parentA;\n            break;\n          }\n\n          _child = _child.sibling;\n        }\n\n        if (!didFindChild) {\n          {\n            throw Error( \"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.\" );\n          }\n        }\n      }\n    }\n\n    if (!(a.alternate === b)) {\n      {\n        throw Error( \"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  } // If the root is not a host container, we're in a disconnected tree. I.e.\n  // unmounted.\n\n\n  if (!(a.tag === HostRoot)) {\n    {\n      throw Error( \"Unable to find node on an unmounted component.\" );\n    }\n  }\n\n  if (a.stateNode.current === a) {\n    // We've determined that A is the current branch.\n    return fiber;\n  } // Otherwise B has to be current branch.\n\n\n  return alternate;\n}\nfunction findCurrentHostFiber(parent) {\n  var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n  if (!currentParent) {\n    return null;\n  } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n  var node = currentParent;\n\n  while (true) {\n    if (node.tag === HostComponent || node.tag === HostText) {\n      return node;\n    } else if (node.child) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === currentParent) {\n      return null;\n    }\n\n    while (!node.sibling) {\n      if (!node.return || node.return === currentParent) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  } // Flow needs the return null here, but ESLint complains about it.\n  // eslint-disable-next-line no-unreachable\n\n\n  return null;\n}\nfunction findCurrentHostFiberWithNoPortals(parent) {\n  var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n  if (!currentParent) {\n    return null;\n  } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n  var node = currentParent;\n\n  while (true) {\n    if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) {\n      return node;\n    } else if (node.child && node.tag !== HostPortal) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === currentParent) {\n      return null;\n    }\n\n    while (!node.sibling) {\n      if (!node.return || node.return === currentParent) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  } // Flow needs the return null here, but ESLint complains about it.\n  // eslint-disable-next-line no-unreachable\n\n\n  return null;\n}\n\n/**\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n  if (!(next != null)) {\n    {\n      throw Error( \"accumulateInto(...): Accumulated items must not be null or undefined.\" );\n    }\n  }\n\n  if (current == null) {\n    return next;\n  } // Both are not empty. Warning: Never call x.concat(y) when you are not\n  // certain that x is an Array (x could be a string with concat method).\n\n\n  if (Array.isArray(current)) {\n    if (Array.isArray(next)) {\n      current.push.apply(current, next);\n      return current;\n    }\n\n    current.push(next);\n    return current;\n  }\n\n  if (Array.isArray(next)) {\n    // A bit too dangerous to mutate `next`.\n    return [current].concat(next);\n  }\n\n  return [current, next];\n}\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n * @param {function} cb Callback invoked with each element or a collection.\n * @param {?} [scope] Scope used as `this` in a callback.\n */\nfunction forEachAccumulated(arr, cb, scope) {\n  if (Array.isArray(arr)) {\n    arr.forEach(cb, scope);\n  } else if (arr) {\n    cb.call(scope, arr);\n  }\n}\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\n\nvar eventQueue = null;\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @private\n */\n\nvar executeDispatchesAndRelease = function (event) {\n  if (event) {\n    executeDispatchesInOrder(event);\n\n    if (!event.isPersistent()) {\n      event.constructor.release(event);\n    }\n  }\n};\n\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n  return executeDispatchesAndRelease(e);\n};\n\nfunction runEventsInBatch(events) {\n  if (events !== null) {\n    eventQueue = accumulateInto(eventQueue, events);\n  } // Set `eventQueue` to null before processing it so that we can tell if more\n  // events get enqueued while processing.\n\n\n  var processingEventQueue = eventQueue;\n  eventQueue = null;\n\n  if (!processingEventQueue) {\n    return;\n  }\n\n  forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n\n  if (!!eventQueue) {\n    {\n      throw Error( \"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\" );\n    }\n  } // This would be a good time to rethrow if any of the event handlers threw.\n\n\n  rethrowCaughtError();\n}\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\n\nfunction getEventTarget(nativeEvent) {\n  // Fallback to nativeEvent.srcElement for IE9\n  // https://github.com/facebook/react/issues/12506\n  var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963\n\n  if (target.correspondingUseElement) {\n    target = target.correspondingUseElement;\n  } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n  // @see http://www.quirksmode.org/js/events_properties.html\n\n\n  return target.nodeType === TEXT_NODE ? target.parentNode : target;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\n\nfunction isEventSupported(eventNameSuffix) {\n  if (!canUseDOM) {\n    return false;\n  }\n\n  var eventName = 'on' + eventNameSuffix;\n  var isSupported = eventName in document;\n\n  if (!isSupported) {\n    var element = document.createElement('div');\n    element.setAttribute(eventName, 'return;');\n    isSupported = typeof element[eventName] === 'function';\n  }\n\n  return isSupported;\n}\n\n/**\n * Summary of `DOMEventPluginSystem` event handling:\n *\n *  - Top-level delegation is used to trap most native browser events. This\n *    may only occur in the main thread and is the responsibility of\n *    ReactDOMEventListener, which is injected and can therefore support\n *    pluggable event sources. This is the only work that occurs in the main\n *    thread.\n *\n *  - We normalize and de-duplicate events to account for browser quirks. This\n *    may be done in the worker thread.\n *\n *  - Forward these native events (with the associated top-level type used to\n *    trap it) to `EventPluginRegistry`, which in turn will ask plugins if they want\n *    to extract any synthetic events.\n *\n *  - The `EventPluginRegistry` will then process each event by annotating them with\n *    \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n *  - The `EventPluginRegistry` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+    .\n * |    DOM     |    .\n * +------------+    .\n *       |           .\n *       v           .\n * +------------+    .\n * | ReactEvent |    .\n * |  Listener  |    .\n * +------------+    .                         +-----------+\n *       |           .               +--------+|SimpleEvent|\n *       |           .               |         |Plugin     |\n * +-----|------+    .               v         +-----------+\n * |     |      |    .    +--------------+                    +------------+\n * |     +-----------.--->|PluginRegistry|                    |    Event   |\n * |            |    .    |              |     +-----------+  | Propagators|\n * | ReactEvent |    .    |              |     |TapEvent   |  |------------|\n * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|\n * |            |    .    |              |     +-----------+  |  utilities |\n * |     +-----------.--->|              |                    +------------+\n * |     |      |    .    +--------------+\n * +-----|------+    .                ^        +-----------+\n *       |           .                |        |Enter/Leave|\n *       +           .                +-------+|Plugin     |\n * +-------------+   .                         +-----------+\n * | application |   .\n * |-------------|   .\n * |             |   .\n * |             |   .\n * +-------------+   .\n *                   .\n *    React Core     .  General Purpose Event Plugin System\n */\n\nvar CALLBACK_BOOKKEEPING_POOL_SIZE = 10;\nvar callbackBookkeepingPool = [];\n\nfunction releaseTopLevelCallbackBookKeeping(instance) {\n  instance.topLevelType = null;\n  instance.nativeEvent = null;\n  instance.targetInst = null;\n  instance.ancestors.length = 0;\n\n  if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {\n    callbackBookkeepingPool.push(instance);\n  }\n} // Used to store ancestor hierarchy in top level callback\n\n\nfunction getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) {\n  if (callbackBookkeepingPool.length) {\n    var instance = callbackBookkeepingPool.pop();\n    instance.topLevelType = topLevelType;\n    instance.eventSystemFlags = eventSystemFlags;\n    instance.nativeEvent = nativeEvent;\n    instance.targetInst = targetInst;\n    return instance;\n  }\n\n  return {\n    topLevelType: topLevelType,\n    eventSystemFlags: eventSystemFlags,\n    nativeEvent: nativeEvent,\n    targetInst: targetInst,\n    ancestors: []\n  };\n}\n/**\n * Find the deepest React component completely containing the root of the\n * passed-in instance (for use when entire React trees are nested within each\n * other). If React trees are not nested, returns null.\n */\n\n\nfunction findRootContainerNode(inst) {\n  if (inst.tag === HostRoot) {\n    return inst.stateNode.containerInfo;\n  } // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n  // traversal, but caching is difficult to do correctly without using a\n  // mutation observer to listen for all DOM changes.\n\n\n  while (inst.return) {\n    inst = inst.return;\n  }\n\n  if (inst.tag !== HostRoot) {\n    // This can happen if we're in a detached tree.\n    return null;\n  }\n\n  return inst.stateNode.containerInfo;\n}\n/**\n * Allows registered plugins an opportunity to extract events from top-level\n * native browser events.\n *\n * @return {*} An accumulation of synthetic events.\n * @internal\n */\n\n\nfunction extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n  var events = null;\n\n  for (var i = 0; i < plugins.length; i++) {\n    // Not every plugin in the ordering may be loaded at runtime.\n    var possiblePlugin = plugins[i];\n\n    if (possiblePlugin) {\n      var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n\n      if (extractedEvents) {\n        events = accumulateInto(events, extractedEvents);\n      }\n    }\n  }\n\n  return events;\n}\n\nfunction runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n  var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n  runEventsInBatch(events);\n}\n\nfunction handleTopLevel(bookKeeping) {\n  var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components.\n  // It's important that we build the array of ancestors before calling any\n  // event handlers, because event handlers can modify the DOM, leading to\n  // inconsistencies with ReactMount's node cache. See #1105.\n\n  var ancestor = targetInst;\n\n  do {\n    if (!ancestor) {\n      var ancestors = bookKeeping.ancestors;\n      ancestors.push(ancestor);\n      break;\n    }\n\n    var root = findRootContainerNode(ancestor);\n\n    if (!root) {\n      break;\n    }\n\n    var tag = ancestor.tag;\n\n    if (tag === HostComponent || tag === HostText) {\n      bookKeeping.ancestors.push(ancestor);\n    }\n\n    ancestor = getClosestInstanceFromNode(root);\n  } while (ancestor);\n\n  for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n    targetInst = bookKeeping.ancestors[i];\n    var eventTarget = getEventTarget(bookKeeping.nativeEvent);\n    var topLevelType = bookKeeping.topLevelType;\n    var nativeEvent = bookKeeping.nativeEvent;\n    var eventSystemFlags = bookKeeping.eventSystemFlags; // If this is the first ancestor, we mark it on the system flags\n\n    if (i === 0) {\n      eventSystemFlags |= IS_FIRST_ANCESTOR;\n    }\n\n    runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, eventSystemFlags);\n  }\n}\n\nfunction dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) {\n  var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags);\n\n  try {\n    // Event queue being processed in the same cycle allows\n    // `preventDefault`.\n    batchedEventUpdates(handleTopLevel, bookKeeping);\n  } finally {\n    releaseTopLevelCallbackBookKeeping(bookKeeping);\n  }\n}\n/**\n * We listen for bubbled touch events on the document object.\n *\n * Firefox v8.01 (and possibly others) exhibited strange behavior when\n * mounting `onmousemove` events at some node that was not the document\n * element. The symptoms were that if your mouse is not moving over something\n * contained within that mount point (for example on the background) the\n * top-level listeners for `onmousemove` won't be called. However, if you\n * register the `mousemove` on the document object, then it will of course\n * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n * top-level listeners to the document object only, at least for these\n * movement types of events and possibly all events.\n *\n * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n *\n * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n * they bubble to document.\n *\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {object} mountAt Container where to mount the listener\n */\n\nfunction legacyListenToEvent(registrationName, mountAt) {\n  var listenerMap = getListenerMapForElement(mountAt);\n  var dependencies = registrationNameDependencies[registrationName];\n\n  for (var i = 0; i < dependencies.length; i++) {\n    var dependency = dependencies[i];\n    legacyListenToTopLevelEvent(dependency, mountAt, listenerMap);\n  }\n}\nfunction legacyListenToTopLevelEvent(topLevelType, mountAt, listenerMap) {\n  if (!listenerMap.has(topLevelType)) {\n    switch (topLevelType) {\n      case TOP_SCROLL:\n        trapCapturedEvent(TOP_SCROLL, mountAt);\n        break;\n\n      case TOP_FOCUS:\n      case TOP_BLUR:\n        trapCapturedEvent(TOP_FOCUS, mountAt);\n        trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function,\n        // but this ensures we mark both as attached rather than just one.\n\n        listenerMap.set(TOP_BLUR, null);\n        listenerMap.set(TOP_FOCUS, null);\n        break;\n\n      case TOP_CANCEL:\n      case TOP_CLOSE:\n        if (isEventSupported(getRawEventName(topLevelType))) {\n          trapCapturedEvent(topLevelType, mountAt);\n        }\n\n        break;\n\n      case TOP_INVALID:\n      case TOP_SUBMIT:\n      case TOP_RESET:\n        // We listen to them on the target DOM elements.\n        // Some of them bubble so we don't want them to fire twice.\n        break;\n\n      default:\n        // By default, listen on the top level to all non-media events.\n        // Media events don't bubble so adding the listener wouldn't do anything.\n        var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1;\n\n        if (!isMediaEvent) {\n          trapBubbledEvent(topLevelType, mountAt);\n        }\n\n        break;\n    }\n\n    listenerMap.set(topLevelType, null);\n  }\n}\nfunction isListeningToAllDependencies(registrationName, mountAt) {\n  var listenerMap = getListenerMapForElement(mountAt);\n  var dependencies = registrationNameDependencies[registrationName];\n\n  for (var i = 0; i < dependencies.length; i++) {\n    var dependency = dependencies[i];\n\n    if (!listenerMap.has(dependency)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvar attemptUserBlockingHydration;\nfunction setAttemptUserBlockingHydration(fn) {\n  attemptUserBlockingHydration = fn;\n}\nvar attemptContinuousHydration;\nfunction setAttemptContinuousHydration(fn) {\n  attemptContinuousHydration = fn;\n}\nvar attemptHydrationAtCurrentPriority;\nfunction setAttemptHydrationAtCurrentPriority(fn) {\n  attemptHydrationAtCurrentPriority = fn;\n} // TODO: Upgrade this definition once we're on a newer version of Flow that\nvar hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.\n\nvar queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.\n// if the last target was dehydrated.\n\nvar queuedFocus = null;\nvar queuedDrag = null;\nvar queuedMouse = null; // For pointer events there can be one latest event per pointerId.\n\nvar queuedPointers = new Map();\nvar queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.\n\nvar queuedExplicitHydrationTargets = [];\nfunction hasQueuedDiscreteEvents() {\n  return queuedDiscreteEvents.length > 0;\n}\nvar discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT];\nvar continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE];\nfunction isReplayableDiscreteEvent(eventType) {\n  return discreteReplayableEvents.indexOf(eventType) > -1;\n}\n\nfunction trapReplayableEventForDocument(topLevelType, document, listenerMap) {\n  legacyListenToTopLevelEvent(topLevelType, document, listenerMap);\n}\n\nfunction eagerlyTrapReplayableEvents(container, document) {\n  var listenerMapForDoc = getListenerMapForElement(document); // Discrete\n\n  discreteReplayableEvents.forEach(function (topLevelType) {\n    trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n  }); // Continuous\n\n  continuousReplayableEvents.forEach(function (topLevelType) {\n    trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n  });\n}\n\nfunction createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  return {\n    blockedOn: blockedOn,\n    topLevelType: topLevelType,\n    eventSystemFlags: eventSystemFlags | IS_REPLAYED,\n    nativeEvent: nativeEvent,\n    container: container\n  };\n}\n\nfunction queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n  queuedDiscreteEvents.push(queuedEvent);\n} // Resets the replaying for this type of continuous event to no event.\n\nfunction clearIfContinuousEvent(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_FOCUS:\n    case TOP_BLUR:\n      queuedFocus = null;\n      break;\n\n    case TOP_DRAG_ENTER:\n    case TOP_DRAG_LEAVE:\n      queuedDrag = null;\n      break;\n\n    case TOP_MOUSE_OVER:\n    case TOP_MOUSE_OUT:\n      queuedMouse = null;\n      break;\n\n    case TOP_POINTER_OVER:\n    case TOP_POINTER_OUT:\n      {\n        var pointerId = nativeEvent.pointerId;\n        queuedPointers.delete(pointerId);\n        break;\n      }\n\n    case TOP_GOT_POINTER_CAPTURE:\n    case TOP_LOST_POINTER_CAPTURE:\n      {\n        var _pointerId = nativeEvent.pointerId;\n        queuedPointerCaptures.delete(_pointerId);\n        break;\n      }\n  }\n}\n\nfunction accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {\n    var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n\n    if (blockedOn !== null) {\n      var _fiber2 = getInstanceFromNode$1(blockedOn);\n\n      if (_fiber2 !== null) {\n        // Attempt to increase the priority of this target.\n        attemptContinuousHydration(_fiber2);\n      }\n    }\n\n    return queuedEvent;\n  } // If we have already queued this exact event, then it's because\n  // the different event systems have different DOM event listeners.\n  // We can accumulate the flags and store a single event to be\n  // replayed.\n\n\n  existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n  return existingQueuedEvent;\n}\n\nfunction queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  // These set relatedTarget to null because the replayed event will be treated as if we\n  // moved from outside the window (no target) onto the target once it hydrates.\n  // Instead of mutating we could clone the event.\n  switch (topLevelType) {\n    case TOP_FOCUS:\n      {\n        var focusEvent = nativeEvent;\n        queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, container, focusEvent);\n        return true;\n      }\n\n    case TOP_DRAG_ENTER:\n      {\n        var dragEvent = nativeEvent;\n        queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, container, dragEvent);\n        return true;\n      }\n\n    case TOP_MOUSE_OVER:\n      {\n        var mouseEvent = nativeEvent;\n        queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, container, mouseEvent);\n        return true;\n      }\n\n    case TOP_POINTER_OVER:\n      {\n        var pointerEvent = nativeEvent;\n        var pointerId = pointerEvent.pointerId;\n        queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, container, pointerEvent));\n        return true;\n      }\n\n    case TOP_GOT_POINTER_CAPTURE:\n      {\n        var _pointerEvent = nativeEvent;\n        var _pointerId2 = _pointerEvent.pointerId;\n        queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, container, _pointerEvent));\n        return true;\n      }\n  }\n\n  return false;\n} // Check if this target is unblocked. Returns true if it's unblocked.\n\nfunction attemptExplicitHydrationTarget(queuedTarget) {\n  // TODO: This function shares a lot of logic with attemptToDispatchEvent.\n  // Try to unify them. It's a bit tricky since it would require two return\n  // values.\n  var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n\n  if (targetInst !== null) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n\n    if (nearestMounted !== null) {\n      var tag = nearestMounted.tag;\n\n      if (tag === SuspenseComponent) {\n        var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n        if (instance !== null) {\n          // We're blocked on hydrating this boundary.\n          // Increase its priority.\n          queuedTarget.blockedOn = instance;\n          Scheduler.unstable_runWithPriority(queuedTarget.priority, function () {\n            attemptHydrationAtCurrentPriority(nearestMounted);\n          });\n          return;\n        }\n      } else if (tag === HostRoot) {\n        var root = nearestMounted.stateNode;\n\n        if (root.hydrate) {\n          queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of\n          // a root other than sync.\n\n          return;\n        }\n      }\n    }\n  }\n\n  queuedTarget.blockedOn = null;\n}\n\nfunction attemptReplayContinuousQueuedEvent(queuedEvent) {\n  if (queuedEvent.blockedOn !== null) {\n    return false;\n  }\n\n  var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.container, queuedEvent.nativeEvent);\n\n  if (nextBlockedOn !== null) {\n    // We're still blocked. Try again later.\n    var _fiber3 = getInstanceFromNode$1(nextBlockedOn);\n\n    if (_fiber3 !== null) {\n      attemptContinuousHydration(_fiber3);\n    }\n\n    queuedEvent.blockedOn = nextBlockedOn;\n    return false;\n  }\n\n  return true;\n}\n\nfunction attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n  if (attemptReplayContinuousQueuedEvent(queuedEvent)) {\n    map.delete(key);\n  }\n}\n\nfunction replayUnblockedEvents() {\n  hasScheduledReplayAttempt = false; // First replay discrete events.\n\n  while (queuedDiscreteEvents.length > 0) {\n    var nextDiscreteEvent = queuedDiscreteEvents[0];\n\n    if (nextDiscreteEvent.blockedOn !== null) {\n      // We're still blocked.\n      // Increase the priority of this boundary to unblock\n      // the next discrete event.\n      var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn);\n\n      if (_fiber4 !== null) {\n        attemptUserBlockingHydration(_fiber4);\n      }\n\n      break;\n    }\n\n    var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.container, nextDiscreteEvent.nativeEvent);\n\n    if (nextBlockedOn !== null) {\n      // We're still blocked. Try again later.\n      nextDiscreteEvent.blockedOn = nextBlockedOn;\n    } else {\n      // We've successfully replayed the first event. Let's try the next one.\n      queuedDiscreteEvents.shift();\n    }\n  } // Next replay any continuous events.\n\n\n  if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {\n    queuedFocus = null;\n  }\n\n  if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {\n    queuedDrag = null;\n  }\n\n  if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {\n    queuedMouse = null;\n  }\n\n  queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n  queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n}\n\nfunction scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n  if (queuedEvent.blockedOn === unblocked) {\n    queuedEvent.blockedOn = null;\n\n    if (!hasScheduledReplayAttempt) {\n      hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are\n      // now unblocked. This first might not actually be unblocked yet.\n      // We could check it early to avoid scheduling an unnecessary callback.\n\n      Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents);\n    }\n  }\n}\n\nfunction retryIfBlockedOn(unblocked) {\n  // Mark anything that was blocked on this as no longer blocked\n  // and eligible for a replay.\n  if (queuedDiscreteEvents.length > 0) {\n    scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's\n    // worth it because we expect very few discrete events to queue up and once\n    // we are actually fully unblocked it will be fast to replay them.\n\n    for (var i = 1; i < queuedDiscreteEvents.length; i++) {\n      var queuedEvent = queuedDiscreteEvents[i];\n\n      if (queuedEvent.blockedOn === unblocked) {\n        queuedEvent.blockedOn = null;\n      }\n    }\n  }\n\n  if (queuedFocus !== null) {\n    scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n  }\n\n  if (queuedDrag !== null) {\n    scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n  }\n\n  if (queuedMouse !== null) {\n    scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n  }\n\n  var unblock = function (queuedEvent) {\n    return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n  };\n\n  queuedPointers.forEach(unblock);\n  queuedPointerCaptures.forEach(unblock);\n\n  for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {\n    var queuedTarget = queuedExplicitHydrationTargets[_i];\n\n    if (queuedTarget.blockedOn === unblocked) {\n      queuedTarget.blockedOn = null;\n    }\n  }\n\n  while (queuedExplicitHydrationTargets.length > 0) {\n    var nextExplicitTarget = queuedExplicitHydrationTargets[0];\n\n    if (nextExplicitTarget.blockedOn !== null) {\n      // We're still blocked.\n      break;\n    } else {\n      attemptExplicitHydrationTarget(nextExplicitTarget);\n\n      if (nextExplicitTarget.blockedOn === null) {\n        // We're unblocked.\n        queuedExplicitHydrationTargets.shift();\n      }\n    }\n  }\n}\n\nfunction addEventBubbleListener(element, eventType, listener) {\n  element.addEventListener(eventType, listener, false);\n}\nfunction addEventCaptureListener(element, eventType, listener) {\n  element.addEventListener(eventType, listener, true);\n}\n\n// do it in two places, which duplicates logic\n// and increases the bundle size, we do it all\n// here once. If we remove or refactor the\n// SimpleEventPlugin, we should also remove or\n// update the below line.\n\nvar simpleEventPluginEventTypes = {};\nvar topLevelEventsToDispatchConfig = new Map();\nvar eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use\n// the code required to apply the same logic for event prioritization and that of the\n// SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code\n// duplication (for which there would be quite a bit). For the events that are not needed\n// for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an\n// array of top level events.\n// Lastly, we ignore prettier so we can keep the formatting sane.\n// prettier-ignore\n\nvar discreteEventPairsForSimpleEventPlugin = [TOP_BLUR, 'blur', TOP_CANCEL, 'cancel', TOP_CLICK, 'click', TOP_CLOSE, 'close', TOP_CONTEXT_MENU, 'contextMenu', TOP_COPY, 'copy', TOP_CUT, 'cut', TOP_AUX_CLICK, 'auxClick', TOP_DOUBLE_CLICK, 'doubleClick', TOP_DRAG_END, 'dragEnd', TOP_DRAG_START, 'dragStart', TOP_DROP, 'drop', TOP_FOCUS, 'focus', TOP_INPUT, 'input', TOP_INVALID, 'invalid', TOP_KEY_DOWN, 'keyDown', TOP_KEY_PRESS, 'keyPress', TOP_KEY_UP, 'keyUp', TOP_MOUSE_DOWN, 'mouseDown', TOP_MOUSE_UP, 'mouseUp', TOP_PASTE, 'paste', TOP_PAUSE, 'pause', TOP_PLAY, 'play', TOP_POINTER_CANCEL, 'pointerCancel', TOP_POINTER_DOWN, 'pointerDown', TOP_POINTER_UP, 'pointerUp', TOP_RATE_CHANGE, 'rateChange', TOP_RESET, 'reset', TOP_SEEKED, 'seeked', TOP_SUBMIT, 'submit', TOP_TOUCH_CANCEL, 'touchCancel', TOP_TOUCH_END, 'touchEnd', TOP_TOUCH_START, 'touchStart', TOP_VOLUME_CHANGE, 'volumeChange'];\nvar otherDiscreteEvents = [TOP_CHANGE, TOP_SELECTION_CHANGE, TOP_TEXT_INPUT, TOP_COMPOSITION_START, TOP_COMPOSITION_END, TOP_COMPOSITION_UPDATE]; // prettier-ignore\n\nvar userBlockingPairsForSimpleEventPlugin = [TOP_DRAG, 'drag', TOP_DRAG_ENTER, 'dragEnter', TOP_DRAG_EXIT, 'dragExit', TOP_DRAG_LEAVE, 'dragLeave', TOP_DRAG_OVER, 'dragOver', TOP_MOUSE_MOVE, 'mouseMove', TOP_MOUSE_OUT, 'mouseOut', TOP_MOUSE_OVER, 'mouseOver', TOP_POINTER_MOVE, 'pointerMove', TOP_POINTER_OUT, 'pointerOut', TOP_POINTER_OVER, 'pointerOver', TOP_SCROLL, 'scroll', TOP_TOGGLE, 'toggle', TOP_TOUCH_MOVE, 'touchMove', TOP_WHEEL, 'wheel']; // prettier-ignore\n\nvar continuousPairsForSimpleEventPlugin = [TOP_ABORT, 'abort', TOP_ANIMATION_END, 'animationEnd', TOP_ANIMATION_ITERATION, 'animationIteration', TOP_ANIMATION_START, 'animationStart', TOP_CAN_PLAY, 'canPlay', TOP_CAN_PLAY_THROUGH, 'canPlayThrough', TOP_DURATION_CHANGE, 'durationChange', TOP_EMPTIED, 'emptied', TOP_ENCRYPTED, 'encrypted', TOP_ENDED, 'ended', TOP_ERROR, 'error', TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', TOP_LOAD, 'load', TOP_LOADED_DATA, 'loadedData', TOP_LOADED_METADATA, 'loadedMetadata', TOP_LOAD_START, 'loadStart', TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', TOP_PLAYING, 'playing', TOP_PROGRESS, 'progress', TOP_SEEKING, 'seeking', TOP_STALLED, 'stalled', TOP_SUSPEND, 'suspend', TOP_TIME_UPDATE, 'timeUpdate', TOP_TRANSITION_END, 'transitionEnd', TOP_WAITING, 'waiting'];\n/**\n * Turns\n * ['abort', ...]\n * into\n * eventTypes = {\n *   'abort': {\n *     phasedRegistrationNames: {\n *       bubbled: 'onAbort',\n *       captured: 'onAbortCapture',\n *     },\n *     dependencies: [TOP_ABORT],\n *   },\n *   ...\n * };\n * topLevelEventsToDispatchConfig = new Map([\n *   [TOP_ABORT, { sameConfig }],\n * ]);\n */\n\nfunction processSimpleEventPluginPairsByPriority(eventTypes, priority) {\n  // As the event types are in pairs of two, we need to iterate\n  // through in twos. The events are in pairs of two to save code\n  // and improve init perf of processing this array, as it will\n  // result in far fewer object allocations and property accesses\n  // if we only use three arrays to process all the categories of\n  // instead of tuples.\n  for (var i = 0; i < eventTypes.length; i += 2) {\n    var topEvent = eventTypes[i];\n    var event = eventTypes[i + 1];\n    var capitalizedEvent = event[0].toUpperCase() + event.slice(1);\n    var onEvent = 'on' + capitalizedEvent;\n    var config = {\n      phasedRegistrationNames: {\n        bubbled: onEvent,\n        captured: onEvent + 'Capture'\n      },\n      dependencies: [topEvent],\n      eventPriority: priority\n    };\n    eventPriorities.set(topEvent, priority);\n    topLevelEventsToDispatchConfig.set(topEvent, config);\n    simpleEventPluginEventTypes[event] = config;\n  }\n}\n\nfunction processTopEventPairsByPriority(eventTypes, priority) {\n  for (var i = 0; i < eventTypes.length; i++) {\n    eventPriorities.set(eventTypes[i], priority);\n  }\n} // SimpleEventPlugin\n\n\nprocessSimpleEventPluginPairsByPriority(discreteEventPairsForSimpleEventPlugin, DiscreteEvent);\nprocessSimpleEventPluginPairsByPriority(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent);\nprocessSimpleEventPluginPairsByPriority(continuousPairsForSimpleEventPlugin, ContinuousEvent); // Not used by SimpleEventPlugin\n\nprocessTopEventPairsByPriority(otherDiscreteEvents, DiscreteEvent);\nfunction getEventPriorityForPluginSystem(topLevelType) {\n  var priority = eventPriorities.get(topLevelType); // Default to a ContinuousEvent. Note: we might\n  // want to warn if we can't detect the priority\n  // for the event.\n\n  return priority === undefined ? ContinuousEvent : priority;\n}\n\n// Intentionally not named imports because Rollup would use dynamic dispatch for\nvar UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n    runWithPriority = Scheduler.unstable_runWithPriority; // TODO: can we stop exporting these?\n\nvar _enabled = true;\nfunction setEnabled(enabled) {\n  _enabled = !!enabled;\n}\nfunction isEnabled() {\n  return _enabled;\n}\nfunction trapBubbledEvent(topLevelType, element) {\n  trapEventForPluginEventSystem(element, topLevelType, false);\n}\nfunction trapCapturedEvent(topLevelType, element) {\n  trapEventForPluginEventSystem(element, topLevelType, true);\n}\n\nfunction trapEventForPluginEventSystem(container, topLevelType, capture) {\n  var listener;\n\n  switch (getEventPriorityForPluginSystem(topLevelType)) {\n    case DiscreteEvent:\n      listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n\n    case UserBlockingEvent:\n      listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n\n    case ContinuousEvent:\n    default:\n      listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n  }\n\n  var rawEventName = getRawEventName(topLevelType);\n\n  if (capture) {\n    addEventCaptureListener(container, rawEventName, listener);\n  } else {\n    addEventBubbleListener(container, rawEventName, listener);\n  }\n}\n\nfunction dispatchDiscreteEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp);\n  discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, container, nativeEvent);\n}\n\nfunction dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, container, nativeEvent) {\n  runWithPriority(UserBlockingPriority, dispatchEvent.bind(null, topLevelType, eventSystemFlags, container, nativeEvent));\n}\n\nfunction dispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  if (!_enabled) {\n    return;\n  }\n\n  if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) {\n    // If we already have a queue of discrete events, and this is another discrete\n    // event, then we can't dispatch it regardless of its target, since they\n    // need to dispatch in order.\n    queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know.\n    topLevelType, eventSystemFlags, container, nativeEvent);\n    return;\n  }\n\n  var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent);\n\n  if (blockedOn === null) {\n    // We successfully dispatched this event.\n    clearIfContinuousEvent(topLevelType, nativeEvent);\n    return;\n  }\n\n  if (isReplayableDiscreteEvent(topLevelType)) {\n    // This this to be replayed later once the target is available.\n    queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n    return;\n  }\n\n  if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent)) {\n    return;\n  } // We need to clear only if we didn't queue because\n  // queueing is accummulative.\n\n\n  clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target,\n  // in case the event system needs to trace it.\n\n  {\n    dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);\n  }\n} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked.\n\nfunction attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  // TODO: Warn if _enabled is false.\n  var nativeEventTarget = getEventTarget(nativeEvent);\n  var targetInst = getClosestInstanceFromNode(nativeEventTarget);\n\n  if (targetInst !== null) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n\n    if (nearestMounted === null) {\n      // This tree has been unmounted already. Dispatch without a target.\n      targetInst = null;\n    } else {\n      var tag = nearestMounted.tag;\n\n      if (tag === SuspenseComponent) {\n        var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n        if (instance !== null) {\n          // Queue the event to be replayed later. Abort dispatching since we\n          // don't want this event dispatched twice through the event system.\n          // TODO: If this is the first discrete event in the queue. Schedule an increased\n          // priority for this boundary.\n          return instance;\n        } // This shouldn't happen, something went wrong but to avoid blocking\n        // the whole system, dispatch the event without a target.\n        // TODO: Warn.\n\n\n        targetInst = null;\n      } else if (tag === HostRoot) {\n        var root = nearestMounted.stateNode;\n\n        if (root.hydrate) {\n          // If this happens during a replay something went wrong and it might block\n          // the whole system.\n          return getContainerFromFiber(nearestMounted);\n        }\n\n        targetInst = null;\n      } else if (nearestMounted !== targetInst) {\n        // If we get an event (ex: img onload) before committing that\n        // component's mount, ignore it for now (that is, treat it as if it was an\n        // event on a non-React tree). We might also consider queueing events and\n        // dispatching them after the mount.\n        targetInst = null;\n      }\n    }\n  }\n\n  {\n    dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);\n  } // We're not blocked on anything.\n\n\n  return null;\n}\n\n// List derived from Gecko source code:\n// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js\nvar shorthandToLonghand = {\n  animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],\n  background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],\n  backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],\n  border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n  borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],\n  borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],\n  borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],\n  borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],\n  borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],\n  borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],\n  borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],\n  borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],\n  borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],\n  borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],\n  borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],\n  borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n  borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],\n  columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],\n  columns: ['columnCount', 'columnWidth'],\n  flex: ['flexBasis', 'flexGrow', 'flexShrink'],\n  flexFlow: ['flexDirection', 'flexWrap'],\n  font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],\n  fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],\n  gap: ['columnGap', 'rowGap'],\n  grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n  gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],\n  gridColumn: ['gridColumnEnd', 'gridColumnStart'],\n  gridColumnGap: ['columnGap'],\n  gridGap: ['columnGap', 'rowGap'],\n  gridRow: ['gridRowEnd', 'gridRowStart'],\n  gridRowGap: ['rowGap'],\n  gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n  listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],\n  margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],\n  marker: ['markerEnd', 'markerMid', 'markerStart'],\n  mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],\n  maskPosition: ['maskPositionX', 'maskPositionY'],\n  outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],\n  overflow: ['overflowX', 'overflowY'],\n  padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],\n  placeContent: ['alignContent', 'justifyContent'],\n  placeItems: ['alignItems', 'justifyItems'],\n  placeSelf: ['alignSelf', 'justifySelf'],\n  textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],\n  textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],\n  transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],\n  wordWrap: ['overflowWrap']\n};\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n  animationIterationCount: true,\n  borderImageOutset: true,\n  borderImageSlice: true,\n  borderImageWidth: true,\n  boxFlex: true,\n  boxFlexGroup: true,\n  boxOrdinalGroup: true,\n  columnCount: true,\n  columns: true,\n  flex: true,\n  flexGrow: true,\n  flexPositive: true,\n  flexShrink: true,\n  flexNegative: true,\n  flexOrder: true,\n  gridArea: true,\n  gridRow: true,\n  gridRowEnd: true,\n  gridRowSpan: true,\n  gridRowStart: true,\n  gridColumn: true,\n  gridColumnEnd: true,\n  gridColumnSpan: true,\n  gridColumnStart: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  tabSize: true,\n  widows: true,\n  zIndex: true,\n  zoom: true,\n  // SVG-related properties\n  fillOpacity: true,\n  floodOpacity: true,\n  stopOpacity: true,\n  strokeDasharray: true,\n  strokeDashoffset: true,\n  strokeMiterlimit: true,\n  strokeOpacity: true,\n  strokeWidth: true\n};\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\n\nfunction prefixKey(prefix, key) {\n  return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\n\n\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\n\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n  prefixes.forEach(function (prefix) {\n    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n  });\n});\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\n\nfunction dangerousStyleValue(name, value, isCustomProperty) {\n  // Note that we've removed escapeTextForBrowser() calls here since the\n  // whole string will be escaped when the attribute is injected into\n  // the markup. If you provide unsafe user data here they can inject\n  // arbitrary CSS which may be problematic (I couldn't repro this):\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n  // This is not an XSS hole but instead a potential CSS injection issue\n  // which has lead to a greater discussion about how we're going to\n  // trust URLs moving forward. See #2115901\n  var isEmpty = value == null || typeof value === 'boolean' || value === '';\n\n  if (isEmpty) {\n    return '';\n  }\n\n  if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {\n    return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n  }\n\n  return ('' + value).trim();\n}\n\nvar uppercasePattern = /([A-Z])/g;\nvar msPattern = /^ms-/;\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n *   > hyphenateStyleName('backgroundColor')\n *   < \"background-color\"\n *   > hyphenateStyleName('MozTransition')\n *   < \"-moz-transition\"\n *   > hyphenateStyleName('msTransition')\n *   < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n */\n\nfunction hyphenateStyleName(name) {\n  return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n}\n\nvar warnValidStyle = function () {};\n\n{\n  // 'msTransform' is correct, but the other prefixes should be capitalized\n  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n  var msPattern$1 = /^-ms-/;\n  var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon\n\n  var badStyleValueWithSemicolonPattern = /;\\s*$/;\n  var warnedStyleNames = {};\n  var warnedStyleValues = {};\n  var warnedForNaNValue = false;\n  var warnedForInfinityValue = false;\n\n  var camelize = function (string) {\n    return string.replace(hyphenPattern, function (_, character) {\n      return character.toUpperCase();\n    });\n  };\n\n  var warnHyphenatedStyleName = function (name) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n\n    error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests\n    // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n    // is converted to lowercase `ms`.\n    camelize(name.replace(msPattern$1, 'ms-')));\n  };\n\n  var warnBadVendoredStyleName = function (name) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n\n    error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));\n  };\n\n  var warnStyleValueWithSemicolon = function (name, value) {\n    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n      return;\n    }\n\n    warnedStyleValues[value] = true;\n\n    error(\"Style property values shouldn't contain a semicolon. \" + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));\n  };\n\n  var warnStyleValueIsNaN = function (name, value) {\n    if (warnedForNaNValue) {\n      return;\n    }\n\n    warnedForNaNValue = true;\n\n    error('`NaN` is an invalid value for the `%s` css style property.', name);\n  };\n\n  var warnStyleValueIsInfinity = function (name, value) {\n    if (warnedForInfinityValue) {\n      return;\n    }\n\n    warnedForInfinityValue = true;\n\n    error('`Infinity` is an invalid value for the `%s` css style property.', name);\n  };\n\n  warnValidStyle = function (name, value) {\n    if (name.indexOf('-') > -1) {\n      warnHyphenatedStyleName(name);\n    } else if (badVendoredStyleNamePattern.test(name)) {\n      warnBadVendoredStyleName(name);\n    } else if (badStyleValueWithSemicolonPattern.test(value)) {\n      warnStyleValueWithSemicolon(name, value);\n    }\n\n    if (typeof value === 'number') {\n      if (isNaN(value)) {\n        warnStyleValueIsNaN(name, value);\n      } else if (!isFinite(value)) {\n        warnStyleValueIsInfinity(name, value);\n      }\n    }\n  };\n}\n\nvar warnValidStyle$1 = warnValidStyle;\n\n/**\n * Operations for dealing with CSS properties.\n */\n\n/**\n * This creates a string that is expected to be equivalent to the style\n * attribute generated by server-side rendering. It by-passes warnings and\n * security checks so it's not safe to use this value for anything other than\n * comparison. It is only used in DEV for SSR validation.\n */\n\nfunction createDangerousStringForStyles(styles) {\n  {\n    var serialized = '';\n    var delimiter = '';\n\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n\n      var styleValue = styles[styleName];\n\n      if (styleValue != null) {\n        var isCustomProperty = styleName.indexOf('--') === 0;\n        serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';\n        serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);\n        delimiter = ';';\n      }\n    }\n\n    return serialized || null;\n  }\n}\n/**\n * Sets the value for multiple styles on a node.  If a value is specified as\n * '' (empty string), the corresponding style property will be unset.\n *\n * @param {DOMElement} node\n * @param {object} styles\n */\n\nfunction setValueForStyles(node, styles) {\n  var style = node.style;\n\n  for (var styleName in styles) {\n    if (!styles.hasOwnProperty(styleName)) {\n      continue;\n    }\n\n    var isCustomProperty = styleName.indexOf('--') === 0;\n\n    {\n      if (!isCustomProperty) {\n        warnValidStyle$1(styleName, styles[styleName]);\n      }\n    }\n\n    var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);\n\n    if (styleName === 'float') {\n      styleName = 'cssFloat';\n    }\n\n    if (isCustomProperty) {\n      style.setProperty(styleName, styleValue);\n    } else {\n      style[styleName] = styleValue;\n    }\n  }\n}\n\nfunction isValueEmpty(value) {\n  return value == null || typeof value === 'boolean' || value === '';\n}\n/**\n * Given {color: 'red', overflow: 'hidden'} returns {\n *   color: 'color',\n *   overflowX: 'overflow',\n *   overflowY: 'overflow',\n * }. This can be read as \"the overflowY property was set by the overflow\n * shorthand\". That is, the values are the property that each was derived from.\n */\n\n\nfunction expandShorthandMap(styles) {\n  var expanded = {};\n\n  for (var key in styles) {\n    var longhands = shorthandToLonghand[key] || [key];\n\n    for (var i = 0; i < longhands.length; i++) {\n      expanded[longhands[i]] = key;\n    }\n  }\n\n  return expanded;\n}\n/**\n * When mixing shorthand and longhand property names, we warn during updates if\n * we expect an incorrect result to occur. In particular, we warn for:\n *\n * Updating a shorthand property (longhand gets overwritten):\n *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}\n *   becomes .style.font = 'baz'\n * Removing a shorthand property (longhand gets lost too):\n *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}\n *   becomes .style.font = ''\n * Removing a longhand property (should revert to shorthand; doesn't):\n *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}\n *   becomes .style.fontVariant = ''\n */\n\n\nfunction validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {\n  {\n\n    if (!nextStyles) {\n      return;\n    }\n\n    var expandedUpdates = expandShorthandMap(styleUpdates);\n    var expandedStyles = expandShorthandMap(nextStyles);\n    var warnedAbout = {};\n\n    for (var key in expandedUpdates) {\n      var originalKey = expandedUpdates[key];\n      var correctOriginalKey = expandedStyles[key];\n\n      if (correctOriginalKey && originalKey !== correctOriginalKey) {\n        var warningKey = originalKey + ',' + correctOriginalKey;\n\n        if (warnedAbout[warningKey]) {\n          continue;\n        }\n\n        warnedAbout[warningKey] = true;\n\n        error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + \"avoid this, don't mix shorthand and non-shorthand properties \" + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);\n      }\n    }\n  }\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nvar omittedCloseTags = {\n  area: true,\n  base: true,\n  br: true,\n  col: true,\n  embed: true,\n  hr: true,\n  img: true,\n  input: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.\n\n};\n\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = _assign({\n  menuitem: true\n}, omittedCloseTags);\n\nvar HTML = '__html';\nvar ReactDebugCurrentFrame$3 = null;\n\n{\n  ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;\n}\n\nfunction assertValidProps(tag, props) {\n  if (!props) {\n    return;\n  } // Note the use of `==` which checks for null or undefined.\n\n\n  if (voidElementTags[tag]) {\n    if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {\n      {\n        throw Error( tag + \" is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n      }\n    }\n  }\n\n  if (props.dangerouslySetInnerHTML != null) {\n    if (!(props.children == null)) {\n      {\n        throw Error( \"Can only set one of `children` or `props.dangerouslySetInnerHTML`.\" );\n      }\n    }\n\n    if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) {\n      {\n        throw Error( \"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\" );\n      }\n    }\n  }\n\n  {\n    if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {\n      error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');\n    }\n  }\n\n  if (!(props.style == null || typeof props.style === 'object')) {\n    {\n      throw Error( \"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n    }\n  }\n}\n\nfunction isCustomComponent(tagName, props) {\n  if (tagName.indexOf('-') === -1) {\n    return typeof props.is === 'string';\n  }\n\n  switch (tagName) {\n    // These are reserved SVG and MathML elements.\n    // We don't mind this whitelist too much because we expect it to never grow.\n    // The alternative is to track the namespace in a few places which is convoluted.\n    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n    case 'annotation-xml':\n    case 'color-profile':\n    case 'font-face':\n    case 'font-face-src':\n    case 'font-face-uri':\n    case 'font-face-format':\n    case 'font-face-name':\n    case 'missing-glyph':\n      return false;\n\n    default:\n      return true;\n  }\n}\n\n// When adding attributes to the HTML or SVG whitelist, be sure to\n// also add them to this module to ensure casing and incorrect name\n// warnings.\nvar possibleStandardNames = {\n  // HTML\n  accept: 'accept',\n  acceptcharset: 'acceptCharset',\n  'accept-charset': 'acceptCharset',\n  accesskey: 'accessKey',\n  action: 'action',\n  allowfullscreen: 'allowFullScreen',\n  alt: 'alt',\n  as: 'as',\n  async: 'async',\n  autocapitalize: 'autoCapitalize',\n  autocomplete: 'autoComplete',\n  autocorrect: 'autoCorrect',\n  autofocus: 'autoFocus',\n  autoplay: 'autoPlay',\n  autosave: 'autoSave',\n  capture: 'capture',\n  cellpadding: 'cellPadding',\n  cellspacing: 'cellSpacing',\n  challenge: 'challenge',\n  charset: 'charSet',\n  checked: 'checked',\n  children: 'children',\n  cite: 'cite',\n  class: 'className',\n  classid: 'classID',\n  classname: 'className',\n  cols: 'cols',\n  colspan: 'colSpan',\n  content: 'content',\n  contenteditable: 'contentEditable',\n  contextmenu: 'contextMenu',\n  controls: 'controls',\n  controlslist: 'controlsList',\n  coords: 'coords',\n  crossorigin: 'crossOrigin',\n  dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',\n  data: 'data',\n  datetime: 'dateTime',\n  default: 'default',\n  defaultchecked: 'defaultChecked',\n  defaultvalue: 'defaultValue',\n  defer: 'defer',\n  dir: 'dir',\n  disabled: 'disabled',\n  disablepictureinpicture: 'disablePictureInPicture',\n  download: 'download',\n  draggable: 'draggable',\n  enctype: 'encType',\n  for: 'htmlFor',\n  form: 'form',\n  formmethod: 'formMethod',\n  formaction: 'formAction',\n  formenctype: 'formEncType',\n  formnovalidate: 'formNoValidate',\n  formtarget: 'formTarget',\n  frameborder: 'frameBorder',\n  headers: 'headers',\n  height: 'height',\n  hidden: 'hidden',\n  high: 'high',\n  href: 'href',\n  hreflang: 'hrefLang',\n  htmlfor: 'htmlFor',\n  httpequiv: 'httpEquiv',\n  'http-equiv': 'httpEquiv',\n  icon: 'icon',\n  id: 'id',\n  innerhtml: 'innerHTML',\n  inputmode: 'inputMode',\n  integrity: 'integrity',\n  is: 'is',\n  itemid: 'itemID',\n  itemprop: 'itemProp',\n  itemref: 'itemRef',\n  itemscope: 'itemScope',\n  itemtype: 'itemType',\n  keyparams: 'keyParams',\n  keytype: 'keyType',\n  kind: 'kind',\n  label: 'label',\n  lang: 'lang',\n  list: 'list',\n  loop: 'loop',\n  low: 'low',\n  manifest: 'manifest',\n  marginwidth: 'marginWidth',\n  marginheight: 'marginHeight',\n  max: 'max',\n  maxlength: 'maxLength',\n  media: 'media',\n  mediagroup: 'mediaGroup',\n  method: 'method',\n  min: 'min',\n  minlength: 'minLength',\n  multiple: 'multiple',\n  muted: 'muted',\n  name: 'name',\n  nomodule: 'noModule',\n  nonce: 'nonce',\n  novalidate: 'noValidate',\n  open: 'open',\n  optimum: 'optimum',\n  pattern: 'pattern',\n  placeholder: 'placeholder',\n  playsinline: 'playsInline',\n  poster: 'poster',\n  preload: 'preload',\n  profile: 'profile',\n  radiogroup: 'radioGroup',\n  readonly: 'readOnly',\n  referrerpolicy: 'referrerPolicy',\n  rel: 'rel',\n  required: 'required',\n  reversed: 'reversed',\n  role: 'role',\n  rows: 'rows',\n  rowspan: 'rowSpan',\n  sandbox: 'sandbox',\n  scope: 'scope',\n  scoped: 'scoped',\n  scrolling: 'scrolling',\n  seamless: 'seamless',\n  selected: 'selected',\n  shape: 'shape',\n  size: 'size',\n  sizes: 'sizes',\n  span: 'span',\n  spellcheck: 'spellCheck',\n  src: 'src',\n  srcdoc: 'srcDoc',\n  srclang: 'srcLang',\n  srcset: 'srcSet',\n  start: 'start',\n  step: 'step',\n  style: 'style',\n  summary: 'summary',\n  tabindex: 'tabIndex',\n  target: 'target',\n  title: 'title',\n  type: 'type',\n  usemap: 'useMap',\n  value: 'value',\n  width: 'width',\n  wmode: 'wmode',\n  wrap: 'wrap',\n  // SVG\n  about: 'about',\n  accentheight: 'accentHeight',\n  'accent-height': 'accentHeight',\n  accumulate: 'accumulate',\n  additive: 'additive',\n  alignmentbaseline: 'alignmentBaseline',\n  'alignment-baseline': 'alignmentBaseline',\n  allowreorder: 'allowReorder',\n  alphabetic: 'alphabetic',\n  amplitude: 'amplitude',\n  arabicform: 'arabicForm',\n  'arabic-form': 'arabicForm',\n  ascent: 'ascent',\n  attributename: 'attributeName',\n  attributetype: 'attributeType',\n  autoreverse: 'autoReverse',\n  azimuth: 'azimuth',\n  basefrequency: 'baseFrequency',\n  baselineshift: 'baselineShift',\n  'baseline-shift': 'baselineShift',\n  baseprofile: 'baseProfile',\n  bbox: 'bbox',\n  begin: 'begin',\n  bias: 'bias',\n  by: 'by',\n  calcmode: 'calcMode',\n  capheight: 'capHeight',\n  'cap-height': 'capHeight',\n  clip: 'clip',\n  clippath: 'clipPath',\n  'clip-path': 'clipPath',\n  clippathunits: 'clipPathUnits',\n  cliprule: 'clipRule',\n  'clip-rule': 'clipRule',\n  color: 'color',\n  colorinterpolation: 'colorInterpolation',\n  'color-interpolation': 'colorInterpolation',\n  colorinterpolationfilters: 'colorInterpolationFilters',\n  'color-interpolation-filters': 'colorInterpolationFilters',\n  colorprofile: 'colorProfile',\n  'color-profile': 'colorProfile',\n  colorrendering: 'colorRendering',\n  'color-rendering': 'colorRendering',\n  contentscripttype: 'contentScriptType',\n  contentstyletype: 'contentStyleType',\n  cursor: 'cursor',\n  cx: 'cx',\n  cy: 'cy',\n  d: 'd',\n  datatype: 'datatype',\n  decelerate: 'decelerate',\n  descent: 'descent',\n  diffuseconstant: 'diffuseConstant',\n  direction: 'direction',\n  display: 'display',\n  divisor: 'divisor',\n  dominantbaseline: 'dominantBaseline',\n  'dominant-baseline': 'dominantBaseline',\n  dur: 'dur',\n  dx: 'dx',\n  dy: 'dy',\n  edgemode: 'edgeMode',\n  elevation: 'elevation',\n  enablebackground: 'enableBackground',\n  'enable-background': 'enableBackground',\n  end: 'end',\n  exponent: 'exponent',\n  externalresourcesrequired: 'externalResourcesRequired',\n  fill: 'fill',\n  fillopacity: 'fillOpacity',\n  'fill-opacity': 'fillOpacity',\n  fillrule: 'fillRule',\n  'fill-rule': 'fillRule',\n  filter: 'filter',\n  filterres: 'filterRes',\n  filterunits: 'filterUnits',\n  floodopacity: 'floodOpacity',\n  'flood-opacity': 'floodOpacity',\n  floodcolor: 'floodColor',\n  'flood-color': 'floodColor',\n  focusable: 'focusable',\n  fontfamily: 'fontFamily',\n  'font-family': 'fontFamily',\n  fontsize: 'fontSize',\n  'font-size': 'fontSize',\n  fontsizeadjust: 'fontSizeAdjust',\n  'font-size-adjust': 'fontSizeAdjust',\n  fontstretch: 'fontStretch',\n  'font-stretch': 'fontStretch',\n  fontstyle: 'fontStyle',\n  'font-style': 'fontStyle',\n  fontvariant: 'fontVariant',\n  'font-variant': 'fontVariant',\n  fontweight: 'fontWeight',\n  'font-weight': 'fontWeight',\n  format: 'format',\n  from: 'from',\n  fx: 'fx',\n  fy: 'fy',\n  g1: 'g1',\n  g2: 'g2',\n  glyphname: 'glyphName',\n  'glyph-name': 'glyphName',\n  glyphorientationhorizontal: 'glyphOrientationHorizontal',\n  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n  glyphorientationvertical: 'glyphOrientationVertical',\n  'glyph-orientation-vertical': 'glyphOrientationVertical',\n  glyphref: 'glyphRef',\n  gradienttransform: 'gradientTransform',\n  gradientunits: 'gradientUnits',\n  hanging: 'hanging',\n  horizadvx: 'horizAdvX',\n  'horiz-adv-x': 'horizAdvX',\n  horizoriginx: 'horizOriginX',\n  'horiz-origin-x': 'horizOriginX',\n  ideographic: 'ideographic',\n  imagerendering: 'imageRendering',\n  'image-rendering': 'imageRendering',\n  in2: 'in2',\n  in: 'in',\n  inlist: 'inlist',\n  intercept: 'intercept',\n  k1: 'k1',\n  k2: 'k2',\n  k3: 'k3',\n  k4: 'k4',\n  k: 'k',\n  kernelmatrix: 'kernelMatrix',\n  kernelunitlength: 'kernelUnitLength',\n  kerning: 'kerning',\n  keypoints: 'keyPoints',\n  keysplines: 'keySplines',\n  keytimes: 'keyTimes',\n  lengthadjust: 'lengthAdjust',\n  letterspacing: 'letterSpacing',\n  'letter-spacing': 'letterSpacing',\n  lightingcolor: 'lightingColor',\n  'lighting-color': 'lightingColor',\n  limitingconeangle: 'limitingConeAngle',\n  local: 'local',\n  markerend: 'markerEnd',\n  'marker-end': 'markerEnd',\n  markerheight: 'markerHeight',\n  markermid: 'markerMid',\n  'marker-mid': 'markerMid',\n  markerstart: 'markerStart',\n  'marker-start': 'markerStart',\n  markerunits: 'markerUnits',\n  markerwidth: 'markerWidth',\n  mask: 'mask',\n  maskcontentunits: 'maskContentUnits',\n  maskunits: 'maskUnits',\n  mathematical: 'mathematical',\n  mode: 'mode',\n  numoctaves: 'numOctaves',\n  offset: 'offset',\n  opacity: 'opacity',\n  operator: 'operator',\n  order: 'order',\n  orient: 'orient',\n  orientation: 'orientation',\n  origin: 'origin',\n  overflow: 'overflow',\n  overlineposition: 'overlinePosition',\n  'overline-position': 'overlinePosition',\n  overlinethickness: 'overlineThickness',\n  'overline-thickness': 'overlineThickness',\n  paintorder: 'paintOrder',\n  'paint-order': 'paintOrder',\n  panose1: 'panose1',\n  'panose-1': 'panose1',\n  pathlength: 'pathLength',\n  patterncontentunits: 'patternContentUnits',\n  patterntransform: 'patternTransform',\n  patternunits: 'patternUnits',\n  pointerevents: 'pointerEvents',\n  'pointer-events': 'pointerEvents',\n  points: 'points',\n  pointsatx: 'pointsAtX',\n  pointsaty: 'pointsAtY',\n  pointsatz: 'pointsAtZ',\n  prefix: 'prefix',\n  preservealpha: 'preserveAlpha',\n  preserveaspectratio: 'preserveAspectRatio',\n  primitiveunits: 'primitiveUnits',\n  property: 'property',\n  r: 'r',\n  radius: 'radius',\n  refx: 'refX',\n  refy: 'refY',\n  renderingintent: 'renderingIntent',\n  'rendering-intent': 'renderingIntent',\n  repeatcount: 'repeatCount',\n  repeatdur: 'repeatDur',\n  requiredextensions: 'requiredExtensions',\n  requiredfeatures: 'requiredFeatures',\n  resource: 'resource',\n  restart: 'restart',\n  result: 'result',\n  results: 'results',\n  rotate: 'rotate',\n  rx: 'rx',\n  ry: 'ry',\n  scale: 'scale',\n  security: 'security',\n  seed: 'seed',\n  shaperendering: 'shapeRendering',\n  'shape-rendering': 'shapeRendering',\n  slope: 'slope',\n  spacing: 'spacing',\n  specularconstant: 'specularConstant',\n  specularexponent: 'specularExponent',\n  speed: 'speed',\n  spreadmethod: 'spreadMethod',\n  startoffset: 'startOffset',\n  stddeviation: 'stdDeviation',\n  stemh: 'stemh',\n  stemv: 'stemv',\n  stitchtiles: 'stitchTiles',\n  stopcolor: 'stopColor',\n  'stop-color': 'stopColor',\n  stopopacity: 'stopOpacity',\n  'stop-opacity': 'stopOpacity',\n  strikethroughposition: 'strikethroughPosition',\n  'strikethrough-position': 'strikethroughPosition',\n  strikethroughthickness: 'strikethroughThickness',\n  'strikethrough-thickness': 'strikethroughThickness',\n  string: 'string',\n  stroke: 'stroke',\n  strokedasharray: 'strokeDasharray',\n  'stroke-dasharray': 'strokeDasharray',\n  strokedashoffset: 'strokeDashoffset',\n  'stroke-dashoffset': 'strokeDashoffset',\n  strokelinecap: 'strokeLinecap',\n  'stroke-linecap': 'strokeLinecap',\n  strokelinejoin: 'strokeLinejoin',\n  'stroke-linejoin': 'strokeLinejoin',\n  strokemiterlimit: 'strokeMiterlimit',\n  'stroke-miterlimit': 'strokeMiterlimit',\n  strokewidth: 'strokeWidth',\n  'stroke-width': 'strokeWidth',\n  strokeopacity: 'strokeOpacity',\n  'stroke-opacity': 'strokeOpacity',\n  suppresscontenteditablewarning: 'suppressContentEditableWarning',\n  suppresshydrationwarning: 'suppressHydrationWarning',\n  surfacescale: 'surfaceScale',\n  systemlanguage: 'systemLanguage',\n  tablevalues: 'tableValues',\n  targetx: 'targetX',\n  targety: 'targetY',\n  textanchor: 'textAnchor',\n  'text-anchor': 'textAnchor',\n  textdecoration: 'textDecoration',\n  'text-decoration': 'textDecoration',\n  textlength: 'textLength',\n  textrendering: 'textRendering',\n  'text-rendering': 'textRendering',\n  to: 'to',\n  transform: 'transform',\n  typeof: 'typeof',\n  u1: 'u1',\n  u2: 'u2',\n  underlineposition: 'underlinePosition',\n  'underline-position': 'underlinePosition',\n  underlinethickness: 'underlineThickness',\n  'underline-thickness': 'underlineThickness',\n  unicode: 'unicode',\n  unicodebidi: 'unicodeBidi',\n  'unicode-bidi': 'unicodeBidi',\n  unicoderange: 'unicodeRange',\n  'unicode-range': 'unicodeRange',\n  unitsperem: 'unitsPerEm',\n  'units-per-em': 'unitsPerEm',\n  unselectable: 'unselectable',\n  valphabetic: 'vAlphabetic',\n  'v-alphabetic': 'vAlphabetic',\n  values: 'values',\n  vectoreffect: 'vectorEffect',\n  'vector-effect': 'vectorEffect',\n  version: 'version',\n  vertadvy: 'vertAdvY',\n  'vert-adv-y': 'vertAdvY',\n  vertoriginx: 'vertOriginX',\n  'vert-origin-x': 'vertOriginX',\n  vertoriginy: 'vertOriginY',\n  'vert-origin-y': 'vertOriginY',\n  vhanging: 'vHanging',\n  'v-hanging': 'vHanging',\n  videographic: 'vIdeographic',\n  'v-ideographic': 'vIdeographic',\n  viewbox: 'viewBox',\n  viewtarget: 'viewTarget',\n  visibility: 'visibility',\n  vmathematical: 'vMathematical',\n  'v-mathematical': 'vMathematical',\n  vocab: 'vocab',\n  widths: 'widths',\n  wordspacing: 'wordSpacing',\n  'word-spacing': 'wordSpacing',\n  writingmode: 'writingMode',\n  'writing-mode': 'writingMode',\n  x1: 'x1',\n  x2: 'x2',\n  x: 'x',\n  xchannelselector: 'xChannelSelector',\n  xheight: 'xHeight',\n  'x-height': 'xHeight',\n  xlinkactuate: 'xlinkActuate',\n  'xlink:actuate': 'xlinkActuate',\n  xlinkarcrole: 'xlinkArcrole',\n  'xlink:arcrole': 'xlinkArcrole',\n  xlinkhref: 'xlinkHref',\n  'xlink:href': 'xlinkHref',\n  xlinkrole: 'xlinkRole',\n  'xlink:role': 'xlinkRole',\n  xlinkshow: 'xlinkShow',\n  'xlink:show': 'xlinkShow',\n  xlinktitle: 'xlinkTitle',\n  'xlink:title': 'xlinkTitle',\n  xlinktype: 'xlinkType',\n  'xlink:type': 'xlinkType',\n  xmlbase: 'xmlBase',\n  'xml:base': 'xmlBase',\n  xmllang: 'xmlLang',\n  'xml:lang': 'xmlLang',\n  xmlns: 'xmlns',\n  'xml:space': 'xmlSpace',\n  xmlnsxlink: 'xmlnsXlink',\n  'xmlns:xlink': 'xmlnsXlink',\n  xmlspace: 'xmlSpace',\n  y1: 'y1',\n  y2: 'y2',\n  y: 'y',\n  ychannelselector: 'yChannelSelector',\n  z: 'z',\n  zoomandpan: 'zoomAndPan'\n};\n\nvar ariaProperties = {\n  'aria-current': 0,\n  // state\n  'aria-details': 0,\n  'aria-disabled': 0,\n  // state\n  'aria-hidden': 0,\n  // state\n  'aria-invalid': 0,\n  // state\n  'aria-keyshortcuts': 0,\n  'aria-label': 0,\n  'aria-roledescription': 0,\n  // Widget Attributes\n  'aria-autocomplete': 0,\n  'aria-checked': 0,\n  'aria-expanded': 0,\n  'aria-haspopup': 0,\n  'aria-level': 0,\n  'aria-modal': 0,\n  'aria-multiline': 0,\n  'aria-multiselectable': 0,\n  'aria-orientation': 0,\n  'aria-placeholder': 0,\n  'aria-pressed': 0,\n  'aria-readonly': 0,\n  'aria-required': 0,\n  'aria-selected': 0,\n  'aria-sort': 0,\n  'aria-valuemax': 0,\n  'aria-valuemin': 0,\n  'aria-valuenow': 0,\n  'aria-valuetext': 0,\n  // Live Region Attributes\n  'aria-atomic': 0,\n  'aria-busy': 0,\n  'aria-live': 0,\n  'aria-relevant': 0,\n  // Drag-and-Drop Attributes\n  'aria-dropeffect': 0,\n  'aria-grabbed': 0,\n  // Relationship Attributes\n  'aria-activedescendant': 0,\n  'aria-colcount': 0,\n  'aria-colindex': 0,\n  'aria-colspan': 0,\n  'aria-controls': 0,\n  'aria-describedby': 0,\n  'aria-errormessage': 0,\n  'aria-flowto': 0,\n  'aria-labelledby': 0,\n  'aria-owns': 0,\n  'aria-posinset': 0,\n  'aria-rowcount': 0,\n  'aria-rowindex': 0,\n  'aria-rowspan': 0,\n  'aria-setsize': 0\n};\n\nvar warnedProperties = {};\nvar rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\nfunction validateProperty(tagName, name) {\n  {\n    if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {\n      return true;\n    }\n\n    if (rARIACamel.test(name)) {\n      var ariaName = 'aria-' + name.slice(4).toLowerCase();\n      var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n      // DOM properties, then it is an invalid aria-* attribute.\n\n      if (correctName == null) {\n        error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);\n\n        warnedProperties[name] = true;\n        return true;\n      } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n      if (name !== correctName) {\n        error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);\n\n        warnedProperties[name] = true;\n        return true;\n      }\n    }\n\n    if (rARIA.test(name)) {\n      var lowerCasedName = name.toLowerCase();\n      var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n      // DOM properties, then it is an invalid aria-* attribute.\n\n      if (standardName == null) {\n        warnedProperties[name] = true;\n        return false;\n      } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n      if (name !== standardName) {\n        error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);\n\n        warnedProperties[name] = true;\n        return true;\n      }\n    }\n  }\n\n  return true;\n}\n\nfunction warnInvalidARIAProps(type, props) {\n  {\n    var invalidProps = [];\n\n    for (var key in props) {\n      var isValid = validateProperty(type, key);\n\n      if (!isValid) {\n        invalidProps.push(key);\n      }\n    }\n\n    var unknownPropString = invalidProps.map(function (prop) {\n      return '`' + prop + '`';\n    }).join(', ');\n\n    if (invalidProps.length === 1) {\n      error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n    } else if (invalidProps.length > 1) {\n      error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n    }\n  }\n}\n\nfunction validateProperties(type, props) {\n  if (isCustomComponent(type, props)) {\n    return;\n  }\n\n  warnInvalidARIAProps(type, props);\n}\n\nvar didWarnValueNull = false;\nfunction validateProperties$1(type, props) {\n  {\n    if (type !== 'input' && type !== 'textarea' && type !== 'select') {\n      return;\n    }\n\n    if (props != null && props.value === null && !didWarnValueNull) {\n      didWarnValueNull = true;\n\n      if (type === 'select' && props.multiple) {\n        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);\n      } else {\n        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);\n      }\n    }\n  }\n}\n\nvar validateProperty$1 = function () {};\n\n{\n  var warnedProperties$1 = {};\n  var _hasOwnProperty = Object.prototype.hasOwnProperty;\n  var EVENT_NAME_REGEX = /^on./;\n  var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;\n  var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\n  var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n\n  validateProperty$1 = function (tagName, name, value, canUseEventSystem) {\n    if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {\n      return true;\n    }\n\n    var lowerCasedName = name.toLowerCase();\n\n    if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {\n      error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // We can't rely on the event system being injected on the server.\n\n\n    if (canUseEventSystem) {\n      if (registrationNameModules.hasOwnProperty(name)) {\n        return true;\n      }\n\n      var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;\n\n      if (registrationName != null) {\n        error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (EVENT_NAME_REGEX.test(name)) {\n        error('Unknown event handler property `%s`. It will be ignored.', name);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n    } else if (EVENT_NAME_REGEX.test(name)) {\n      // If no event plugins have been injected, we are in a server environment.\n      // So we can't tell if the event name is correct for sure, but we can filter\n      // out known bad ones like `onclick`. We can't suggest a specific replacement though.\n      if (INVALID_EVENT_NAME_REGEX.test(name)) {\n        error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);\n      }\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // Let the ARIA attribute hook validate ARIA attributes\n\n\n    if (rARIA$1.test(name) || rARIACamel$1.test(name)) {\n      return true;\n    }\n\n    if (lowerCasedName === 'innerhtml') {\n      error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (lowerCasedName === 'aria') {\n      error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {\n      error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (typeof value === 'number' && isNaN(value)) {\n      error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    var propertyInfo = getPropertyInfo(name);\n    var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.\n\n    if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n      var standardName = possibleStandardNames[lowerCasedName];\n\n      if (standardName !== name) {\n        error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n    } else if (!isReserved && name !== lowerCasedName) {\n      // Unknown attributes should have lowercase casing since that's how they\n      // will be cased anyway with server rendering.\n      error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n      if (value) {\n        error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.', value, name, name, value, name);\n      } else {\n        error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);\n      }\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // Now that we've validated casing, do not validate\n    // data types for reserved props\n\n\n    if (isReserved) {\n      return true;\n    } // Warn when a known attribute is a bad type\n\n\n    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n      warnedProperties$1[name] = true;\n      return false;\n    } // Warn when passing the strings 'false' or 'true' into a boolean prop\n\n\n    if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {\n      error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string \"false\".', name, value);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    return true;\n  };\n}\n\nvar warnUnknownProperties = function (type, props, canUseEventSystem) {\n  {\n    var unknownProps = [];\n\n    for (var key in props) {\n      var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);\n\n      if (!isValid) {\n        unknownProps.push(key);\n      }\n    }\n\n    var unknownPropString = unknownProps.map(function (prop) {\n      return '`' + prop + '`';\n    }).join(', ');\n\n    if (unknownProps.length === 1) {\n      error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n    } else if (unknownProps.length > 1) {\n      error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n    }\n  }\n};\n\nfunction validateProperties$2(type, props, canUseEventSystem) {\n  if (isCustomComponent(type, props)) {\n    return;\n  }\n\n  warnUnknownProperties(type, props, canUseEventSystem);\n}\n\nvar didWarnInvalidHydration = false;\nvar DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';\nvar SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';\nvar SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';\nvar AUTOFOCUS = 'autoFocus';\nvar CHILDREN = 'children';\nvar STYLE = 'style';\nvar HTML$1 = '__html';\nvar HTML_NAMESPACE$1 = Namespaces.html;\nvar warnedUnknownTags;\nvar suppressHydrationWarning;\nvar validatePropertiesInDevelopment;\nvar warnForTextDifference;\nvar warnForPropDifference;\nvar warnForExtraAttributes;\nvar warnForInvalidEventListener;\nvar canDiffStyleForHydrationWarning;\nvar normalizeMarkupForTextOrAttribute;\nvar normalizeHTML;\n\n{\n  warnedUnknownTags = {\n    // Chrome is the only major browser not shipping <time>. But as of July\n    // 2017 it intends to ship it due to widespread usage. We intentionally\n    // *don't* warn for <time> even if it's unrecognized by Chrome because\n    // it soon will be, and many apps have been using it anyway.\n    time: true,\n    // There are working polyfills for <dialog>. Let people use it.\n    dialog: true,\n    // Electron ships a custom <webview> tag to display external web content in\n    // an isolated frame and process.\n    // This tag is not present in non Electron environments such as JSDom which\n    // is often used for testing purposes.\n    // @see https://electronjs.org/docs/api/webview-tag\n    webview: true\n  };\n\n  validatePropertiesInDevelopment = function (type, props) {\n    validateProperties(type, props);\n    validateProperties$1(type, props);\n    validateProperties$2(type, props,\n    /* canUseEventSystem */\n    true);\n  }; // IE 11 parses & normalizes the style attribute as opposed to other\n  // browsers. It adds spaces and sorts the properties in some\n  // non-alphabetical order. Handling that would require sorting CSS\n  // properties in the client & server versions or applying\n  // `expectedStyle` to a temporary DOM node to read its `style` attribute\n  // normalized. Since it only affects IE, we're skipping style warnings\n  // in that browser completely in favor of doing all that work.\n  // See https://github.com/facebook/react/issues/11807\n\n\n  canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF.\n  // It also can turn \\u0000 into \\uFFFD inside attributes.\n  // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream\n  // If we have a mismatch, it might be caused by that.\n  // We will still patch up in this case but not fire the warning.\n\n  var NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g;\n  var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\n\n  normalizeMarkupForTextOrAttribute = function (markup) {\n    var markupString = typeof markup === 'string' ? markup : '' + markup;\n    return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');\n  };\n\n  warnForTextDifference = function (serverText, clientText) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);\n    var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);\n\n    if (normalizedServerText === normalizedClientText) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Text content did not match. Server: \"%s\" Client: \"%s\"', normalizedServerText, normalizedClientText);\n  };\n\n  warnForPropDifference = function (propName, serverValue, clientValue) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);\n    var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);\n\n    if (normalizedServerValue === normalizedClientValue) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));\n  };\n\n  warnForExtraAttributes = function (attributeNames) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n    var names = [];\n    attributeNames.forEach(function (name) {\n      names.push(name);\n    });\n\n    error('Extra attributes from the server: %s', names);\n  };\n\n  warnForInvalidEventListener = function (registrationName, listener) {\n    if (listener === false) {\n      error('Expected `%s` listener to be a function, instead got `false`.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);\n    } else {\n      error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);\n    }\n  }; // Parse the HTML and read it back to normalize the HTML string so that it\n  // can be used for comparison.\n\n\n  normalizeHTML = function (parent, html) {\n    // We could have created a separate document here to avoid\n    // re-initializing custom elements if they exist. But this breaks\n    // how <noscript> is being handled. So we use the same document.\n    // See the discussion in https://github.com/facebook/react/pull/11157.\n    var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);\n    testElement.innerHTML = html;\n    return testElement.innerHTML;\n  };\n}\n\nfunction ensureListeningTo(rootContainerElement, registrationName) {\n  var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;\n  var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;\n  legacyListenToEvent(registrationName, doc);\n}\n\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n  return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;\n}\n\nfunction noop() {}\n\nfunction trapClickOnNonInteractiveElement(node) {\n  // Mobile Safari does not fire properly bubble click events on\n  // non-interactive elements, which means delegated click listeners do not\n  // fire. The workaround for this bug involves attaching an empty click\n  // listener on the target node.\n  // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n  // Just set it using the onclick property so that we don't have to manage any\n  // bookkeeping for it. Not sure if we need to clear it when the listener is\n  // removed.\n  // TODO: Only do this for the relevant Safaris maybe?\n  node.onclick = noop;\n}\n\nfunction setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {\n  for (var propKey in nextProps) {\n    if (!nextProps.hasOwnProperty(propKey)) {\n      continue;\n    }\n\n    var nextProp = nextProps[propKey];\n\n    if (propKey === STYLE) {\n      {\n        if (nextProp) {\n          // Freeze the next style object so that we can assume it won't be\n          // mutated. We have already warned for this in the past.\n          Object.freeze(nextProp);\n        }\n      } // Relies on `updateStylesByID` not mutating `styleUpdates`.\n\n\n      setValueForStyles(domElement, nextProp);\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n\n      if (nextHtml != null) {\n        setInnerHTML(domElement, nextHtml);\n      }\n    } else if (propKey === CHILDREN) {\n      if (typeof nextProp === 'string') {\n        // Avoid setting initial textContent when the text is empty. In IE11 setting\n        // textContent on a <textarea> will cause the placeholder to not\n        // show within the <textarea> until it has been focused and blurred again.\n        // https://github.com/facebook/react/issues/6731#issuecomment-254874553\n        var canSetTextContent = tag !== 'textarea' || nextProp !== '';\n\n        if (canSetTextContent) {\n          setTextContent(domElement, nextProp);\n        }\n      } else if (typeof nextProp === 'number') {\n        setTextContent(domElement, '' + nextProp);\n      }\n    } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n    } else if (nextProp != null) {\n      setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);\n    }\n  }\n}\n\nfunction updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {\n  // TODO: Handle wasCustomComponentTag\n  for (var i = 0; i < updatePayload.length; i += 2) {\n    var propKey = updatePayload[i];\n    var propValue = updatePayload[i + 1];\n\n    if (propKey === STYLE) {\n      setValueForStyles(domElement, propValue);\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      setInnerHTML(domElement, propValue);\n    } else if (propKey === CHILDREN) {\n      setTextContent(domElement, propValue);\n    } else {\n      setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);\n    }\n  }\n}\n\nfunction createElement(type, props, rootContainerElement, parentNamespace) {\n  var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML\n  // tags get no namespace.\n\n  var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);\n  var domElement;\n  var namespaceURI = parentNamespace;\n\n  if (namespaceURI === HTML_NAMESPACE$1) {\n    namespaceURI = getIntrinsicNamespace(type);\n  }\n\n  if (namespaceURI === HTML_NAMESPACE$1) {\n    {\n      isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to\n      // allow <SVG> or <mATH>.\n\n      if (!isCustomComponentTag && type !== type.toLowerCase()) {\n        error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);\n      }\n    }\n\n    if (type === 'script') {\n      // Create the script via .innerHTML so its \"parser-inserted\" flag is\n      // set to true and it does not execute\n      var div = ownerDocument.createElement('div');\n\n      div.innerHTML = '<script><' + '/script>'; // eslint-disable-line\n      // This is guaranteed to yield a script element.\n\n      var firstChild = div.firstChild;\n      domElement = div.removeChild(firstChild);\n    } else if (typeof props.is === 'string') {\n      // $FlowIssue `createElement` should be updated for Web Components\n      domElement = ownerDocument.createElement(type, {\n        is: props.is\n      });\n    } else {\n      // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.\n      // See discussion in https://github.com/facebook/react/pull/6896\n      // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240\n      domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`\n      // attributes on `select`s needs to be added before `option`s are inserted.\n      // This prevents:\n      // - a bug where the `select` does not scroll to the correct option because singular\n      //  `select` elements automatically pick the first item #13222\n      // - a bug where the `select` set the first item as selected despite the `size` attribute #14239\n      // See https://github.com/facebook/react/issues/13222\n      // and https://github.com/facebook/react/issues/14239\n\n      if (type === 'select') {\n        var node = domElement;\n\n        if (props.multiple) {\n          node.multiple = true;\n        } else if (props.size) {\n          // Setting a size greater than 1 causes a select to behave like `multiple=true`, where\n          // it is possible that no option is selected.\n          //\n          // This is only necessary when a select in \"single selection mode\".\n          node.size = props.size;\n        }\n      }\n    }\n  } else {\n    domElement = ownerDocument.createElementNS(namespaceURI, type);\n  }\n\n  {\n    if (namespaceURI === HTML_NAMESPACE$1) {\n      if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {\n        warnedUnknownTags[type] = true;\n\n        error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);\n      }\n    }\n  }\n\n  return domElement;\n}\nfunction createTextNode(text, rootContainerElement) {\n  return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);\n}\nfunction setInitialProperties(domElement, tag, rawProps, rootContainerElement) {\n  var isCustomComponentTag = isCustomComponent(tag, rawProps);\n\n  {\n    validatePropertiesInDevelopment(tag, rawProps);\n  } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n  var props;\n\n  switch (tag) {\n    case 'iframe':\n    case 'object':\n    case 'embed':\n      trapBubbledEvent(TOP_LOAD, domElement);\n      props = rawProps;\n      break;\n\n    case 'video':\n    case 'audio':\n      // Create listener for each media event\n      for (var i = 0; i < mediaEventTypes.length; i++) {\n        trapBubbledEvent(mediaEventTypes[i], domElement);\n      }\n\n      props = rawProps;\n      break;\n\n    case 'source':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      props = rawProps;\n      break;\n\n    case 'img':\n    case 'image':\n    case 'link':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      trapBubbledEvent(TOP_LOAD, domElement);\n      props = rawProps;\n      break;\n\n    case 'form':\n      trapBubbledEvent(TOP_RESET, domElement);\n      trapBubbledEvent(TOP_SUBMIT, domElement);\n      props = rawProps;\n      break;\n\n    case 'details':\n      trapBubbledEvent(TOP_TOGGLE, domElement);\n      props = rawProps;\n      break;\n\n    case 'input':\n      initWrapperState(domElement, rawProps);\n      props = getHostProps(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'option':\n      validateProps(domElement, rawProps);\n      props = getHostProps$1(domElement, rawProps);\n      break;\n\n    case 'select':\n      initWrapperState$1(domElement, rawProps);\n      props = getHostProps$2(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'textarea':\n      initWrapperState$2(domElement, rawProps);\n      props = getHostProps$3(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    default:\n      props = rawProps;\n  }\n\n  assertValidProps(tag, props);\n  setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);\n\n  switch (tag) {\n    case 'input':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper(domElement, rawProps, false);\n      break;\n\n    case 'textarea':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper$3(domElement);\n      break;\n\n    case 'option':\n      postMountWrapper$1(domElement, rawProps);\n      break;\n\n    case 'select':\n      postMountWrapper$2(domElement, rawProps);\n      break;\n\n    default:\n      if (typeof props.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n} // Calculate the diff between the two objects.\n\nfunction diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {\n  {\n    validatePropertiesInDevelopment(tag, nextRawProps);\n  }\n\n  var updatePayload = null;\n  var lastProps;\n  var nextProps;\n\n  switch (tag) {\n    case 'input':\n      lastProps = getHostProps(domElement, lastRawProps);\n      nextProps = getHostProps(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'option':\n      lastProps = getHostProps$1(domElement, lastRawProps);\n      nextProps = getHostProps$1(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'select':\n      lastProps = getHostProps$2(domElement, lastRawProps);\n      nextProps = getHostProps$2(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'textarea':\n      lastProps = getHostProps$3(domElement, lastRawProps);\n      nextProps = getHostProps$3(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    default:\n      lastProps = lastRawProps;\n      nextProps = nextRawProps;\n\n      if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n\n  assertValidProps(tag, nextProps);\n  var propKey;\n  var styleName;\n  var styleUpdates = null;\n\n  for (propKey in lastProps) {\n    if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {\n      continue;\n    }\n\n    if (propKey === STYLE) {\n      var lastStyle = lastProps[propKey];\n\n      for (styleName in lastStyle) {\n        if (lastStyle.hasOwnProperty(styleName)) {\n          if (!styleUpdates) {\n            styleUpdates = {};\n          }\n\n          styleUpdates[styleName] = '';\n        }\n      }\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      // This is a special case. If any listener updates we need to ensure\n      // that the \"current\" fiber pointer gets updated so we need a commit\n      // to update this element.\n      if (!updatePayload) {\n        updatePayload = [];\n      }\n    } else {\n      // For all other deleted properties we add it to the queue. We use\n      // the whitelist in the commit phase instead.\n      (updatePayload = updatePayload || []).push(propKey, null);\n    }\n  }\n\n  for (propKey in nextProps) {\n    var nextProp = nextProps[propKey];\n    var lastProp = lastProps != null ? lastProps[propKey] : undefined;\n\n    if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {\n      continue;\n    }\n\n    if (propKey === STYLE) {\n      {\n        if (nextProp) {\n          // Freeze the next style object so that we can assume it won't be\n          // mutated. We have already warned for this in the past.\n          Object.freeze(nextProp);\n        }\n      }\n\n      if (lastProp) {\n        // Unset styles on `lastProp` but not on `nextProp`.\n        for (styleName in lastProp) {\n          if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = '';\n          }\n        } // Update styles that changed since `lastProp`.\n\n\n        for (styleName in nextProp) {\n          if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = nextProp[styleName];\n          }\n        }\n      } else {\n        // Relies on `updateStylesByID` not mutating `styleUpdates`.\n        if (!styleUpdates) {\n          if (!updatePayload) {\n            updatePayload = [];\n          }\n\n          updatePayload.push(propKey, styleUpdates);\n        }\n\n        styleUpdates = nextProp;\n      }\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n      var lastHtml = lastProp ? lastProp[HTML$1] : undefined;\n\n      if (nextHtml != null) {\n        if (lastHtml !== nextHtml) {\n          (updatePayload = updatePayload || []).push(propKey, nextHtml);\n        }\n      }\n    } else if (propKey === CHILDREN) {\n      if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {\n        (updatePayload = updatePayload || []).push(propKey, '' + nextProp);\n      }\n    } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        // We eagerly listen to this even though we haven't committed yet.\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n\n      if (!updatePayload && lastProp !== nextProp) {\n        // This is a special case. If any listener updates we need to ensure\n        // that the \"current\" props pointer gets updated so we need a commit\n        // to update this element.\n        updatePayload = [];\n      }\n    } else {\n      // For any other property we always add it to the queue and then we\n      // filter it out using the whitelist during the commit.\n      (updatePayload = updatePayload || []).push(propKey, nextProp);\n    }\n  }\n\n  if (styleUpdates) {\n    {\n      validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);\n    }\n\n    (updatePayload = updatePayload || []).push(STYLE, styleUpdates);\n  }\n\n  return updatePayload;\n} // Apply the diff.\n\nfunction updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {\n  // Update checked *before* name.\n  // In the middle of an update, it is possible to have multiple checked.\n  // When a checked radio tries to change name, browser makes another radio's checked false.\n  if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {\n    updateChecked(domElement, nextRawProps);\n  }\n\n  var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);\n  var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.\n\n  updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props\n  // changed.\n\n  switch (tag) {\n    case 'input':\n      // Update the wrapper around inputs *after* updating props. This has to\n      // happen after `updateDOMProperties`. Otherwise HTML5 input validations\n      // raise warnings and prevent the new value from being assigned.\n      updateWrapper(domElement, nextRawProps);\n      break;\n\n    case 'textarea':\n      updateWrapper$1(domElement, nextRawProps);\n      break;\n\n    case 'select':\n      // <select> value update needs to occur after <option> children\n      // reconciliation\n      postUpdateWrapper(domElement, nextRawProps);\n      break;\n  }\n}\n\nfunction getPossibleStandardName(propName) {\n  {\n    var lowerCasedName = propName.toLowerCase();\n\n    if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n      return null;\n    }\n\n    return possibleStandardNames[lowerCasedName] || null;\n  }\n}\n\nfunction diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {\n  var isCustomComponentTag;\n  var extraAttributeNames;\n\n  {\n    suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true;\n    isCustomComponentTag = isCustomComponent(tag, rawProps);\n    validatePropertiesInDevelopment(tag, rawProps);\n  } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n  switch (tag) {\n    case 'iframe':\n    case 'object':\n    case 'embed':\n      trapBubbledEvent(TOP_LOAD, domElement);\n      break;\n\n    case 'video':\n    case 'audio':\n      // Create listener for each media event\n      for (var i = 0; i < mediaEventTypes.length; i++) {\n        trapBubbledEvent(mediaEventTypes[i], domElement);\n      }\n\n      break;\n\n    case 'source':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      break;\n\n    case 'img':\n    case 'image':\n    case 'link':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      trapBubbledEvent(TOP_LOAD, domElement);\n      break;\n\n    case 'form':\n      trapBubbledEvent(TOP_RESET, domElement);\n      trapBubbledEvent(TOP_SUBMIT, domElement);\n      break;\n\n    case 'details':\n      trapBubbledEvent(TOP_TOGGLE, domElement);\n      break;\n\n    case 'input':\n      initWrapperState(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'option':\n      validateProps(domElement, rawProps);\n      break;\n\n    case 'select':\n      initWrapperState$1(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'textarea':\n      initWrapperState$2(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n  }\n\n  assertValidProps(tag, rawProps);\n\n  {\n    extraAttributeNames = new Set();\n    var attributes = domElement.attributes;\n\n    for (var _i = 0; _i < attributes.length; _i++) {\n      var name = attributes[_i].name.toLowerCase();\n\n      switch (name) {\n        // Built-in SSR attribute is whitelisted\n        case 'data-reactroot':\n          break;\n        // Controlled attributes are not validated\n        // TODO: Only ignore them on controlled tags.\n\n        case 'value':\n          break;\n\n        case 'checked':\n          break;\n\n        case 'selected':\n          break;\n\n        default:\n          // Intentionally use the original name.\n          // See discussion in https://github.com/facebook/react/pull/10676.\n          extraAttributeNames.add(attributes[_i].name);\n      }\n    }\n  }\n\n  var updatePayload = null;\n\n  for (var propKey in rawProps) {\n    if (!rawProps.hasOwnProperty(propKey)) {\n      continue;\n    }\n\n    var nextProp = rawProps[propKey];\n\n    if (propKey === CHILDREN) {\n      // For text content children we compare against textContent. This\n      // might match additional HTML that is hidden when we read it using\n      // textContent. E.g. \"foo\" will match \"f<span>oo</span>\" but that still\n      // satisfies our requirement. Our requirement is not to produce perfect\n      // HTML and attributes. Ideally we should preserve structure but it's\n      // ok not to if the visible content is still enough to indicate what\n      // even listeners these nodes might be wired up to.\n      // TODO: Warn if there is more than a single textNode as a child.\n      // TODO: Should we use domElement.firstChild.nodeValue to compare?\n      if (typeof nextProp === 'string') {\n        if (domElement.textContent !== nextProp) {\n          if ( !suppressHydrationWarning) {\n            warnForTextDifference(domElement.textContent, nextProp);\n          }\n\n          updatePayload = [CHILDREN, nextProp];\n        }\n      } else if (typeof nextProp === 'number') {\n        if (domElement.textContent !== '' + nextProp) {\n          if ( !suppressHydrationWarning) {\n            warnForTextDifference(domElement.textContent, nextProp);\n          }\n\n          updatePayload = [CHILDREN, '' + nextProp];\n        }\n      }\n    } else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n    } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.)\n    typeof isCustomComponentTag === 'boolean') {\n      // Validate that the properties correspond to their expected values.\n      var serverValue = void 0;\n      var propertyInfo = getPropertyInfo(propKey);\n\n      if (suppressHydrationWarning) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated\n      // TODO: Only ignore them on controlled tags.\n      propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n        var serverHTML = domElement.innerHTML;\n        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n        var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');\n\n        if (expectedHTML !== serverHTML) {\n          warnForPropDifference(propKey, serverHTML, expectedHTML);\n        }\n      } else if (propKey === STYLE) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        extraAttributeNames.delete(propKey);\n\n        if (canDiffStyleForHydrationWarning) {\n          var expectedStyle = createDangerousStringForStyles(nextProp);\n          serverValue = domElement.getAttribute('style');\n\n          if (expectedStyle !== serverValue) {\n            warnForPropDifference(propKey, serverValue, expectedStyle);\n          }\n        }\n      } else if (isCustomComponentTag) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        extraAttributeNames.delete(propKey.toLowerCase());\n        serverValue = getValueForAttribute(domElement, propKey, nextProp);\n\n        if (nextProp !== serverValue) {\n          warnForPropDifference(propKey, serverValue, nextProp);\n        }\n      } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {\n        var isMismatchDueToBadCasing = false;\n\n        if (propertyInfo !== null) {\n          // $FlowFixMe - Should be inferred as not undefined.\n          extraAttributeNames.delete(propertyInfo.attributeName);\n          serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);\n        } else {\n          var ownNamespace = parentNamespace;\n\n          if (ownNamespace === HTML_NAMESPACE$1) {\n            ownNamespace = getIntrinsicNamespace(tag);\n          }\n\n          if (ownNamespace === HTML_NAMESPACE$1) {\n            // $FlowFixMe - Should be inferred as not undefined.\n            extraAttributeNames.delete(propKey.toLowerCase());\n          } else {\n            var standardName = getPossibleStandardName(propKey);\n\n            if (standardName !== null && standardName !== propKey) {\n              // If an SVG prop is supplied with bad casing, it will\n              // be successfully parsed from HTML, but will produce a mismatch\n              // (and would be incorrectly rendered on the client).\n              // However, we already warn about bad casing elsewhere.\n              // So we'll skip the misleading extra mismatch warning in this case.\n              isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.\n\n              extraAttributeNames.delete(standardName);\n            } // $FlowFixMe - Should be inferred as not undefined.\n\n\n            extraAttributeNames.delete(propKey);\n          }\n\n          serverValue = getValueForAttribute(domElement, propKey, nextProp);\n        }\n\n        if (nextProp !== serverValue && !isMismatchDueToBadCasing) {\n          warnForPropDifference(propKey, serverValue, nextProp);\n        }\n      }\n    }\n  }\n\n  {\n    // $FlowFixMe - Should be inferred as not undefined.\n    if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {\n      // $FlowFixMe - Should be inferred as not undefined.\n      warnForExtraAttributes(extraAttributeNames);\n    }\n  }\n\n  switch (tag) {\n    case 'input':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper(domElement, rawProps, true);\n      break;\n\n    case 'textarea':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper$3(domElement);\n      break;\n\n    case 'select':\n    case 'option':\n      // For input and textarea we current always set the value property at\n      // post mount to force it to diverge from attributes. However, for\n      // option and select we don't quite do the same thing and select\n      // is not resilient to the DOM state changing so we don't do that here.\n      // TODO: Consider not doing this for input and textarea.\n      break;\n\n    default:\n      if (typeof rawProps.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n\n  return updatePayload;\n}\nfunction diffHydratedText(textNode, text) {\n  var isDifferent = textNode.nodeValue !== text;\n  return isDifferent;\n}\nfunction warnForUnmatchedText(textNode, text) {\n  {\n    warnForTextDifference(textNode.nodeValue, text);\n  }\n}\nfunction warnForDeletedHydratableElement(parentNode, child) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForDeletedHydratableText(parentNode, child) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Did not expect server HTML to contain the text node \"%s\" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForInsertedHydratedElement(parentNode, tag, props) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForInsertedHydratedText(parentNode, text) {\n  {\n    if (text === '') {\n      // We expect to insert empty text nodes since they're not represented in\n      // the HTML.\n      // TODO: Remove this special case if we can just avoid inserting empty\n      // text nodes.\n      return;\n    }\n\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Expected server HTML to contain a matching text node for \"%s\" in <%s>.', text, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction restoreControlledState$3(domElement, tag, props) {\n  switch (tag) {\n    case 'input':\n      restoreControlledState(domElement, props);\n      return;\n\n    case 'textarea':\n      restoreControlledState$2(domElement, props);\n      return;\n\n    case 'select':\n      restoreControlledState$1(domElement, props);\n      return;\n  }\n}\n\nfunction getActiveElement(doc) {\n  doc = doc || (typeof document !== 'undefined' ? document : undefined);\n\n  if (typeof doc === 'undefined') {\n    return null;\n  }\n\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\n\nfunction getLeafNode(node) {\n  while (node && node.firstChild) {\n    node = node.firstChild;\n  }\n\n  return node;\n}\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\n\n\nfunction getSiblingNode(node) {\n  while (node) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n\n    node = node.parentNode;\n  }\n}\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\n\n\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  var nodeStart = 0;\n  var nodeEnd = 0;\n\n  while (node) {\n    if (node.nodeType === TEXT_NODE) {\n      nodeEnd = nodeStart + node.textContent.length;\n\n      if (nodeStart <= offset && nodeEnd >= offset) {\n        return {\n          node: node,\n          offset: offset - nodeStart\n        };\n      }\n\n      nodeStart = nodeEnd;\n    }\n\n    node = getLeafNode(getSiblingNode(node));\n  }\n}\n\n/**\n * @param {DOMElement} outerNode\n * @return {?object}\n */\n\nfunction getOffsets(outerNode) {\n  var ownerDocument = outerNode.ownerDocument;\n  var win = ownerDocument && ownerDocument.defaultView || window;\n  var selection = win.getSelection && win.getSelection();\n\n  if (!selection || selection.rangeCount === 0) {\n    return null;\n  }\n\n  var anchorNode = selection.anchorNode,\n      anchorOffset = selection.anchorOffset,\n      focusNode = selection.focusNode,\n      focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be \"anonymous divs\", e.g. the\n  // up/down buttons on an <input type=\"number\">. Anonymous divs do not seem to\n  // expose properties, triggering a \"Permission denied error\" if any of its\n  // properties are accessed. The only seemingly possible way to avoid erroring\n  // is to access a property that typically works for non-anonymous divs and\n  // catch any error that may otherwise arise. See\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n\n  try {\n    /* eslint-disable no-unused-expressions */\n    anchorNode.nodeType;\n    focusNode.nodeType;\n    /* eslint-enable no-unused-expressions */\n  } catch (e) {\n    return null;\n  }\n\n  return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);\n}\n/**\n * Returns {start, end} where `start` is the character/codepoint index of\n * (anchorNode, anchorOffset) within the textContent of `outerNode`, and\n * `end` is the index of (focusNode, focusOffset).\n *\n * Returns null if you pass in garbage input but we should probably just crash.\n *\n * Exported only for testing.\n */\n\nfunction getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {\n  var length = 0;\n  var start = -1;\n  var end = -1;\n  var indexWithinAnchor = 0;\n  var indexWithinFocus = 0;\n  var node = outerNode;\n  var parentNode = null;\n\n  outer: while (true) {\n    var next = null;\n\n    while (true) {\n      if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {\n        start = length + anchorOffset;\n      }\n\n      if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {\n        end = length + focusOffset;\n      }\n\n      if (node.nodeType === TEXT_NODE) {\n        length += node.nodeValue.length;\n      }\n\n      if ((next = node.firstChild) === null) {\n        break;\n      } // Moving from `node` to its first child `next`.\n\n\n      parentNode = node;\n      node = next;\n    }\n\n    while (true) {\n      if (node === outerNode) {\n        // If `outerNode` has children, this is always the second time visiting\n        // it. If it has no children, this is still the first loop, and the only\n        // valid selection is anchorNode and focusNode both equal to this node\n        // and both offsets 0, in which case we will have handled above.\n        break outer;\n      }\n\n      if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {\n        start = length;\n      }\n\n      if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {\n        end = length;\n      }\n\n      if ((next = node.nextSibling) !== null) {\n        break;\n      }\n\n      node = parentNode;\n      parentNode = node.parentNode;\n    } // Moving from `node` to its next sibling `next`.\n\n\n    node = next;\n  }\n\n  if (start === -1 || end === -1) {\n    // This should never happen. (Would happen if the anchor/focus nodes aren't\n    // actually inside the passed-in node.)\n    return null;\n  }\n\n  return {\n    start: start,\n    end: end\n  };\n}\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programmatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\n\nfunction setOffsets(node, offsets) {\n  var doc = node.ownerDocument || document;\n  var win = doc && doc.defaultView || window; // Edge fails with \"Object expected\" in some scenarios.\n  // (For instance: TinyMCE editor used in a list component that supports pasting to add more,\n  // fails when pasting 100+ items)\n\n  if (!win.getSelection) {\n    return;\n  }\n\n  var selection = win.getSelection();\n  var length = node.textContent.length;\n  var start = Math.min(offsets.start, length);\n  var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.\n  // Flip backward selections, so we can set with a single range.\n\n  if (!selection.extend && start > end) {\n    var temp = end;\n    end = start;\n    start = temp;\n  }\n\n  var startMarker = getNodeForCharacterOffset(node, start);\n  var endMarker = getNodeForCharacterOffset(node, end);\n\n  if (startMarker && endMarker) {\n    if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {\n      return;\n    }\n\n    var range = doc.createRange();\n    range.setStart(startMarker.node, startMarker.offset);\n    selection.removeAllRanges();\n\n    if (start > end) {\n      selection.addRange(range);\n      selection.extend(endMarker.node, endMarker.offset);\n    } else {\n      range.setEnd(endMarker.node, endMarker.offset);\n      selection.addRange(range);\n    }\n  }\n}\n\nfunction isTextNode(node) {\n  return node && node.nodeType === TEXT_NODE;\n}\n\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if ('contains' in outerNode) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nfunction isInDocument(node) {\n  return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);\n}\n\nfunction isSameOriginFrame(iframe) {\n  try {\n    // Accessing the contentDocument of a HTMLIframeElement can cause the browser\n    // to throw, e.g. if it has a cross-origin src attribute.\n    // Safari will show an error in the console when the access results in \"Blocked a frame with origin\". e.g:\n    // iframe.contentDocument.defaultView;\n    // A safety way is to access one of the cross origin properties: Window or Location\n    // Which might result in \"SecurityError\" DOM Exception and it is compatible to Safari.\n    // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl\n    return typeof iframe.contentWindow.location.href === 'string';\n  } catch (err) {\n    return false;\n  }\n}\n\nfunction getActiveElementDeep() {\n  var win = window;\n  var element = getActiveElement();\n\n  while (element instanceof win.HTMLIFrameElement) {\n    if (isSameOriginFrame(element)) {\n      win = element.contentWindow;\n    } else {\n      return element;\n    }\n\n    element = getActiveElement(win.document);\n  }\n\n  return element;\n}\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\n\n/**\n * @hasSelectionCapabilities: we get the element types that support selection\n * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`\n * and `selectionEnd` rows.\n */\n\n\nfunction hasSelectionCapabilities(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');\n}\nfunction getSelectionInformation() {\n  var focusedElem = getActiveElementDeep();\n  return {\n    // Used by Flare\n    activeElementDetached: null,\n    focusedElem: focusedElem,\n    selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null\n  };\n}\n/**\n * @restoreSelection: If any selection information was potentially lost,\n * restore it. This is useful when performing operations that could remove dom\n * nodes and place them back in, resulting in focus being lost.\n */\n\nfunction restoreSelection(priorSelectionInformation) {\n  var curFocusedElem = getActiveElementDeep();\n  var priorFocusedElem = priorSelectionInformation.focusedElem;\n  var priorSelectionRange = priorSelectionInformation.selectionRange;\n\n  if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n    if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {\n      setSelection(priorFocusedElem, priorSelectionRange);\n    } // Focusing a node can change the scroll position, which is undesirable\n\n\n    var ancestors = [];\n    var ancestor = priorFocusedElem;\n\n    while (ancestor = ancestor.parentNode) {\n      if (ancestor.nodeType === ELEMENT_NODE) {\n        ancestors.push({\n          element: ancestor,\n          left: ancestor.scrollLeft,\n          top: ancestor.scrollTop\n        });\n      }\n    }\n\n    if (typeof priorFocusedElem.focus === 'function') {\n      priorFocusedElem.focus();\n    }\n\n    for (var i = 0; i < ancestors.length; i++) {\n      var info = ancestors[i];\n      info.element.scrollLeft = info.left;\n      info.element.scrollTop = info.top;\n    }\n  }\n}\n/**\n * @getSelection: Gets the selection bounds of a focused textarea, input or\n * contentEditable node.\n * -@input: Look up selection bounds of this input\n * -@return {start: selectionStart, end: selectionEnd}\n */\n\nfunction getSelection(input) {\n  var selection;\n\n  if ('selectionStart' in input) {\n    // Modern browser with input or textarea.\n    selection = {\n      start: input.selectionStart,\n      end: input.selectionEnd\n    };\n  } else {\n    // Content editable or old IE textarea.\n    selection = getOffsets(input);\n  }\n\n  return selection || {\n    start: 0,\n    end: 0\n  };\n}\n/**\n * @setSelection: Sets the selection bounds of a textarea or input and focuses\n * the input.\n * -@input     Set selection bounds of this input or textarea\n * -@offsets   Object of same form that is returned from get*\n */\n\nfunction setSelection(input, offsets) {\n  var start = offsets.start,\n      end = offsets.end;\n\n  if (end === undefined) {\n    end = start;\n  }\n\n  if ('selectionStart' in input) {\n    input.selectionStart = start;\n    input.selectionEnd = Math.min(end, input.value.length);\n  } else {\n    setOffsets(input, offsets);\n  }\n}\n\nvar validateDOMNesting = function () {};\n\nvar updatedAncestorInfo = function () {};\n\n{\n  // This validation code was written based on the HTML5 parsing spec:\n  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n  //\n  // Note: this does not catch all invalid nesting, nor does it try to (as it's\n  // not clear what practical benefit doing so provides); instead, we warn only\n  // for cases where the parser will give a parse tree differing from what React\n  // intended. For example, <b><div></div></b> is invalid but we don't warn\n  // because it still parses correctly; we do warn for other cases like nested\n  // <p> tags where the beginning of the second element implicitly closes the\n  // first, causing a confusing mess.\n  // https://html.spec.whatwg.org/multipage/syntax.html#special\n  var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n\n  var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n  // TODO: Distinguish by namespace here -- for <title>, including it here\n  // errs on the side of fewer warnings\n  'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n\n  var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n\n  var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n  var emptyAncestorInfo = {\n    current: null,\n    formTag: null,\n    aTagInScope: null,\n    buttonTagInScope: null,\n    nobrTagInScope: null,\n    pTagInButtonScope: null,\n    listItemTagAutoclosing: null,\n    dlItemTagAutoclosing: null\n  };\n\n  updatedAncestorInfo = function (oldInfo, tag) {\n    var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);\n\n    var info = {\n      tag: tag\n    };\n\n    if (inScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.aTagInScope = null;\n      ancestorInfo.buttonTagInScope = null;\n      ancestorInfo.nobrTagInScope = null;\n    }\n\n    if (buttonScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.pTagInButtonScope = null;\n    } // See rules for 'li', 'dd', 'dt' start tags in\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n    if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n      ancestorInfo.listItemTagAutoclosing = null;\n      ancestorInfo.dlItemTagAutoclosing = null;\n    }\n\n    ancestorInfo.current = info;\n\n    if (tag === 'form') {\n      ancestorInfo.formTag = info;\n    }\n\n    if (tag === 'a') {\n      ancestorInfo.aTagInScope = info;\n    }\n\n    if (tag === 'button') {\n      ancestorInfo.buttonTagInScope = info;\n    }\n\n    if (tag === 'nobr') {\n      ancestorInfo.nobrTagInScope = info;\n    }\n\n    if (tag === 'p') {\n      ancestorInfo.pTagInButtonScope = info;\n    }\n\n    if (tag === 'li') {\n      ancestorInfo.listItemTagAutoclosing = info;\n    }\n\n    if (tag === 'dd' || tag === 'dt') {\n      ancestorInfo.dlItemTagAutoclosing = info;\n    }\n\n    return ancestorInfo;\n  };\n  /**\n   * Returns whether\n   */\n\n\n  var isTagValidWithParent = function (tag, parentTag) {\n    // First, let's check if we're in an unusual parsing mode...\n    switch (parentTag) {\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n      case 'select':\n        return tag === 'option' || tag === 'optgroup' || tag === '#text';\n\n      case 'optgroup':\n        return tag === 'option' || tag === '#text';\n      // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n      // but\n\n      case 'option':\n        return tag === '#text';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n      // No special behavior since these rules fall back to \"in body\" mode for\n      // all except special table nodes which cause bad parsing behavior anyway.\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n\n      case 'tr':\n        return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n\n      case 'tbody':\n      case 'thead':\n      case 'tfoot':\n        return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n\n      case 'colgroup':\n        return tag === 'col' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n\n      case 'table':\n        return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n\n      case 'head':\n        return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n\n      case 'html':\n        return tag === 'head' || tag === 'body' || tag === 'frameset';\n\n      case 'frameset':\n        return tag === 'frame';\n\n      case '#document':\n        return tag === 'html';\n    } // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n    // where the parsing rules cause implicit opens or closes to be added.\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n    switch (tag) {\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n      case 'rp':\n      case 'rt':\n        return impliedEndTags.indexOf(parentTag) === -1;\n\n      case 'body':\n      case 'caption':\n      case 'col':\n      case 'colgroup':\n      case 'frameset':\n      case 'frame':\n      case 'head':\n      case 'html':\n      case 'tbody':\n      case 'td':\n      case 'tfoot':\n      case 'th':\n      case 'thead':\n      case 'tr':\n        // These tags are only valid with a few parents that have special child\n        // parsing rules -- if we're down here, then none of those matched and\n        // so we allow it only if we don't know what the parent is, as all other\n        // cases are invalid.\n        return parentTag == null;\n    }\n\n    return true;\n  };\n  /**\n   * Returns whether\n   */\n\n\n  var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n    switch (tag) {\n      case 'address':\n      case 'article':\n      case 'aside':\n      case 'blockquote':\n      case 'center':\n      case 'details':\n      case 'dialog':\n      case 'dir':\n      case 'div':\n      case 'dl':\n      case 'fieldset':\n      case 'figcaption':\n      case 'figure':\n      case 'footer':\n      case 'header':\n      case 'hgroup':\n      case 'main':\n      case 'menu':\n      case 'nav':\n      case 'ol':\n      case 'p':\n      case 'section':\n      case 'summary':\n      case 'ul':\n      case 'pre':\n      case 'listing':\n      case 'table':\n      case 'hr':\n      case 'xmp':\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return ancestorInfo.pTagInButtonScope;\n\n      case 'form':\n        return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n      case 'li':\n        return ancestorInfo.listItemTagAutoclosing;\n\n      case 'dd':\n      case 'dt':\n        return ancestorInfo.dlItemTagAutoclosing;\n\n      case 'button':\n        return ancestorInfo.buttonTagInScope;\n\n      case 'a':\n        // Spec says something about storing a list of markers, but it sounds\n        // equivalent to this check.\n        return ancestorInfo.aTagInScope;\n\n      case 'nobr':\n        return ancestorInfo.nobrTagInScope;\n    }\n\n    return null;\n  };\n\n  var didWarn$1 = {};\n\n  validateDOMNesting = function (childTag, childText, ancestorInfo) {\n    ancestorInfo = ancestorInfo || emptyAncestorInfo;\n    var parentInfo = ancestorInfo.current;\n    var parentTag = parentInfo && parentInfo.tag;\n\n    if (childText != null) {\n      if (childTag != null) {\n        error('validateDOMNesting: when childText is passed, childTag should be null');\n      }\n\n      childTag = '#text';\n    }\n\n    var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n    var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n    var invalidParentOrAncestor = invalidParent || invalidAncestor;\n\n    if (!invalidParentOrAncestor) {\n      return;\n    }\n\n    var ancestorTag = invalidParentOrAncestor.tag;\n    var addendum = getCurrentFiberStackInDev();\n    var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;\n\n    if (didWarn$1[warnKey]) {\n      return;\n    }\n\n    didWarn$1[warnKey] = true;\n    var tagDisplayName = childTag;\n    var whitespaceInfo = '';\n\n    if (childTag === '#text') {\n      if (/\\S/.test(childText)) {\n        tagDisplayName = 'Text nodes';\n      } else {\n        tagDisplayName = 'Whitespace text nodes';\n        whitespaceInfo = \" Make sure you don't have any extra whitespace between tags on \" + 'each line of your source code.';\n      }\n    } else {\n      tagDisplayName = '<' + childTag + '>';\n    }\n\n    if (invalidParent) {\n      var info = '';\n\n      if (ancestorTag === 'table' && childTag === 'tr') {\n        info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';\n      }\n\n      error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);\n    } else {\n      error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);\n    }\n  };\n}\n\nvar SUPPRESS_HYDRATION_WARNING$1;\n\n{\n  SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';\n}\n\nvar SUSPENSE_START_DATA = '$';\nvar SUSPENSE_END_DATA = '/$';\nvar SUSPENSE_PENDING_START_DATA = '$?';\nvar SUSPENSE_FALLBACK_START_DATA = '$!';\nvar STYLE$1 = 'style';\nvar eventsEnabled = null;\nvar selectionInformation = null;\n\nfunction shouldAutoFocusHostComponent(type, props) {\n  switch (type) {\n    case 'button':\n    case 'input':\n    case 'select':\n    case 'textarea':\n      return !!props.autoFocus;\n  }\n\n  return false;\n}\nfunction getRootHostContext(rootContainerInstance) {\n  var type;\n  var namespace;\n  var nodeType = rootContainerInstance.nodeType;\n\n  switch (nodeType) {\n    case DOCUMENT_NODE:\n    case DOCUMENT_FRAGMENT_NODE:\n      {\n        type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';\n        var root = rootContainerInstance.documentElement;\n        namespace = root ? root.namespaceURI : getChildNamespace(null, '');\n        break;\n      }\n\n    default:\n      {\n        var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;\n        var ownNamespace = container.namespaceURI || null;\n        type = container.tagName;\n        namespace = getChildNamespace(ownNamespace, type);\n        break;\n      }\n  }\n\n  {\n    var validatedTag = type.toLowerCase();\n    var ancestorInfo = updatedAncestorInfo(null, validatedTag);\n    return {\n      namespace: namespace,\n      ancestorInfo: ancestorInfo\n    };\n  }\n}\nfunction getChildHostContext(parentHostContext, type, rootContainerInstance) {\n  {\n    var parentHostContextDev = parentHostContext;\n    var namespace = getChildNamespace(parentHostContextDev.namespace, type);\n    var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);\n    return {\n      namespace: namespace,\n      ancestorInfo: ancestorInfo\n    };\n  }\n}\nfunction getPublicInstance(instance) {\n  return instance;\n}\nfunction prepareForCommit(containerInfo) {\n  eventsEnabled = isEnabled();\n  selectionInformation = getSelectionInformation();\n  setEnabled(false);\n}\nfunction resetAfterCommit(containerInfo) {\n  restoreSelection(selectionInformation);\n  setEnabled(eventsEnabled);\n  eventsEnabled = null;\n\n  selectionInformation = null;\n}\nfunction createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n  var parentNamespace;\n\n  {\n    // TODO: take namespace into account when validating.\n    var hostContextDev = hostContext;\n    validateDOMNesting(type, null, hostContextDev.ancestorInfo);\n\n    if (typeof props.children === 'string' || typeof props.children === 'number') {\n      var string = '' + props.children;\n      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n      validateDOMNesting(null, string, ownAncestorInfo);\n    }\n\n    parentNamespace = hostContextDev.namespace;\n  }\n\n  var domElement = createElement(type, props, rootContainerInstance, parentNamespace);\n  precacheFiberNode(internalInstanceHandle, domElement);\n  updateFiberProps(domElement, props);\n  return domElement;\n}\nfunction appendInitialChild(parentInstance, child) {\n  parentInstance.appendChild(child);\n}\nfunction finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {\n  setInitialProperties(domElement, type, props, rootContainerInstance);\n  return shouldAutoFocusHostComponent(type, props);\n}\nfunction prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {\n  {\n    var hostContextDev = hostContext;\n\n    if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {\n      var string = '' + newProps.children;\n      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n      validateDOMNesting(null, string, ownAncestorInfo);\n    }\n  }\n\n  return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);\n}\nfunction shouldSetTextContent(type, props) {\n  return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;\n}\nfunction shouldDeprioritizeSubtree(type, props) {\n  return !!props.hidden;\n}\nfunction createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {\n  {\n    var hostContextDev = hostContext;\n    validateDOMNesting(null, text, hostContextDev.ancestorInfo);\n  }\n\n  var textNode = createTextNode(text, rootContainerInstance);\n  precacheFiberNode(internalInstanceHandle, textNode);\n  return textNode;\n}\n// if a component just imports ReactDOM (e.g. for findDOMNode).\n// Some environments might not have setTimeout or clearTimeout.\n\nvar scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;\nvar cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;\nvar noTimeout = -1; // -------------------\nfunction commitMount(domElement, type, newProps, internalInstanceHandle) {\n  // Despite the naming that might imply otherwise, this method only\n  // fires if there is an `Update` effect scheduled during mounting.\n  // This happens if `finalizeInitialChildren` returns `true` (which it\n  // does to implement the `autoFocus` attribute on the client). But\n  // there are also other cases when this might happen (such as patching\n  // up text content during hydration mismatch). So we'll check this again.\n  if (shouldAutoFocusHostComponent(type, newProps)) {\n    domElement.focus();\n  }\n}\nfunction commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {\n  // Update the props handle so that we know which props are the ones with\n  // with current event handlers.\n  updateFiberProps(domElement, newProps); // Apply the diff to the DOM node.\n\n  updateProperties(domElement, updatePayload, type, oldProps, newProps);\n}\nfunction resetTextContent(domElement) {\n  setTextContent(domElement, '');\n}\nfunction commitTextUpdate(textInstance, oldText, newText) {\n  textInstance.nodeValue = newText;\n}\nfunction appendChild(parentInstance, child) {\n  parentInstance.appendChild(child);\n}\nfunction appendChildToContainer(container, child) {\n  var parentNode;\n\n  if (container.nodeType === COMMENT_NODE) {\n    parentNode = container.parentNode;\n    parentNode.insertBefore(child, container);\n  } else {\n    parentNode = container;\n    parentNode.appendChild(child);\n  } // This container might be used for a portal.\n  // If something inside a portal is clicked, that click should bubble\n  // through the React tree. However, on Mobile Safari the click would\n  // never bubble through the *DOM* tree unless an ancestor with onclick\n  // event exists. So we wouldn't see it and dispatch it.\n  // This is why we ensure that non React root containers have inline onclick\n  // defined.\n  // https://github.com/facebook/react/issues/11918\n\n\n  var reactRootContainer = container._reactRootContainer;\n\n  if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {\n    // TODO: This cast may not be sound for SVG, MathML or custom elements.\n    trapClickOnNonInteractiveElement(parentNode);\n  }\n}\nfunction insertBefore(parentInstance, child, beforeChild) {\n  parentInstance.insertBefore(child, beforeChild);\n}\nfunction insertInContainerBefore(container, child, beforeChild) {\n  if (container.nodeType === COMMENT_NODE) {\n    container.parentNode.insertBefore(child, beforeChild);\n  } else {\n    container.insertBefore(child, beforeChild);\n  }\n}\nfunction removeChild(parentInstance, child) {\n  parentInstance.removeChild(child);\n}\nfunction removeChildFromContainer(container, child) {\n  if (container.nodeType === COMMENT_NODE) {\n    container.parentNode.removeChild(child);\n  } else {\n    container.removeChild(child);\n  }\n}\n\nfunction hideInstance(instance) {\n  // pass host context to this method?\n\n\n  instance = instance;\n  var style = instance.style;\n\n  if (typeof style.setProperty === 'function') {\n    style.setProperty('display', 'none', 'important');\n  } else {\n    style.display = 'none';\n  }\n}\nfunction hideTextInstance(textInstance) {\n  textInstance.nodeValue = '';\n}\nfunction unhideInstance(instance, props) {\n  instance = instance;\n  var styleProp = props[STYLE$1];\n  var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;\n  instance.style.display = dangerousStyleValue('display', display);\n}\nfunction unhideTextInstance(textInstance, text) {\n  textInstance.nodeValue = text;\n} // -------------------\nfunction canHydrateInstance(instance, type, props) {\n  if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {\n    return null;\n  } // This has now been refined to an element node.\n\n\n  return instance;\n}\nfunction canHydrateTextInstance(instance, text) {\n  if (text === '' || instance.nodeType !== TEXT_NODE) {\n    // Empty strings are not parsed by HTML so there won't be a correct match here.\n    return null;\n  } // This has now been refined to a text node.\n\n\n  return instance;\n}\nfunction isSuspenseInstancePending(instance) {\n  return instance.data === SUSPENSE_PENDING_START_DATA;\n}\nfunction isSuspenseInstanceFallback(instance) {\n  return instance.data === SUSPENSE_FALLBACK_START_DATA;\n}\n\nfunction getNextHydratable(node) {\n  // Skip non-hydratable nodes.\n  for (; node != null; node = node.nextSibling) {\n    var nodeType = node.nodeType;\n\n    if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {\n      break;\n    }\n  }\n\n  return node;\n}\n\nfunction getNextHydratableSibling(instance) {\n  return getNextHydratable(instance.nextSibling);\n}\nfunction getFirstHydratableChild(parentInstance) {\n  return getNextHydratable(parentInstance.firstChild);\n}\nfunction hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n  precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events\n  // get attached.\n\n  updateFiberProps(instance, props);\n  var parentNamespace;\n\n  {\n    var hostContextDev = hostContext;\n    parentNamespace = hostContextDev.namespace;\n  }\n\n  return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);\n}\nfunction hydrateTextInstance(textInstance, text, internalInstanceHandle) {\n  precacheFiberNode(internalInstanceHandle, textInstance);\n  return diffHydratedText(textInstance, text);\n}\nfunction getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {\n  var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.\n  // There might be nested nodes so we need to keep track of how\n  // deep we are and only break out when we're back on top.\n\n  var depth = 0;\n\n  while (node) {\n    if (node.nodeType === COMMENT_NODE) {\n      var data = node.data;\n\n      if (data === SUSPENSE_END_DATA) {\n        if (depth === 0) {\n          return getNextHydratableSibling(node);\n        } else {\n          depth--;\n        }\n      } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n        depth++;\n      }\n    }\n\n    node = node.nextSibling;\n  } // TODO: Warn, we didn't find the end comment boundary.\n\n\n  return null;\n} // Returns the SuspenseInstance if this node is a direct child of a\n// SuspenseInstance. I.e. if its previous sibling is a Comment with\n// SUSPENSE_x_START_DATA. Otherwise, null.\n\nfunction getParentSuspenseInstance(targetInstance) {\n  var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.\n  // There might be nested nodes so we need to keep track of how\n  // deep we are and only break out when we're back on top.\n\n  var depth = 0;\n\n  while (node) {\n    if (node.nodeType === COMMENT_NODE) {\n      var data = node.data;\n\n      if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n        if (depth === 0) {\n          return node;\n        } else {\n          depth--;\n        }\n      } else if (data === SUSPENSE_END_DATA) {\n        depth++;\n      }\n    }\n\n    node = node.previousSibling;\n  }\n\n  return null;\n}\nfunction commitHydratedContainer(container) {\n  // Retry if any event replaying was blocked on this.\n  retryIfBlockedOn(container);\n}\nfunction commitHydratedSuspenseInstance(suspenseInstance) {\n  // Retry if any event replaying was blocked on this.\n  retryIfBlockedOn(suspenseInstance);\n}\nfunction didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {\n  {\n    warnForUnmatchedText(textInstance, text);\n  }\n}\nfunction didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForUnmatchedText(textInstance, text);\n  }\n}\nfunction didNotHydrateContainerInstance(parentContainer, instance) {\n  {\n    if (instance.nodeType === ELEMENT_NODE) {\n      warnForDeletedHydratableElement(parentContainer, instance);\n    } else if (instance.nodeType === COMMENT_NODE) ; else {\n      warnForDeletedHydratableText(parentContainer, instance);\n    }\n  }\n}\nfunction didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    if (instance.nodeType === ELEMENT_NODE) {\n      warnForDeletedHydratableElement(parentInstance, instance);\n    } else if (instance.nodeType === COMMENT_NODE) ; else {\n      warnForDeletedHydratableText(parentInstance, instance);\n    }\n  }\n}\nfunction didNotFindHydratableContainerInstance(parentContainer, type, props) {\n  {\n    warnForInsertedHydratedElement(parentContainer, type);\n  }\n}\nfunction didNotFindHydratableContainerTextInstance(parentContainer, text) {\n  {\n    warnForInsertedHydratedText(parentContainer, text);\n  }\n}\nfunction didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForInsertedHydratedElement(parentInstance, type);\n  }\n}\nfunction didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForInsertedHydratedText(parentInstance, text);\n  }\n}\nfunction didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ;\n}\n\nvar randomKey = Math.random().toString(36).slice(2);\nvar internalInstanceKey = '__reactInternalInstance$' + randomKey;\nvar internalEventHandlersKey = '__reactEventHandlers$' + randomKey;\nvar internalContainerInstanceKey = '__reactContainere$' + randomKey;\nfunction precacheFiberNode(hostInst, node) {\n  node[internalInstanceKey] = hostInst;\n}\nfunction markContainerAsRoot(hostRoot, node) {\n  node[internalContainerInstanceKey] = hostRoot;\n}\nfunction unmarkContainerAsRoot(node) {\n  node[internalContainerInstanceKey] = null;\n}\nfunction isContainerMarkedAsRoot(node) {\n  return !!node[internalContainerInstanceKey];\n} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.\n// If the target node is part of a hydrated or not yet rendered subtree, then\n// this may also return a SuspenseComponent or HostRoot to indicate that.\n// Conceptually the HostRoot fiber is a child of the Container node. So if you\n// pass the Container node as the targetNode, you will not actually get the\n// HostRoot back. To get to the HostRoot, you need to pass a child of it.\n// The same thing applies to Suspense boundaries.\n\nfunction getClosestInstanceFromNode(targetNode) {\n  var targetInst = targetNode[internalInstanceKey];\n\n  if (targetInst) {\n    // Don't return HostRoot or SuspenseComponent here.\n    return targetInst;\n  } // If the direct event target isn't a React owned DOM node, we need to look\n  // to see if one of its parents is a React owned DOM node.\n\n\n  var parentNode = targetNode.parentNode;\n\n  while (parentNode) {\n    // We'll check if this is a container root that could include\n    // React nodes in the future. We need to check this first because\n    // if we're a child of a dehydrated container, we need to first\n    // find that inner container before moving on to finding the parent\n    // instance. Note that we don't check this field on  the targetNode\n    // itself because the fibers are conceptually between the container\n    // node and the first child. It isn't surrounding the container node.\n    // If it's not a container, we check if it's an instance.\n    targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];\n\n    if (targetInst) {\n      // Since this wasn't the direct target of the event, we might have\n      // stepped past dehydrated DOM nodes to get here. However they could\n      // also have been non-React nodes. We need to answer which one.\n      // If we the instance doesn't have any children, then there can't be\n      // a nested suspense boundary within it. So we can use this as a fast\n      // bailout. Most of the time, when people add non-React children to\n      // the tree, it is using a ref to a child-less DOM node.\n      // Normally we'd only need to check one of the fibers because if it\n      // has ever gone from having children to deleting them or vice versa\n      // it would have deleted the dehydrated boundary nested inside already.\n      // However, since the HostRoot starts out with an alternate it might\n      // have one on the alternate so we need to check in case this was a\n      // root.\n      var alternate = targetInst.alternate;\n\n      if (targetInst.child !== null || alternate !== null && alternate.child !== null) {\n        // Next we need to figure out if the node that skipped past is\n        // nested within a dehydrated boundary and if so, which one.\n        var suspenseInstance = getParentSuspenseInstance(targetNode);\n\n        while (suspenseInstance !== null) {\n          // We found a suspense instance. That means that we haven't\n          // hydrated it yet. Even though we leave the comments in the\n          // DOM after hydrating, and there are boundaries in the DOM\n          // that could already be hydrated, we wouldn't have found them\n          // through this pass since if the target is hydrated it would\n          // have had an internalInstanceKey on it.\n          // Let's get the fiber associated with the SuspenseComponent\n          // as the deepest instance.\n          var targetSuspenseInst = suspenseInstance[internalInstanceKey];\n\n          if (targetSuspenseInst) {\n            return targetSuspenseInst;\n          } // If we don't find a Fiber on the comment, it might be because\n          // we haven't gotten to hydrate it yet. There might still be a\n          // parent boundary that hasn't above this one so we need to find\n          // the outer most that is known.\n\n\n          suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent\n          // host component also hasn't hydrated yet. We can return it\n          // below since it will bail out on the isMounted check later.\n        }\n      }\n\n      return targetInst;\n    }\n\n    targetNode = parentNode;\n    parentNode = targetNode.parentNode;\n  }\n\n  return null;\n}\n/**\n * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent\n * instance, or null if the node was not rendered by this React.\n */\n\nfunction getInstanceFromNode$1(node) {\n  var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];\n\n  if (inst) {\n    if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {\n      return inst;\n    } else {\n      return null;\n    }\n  }\n\n  return null;\n}\n/**\n * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding\n * DOM node.\n */\n\nfunction getNodeFromInstance$1(inst) {\n  if (inst.tag === HostComponent || inst.tag === HostText) {\n    // In Fiber this, is just the state node right now. We assume it will be\n    // a host component or host text.\n    return inst.stateNode;\n  } // Without this first invariant, passing a non-DOM-component triggers the next\n  // invariant for a missing parent, which is super confusing.\n\n\n  {\n    {\n      throw Error( \"getNodeFromInstance: Invalid argument.\" );\n    }\n  }\n}\nfunction getFiberCurrentPropsFromNode$1(node) {\n  return node[internalEventHandlersKey] || null;\n}\nfunction updateFiberProps(node, props) {\n  node[internalEventHandlersKey] = props;\n}\n\nfunction getParent(inst) {\n  do {\n    inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.\n    // That is depending on if we want nested subtrees (layers) to bubble\n    // events to their parent. We could also go through parentNode on the\n    // host node but that wouldn't work for React Native and doesn't let us\n    // do the portal feature.\n  } while (inst && inst.tag !== HostComponent);\n\n  if (inst) {\n    return inst;\n  }\n\n  return null;\n}\n/**\n * Return the lowest common ancestor of A and B, or null if they are in\n * different trees.\n */\n\n\nfunction getLowestCommonAncestor(instA, instB) {\n  var depthA = 0;\n\n  for (var tempA = instA; tempA; tempA = getParent(tempA)) {\n    depthA++;\n  }\n\n  var depthB = 0;\n\n  for (var tempB = instB; tempB; tempB = getParent(tempB)) {\n    depthB++;\n  } // If A is deeper, crawl up.\n\n\n  while (depthA - depthB > 0) {\n    instA = getParent(instA);\n    depthA--;\n  } // If B is deeper, crawl up.\n\n\n  while (depthB - depthA > 0) {\n    instB = getParent(instB);\n    depthB--;\n  } // Walk in lockstep until we find a match.\n\n\n  var depth = depthA;\n\n  while (depth--) {\n    if (instA === instB || instA === instB.alternate) {\n      return instA;\n    }\n\n    instA = getParent(instA);\n    instB = getParent(instB);\n  }\n\n  return null;\n}\n/**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n */\n\nfunction traverseTwoPhase(inst, fn, arg) {\n  var path = [];\n\n  while (inst) {\n    path.push(inst);\n    inst = getParent(inst);\n  }\n\n  var i;\n\n  for (i = path.length; i-- > 0;) {\n    fn(path[i], 'captured', arg);\n  }\n\n  for (i = 0; i < path.length; i++) {\n    fn(path[i], 'bubbled', arg);\n  }\n}\n/**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * Does not invoke the callback on the nearest common ancestor because nothing\n * \"entered\" or \"left\" that element.\n */\n\nfunction traverseEnterLeave(from, to, fn, argFrom, argTo) {\n  var common = from && to ? getLowestCommonAncestor(from, to) : null;\n  var pathFrom = [];\n\n  while (true) {\n    if (!from) {\n      break;\n    }\n\n    if (from === common) {\n      break;\n    }\n\n    var alternate = from.alternate;\n\n    if (alternate !== null && alternate === common) {\n      break;\n    }\n\n    pathFrom.push(from);\n    from = getParent(from);\n  }\n\n  var pathTo = [];\n\n  while (true) {\n    if (!to) {\n      break;\n    }\n\n    if (to === common) {\n      break;\n    }\n\n    var _alternate = to.alternate;\n\n    if (_alternate !== null && _alternate === common) {\n      break;\n    }\n\n    pathTo.push(to);\n    to = getParent(to);\n  }\n\n  for (var i = 0; i < pathFrom.length; i++) {\n    fn(pathFrom[i], 'bubbled', argFrom);\n  }\n\n  for (var _i = pathTo.length; _i-- > 0;) {\n    fn(pathTo[_i], 'captured', argTo);\n  }\n}\n\nfunction isInteractive(tag) {\n  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n}\n\nfunction shouldPreventMouseEvent(name, type, props) {\n  switch (name) {\n    case 'onClick':\n    case 'onClickCapture':\n    case 'onDoubleClick':\n    case 'onDoubleClickCapture':\n    case 'onMouseDown':\n    case 'onMouseDownCapture':\n    case 'onMouseMove':\n    case 'onMouseMoveCapture':\n    case 'onMouseUp':\n    case 'onMouseUpCapture':\n    case 'onMouseEnter':\n      return !!(props.disabled && isInteractive(type));\n\n    default:\n      return false;\n  }\n}\n/**\n * @param {object} inst The instance, which is the source of events.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @return {?function} The stored callback.\n */\n\n\nfunction getListener(inst, registrationName) {\n  var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not\n  // live here; needs to be moved to a better place soon\n\n  var stateNode = inst.stateNode;\n\n  if (!stateNode) {\n    // Work in progress (ex: onload events in incremental mode).\n    return null;\n  }\n\n  var props = getFiberCurrentPropsFromNode(stateNode);\n\n  if (!props) {\n    // Work in progress.\n    return null;\n  }\n\n  listener = props[registrationName];\n\n  if (shouldPreventMouseEvent(registrationName, inst.type, props)) {\n    return null;\n  }\n\n  if (!(!listener || typeof listener === 'function')) {\n    {\n      throw Error( \"Expected `\" + registrationName + \"` listener to be a function, instead got a value of `\" + typeof listener + \"` type.\" );\n    }\n  }\n\n  return listener;\n}\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(inst, event, propagationPhase) {\n  var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n  return getListener(inst, registrationName);\n}\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing even a\n * single one.\n */\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\n\n\nfunction accumulateDirectionalDispatches(inst, phase, event) {\n  {\n    if (!inst) {\n      error('Dispatching inst must not be null');\n    }\n  }\n\n  var listener = listenerAtPhase(inst, event, phase);\n\n  if (listener) {\n    event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n  }\n}\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory.  We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\n\n\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n  if (event && event.dispatchConfig.phasedRegistrationNames) {\n    traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n  }\n}\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\n\n\nfunction accumulateDispatches(inst, ignoredDirection, event) {\n  if (inst && event && event.dispatchConfig.registrationName) {\n    var registrationName = event.dispatchConfig.registrationName;\n    var listener = getListener(inst, registrationName);\n\n    if (listener) {\n      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n    }\n  }\n}\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\n\n\nfunction accumulateDirectDispatchesSingle(event) {\n  if (event && event.dispatchConfig.registrationName) {\n    accumulateDispatches(event._targetInst, null, event);\n  }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\nfunction accumulateEnterLeaveDispatches(leave, enter, from, to) {\n  traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n}\nfunction accumulateDirectDispatches(events) {\n  forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n/**\n * These variables store information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n *\n */\nvar root = null;\nvar startText = null;\nvar fallbackText = null;\nfunction initialize(nativeEventTarget) {\n  root = nativeEventTarget;\n  startText = getText();\n  return true;\n}\nfunction reset() {\n  root = null;\n  startText = null;\n  fallbackText = null;\n}\nfunction getData() {\n  if (fallbackText) {\n    return fallbackText;\n  }\n\n  var start;\n  var startValue = startText;\n  var startLength = startValue.length;\n  var end;\n  var endValue = getText();\n  var endLength = endValue.length;\n\n  for (start = 0; start < startLength; start++) {\n    if (startValue[start] !== endValue[start]) {\n      break;\n    }\n  }\n\n  var minEnd = startLength - start;\n\n  for (end = 1; end <= minEnd; end++) {\n    if (startValue[startLength - end] !== endValue[endLength - end]) {\n      break;\n    }\n  }\n\n  var sliceTail = end > 1 ? 1 - end : undefined;\n  fallbackText = endValue.slice(start, sliceTail);\n  return fallbackText;\n}\nfunction getText() {\n  if ('value' in root) {\n    return root.value;\n  }\n\n  return root.textContent;\n}\n\nvar EVENT_POOL_SIZE = 10;\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar EventInterface = {\n  type: null,\n  target: null,\n  // currentTarget is set when dispatching; no use in copying it here\n  currentTarget: function () {\n    return null;\n  },\n  eventPhase: null,\n  bubbles: null,\n  cancelable: null,\n  timeStamp: function (event) {\n    return event.timeStamp || Date.now();\n  },\n  defaultPrevented: null,\n  isTrusted: null\n};\n\nfunction functionThatReturnsTrue() {\n  return true;\n}\n\nfunction functionThatReturnsFalse() {\n  return false;\n}\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {*} targetInst Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @param {DOMEventTarget} nativeEventTarget Target node.\n */\n\n\nfunction SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n  {\n    // these have a getter/setter for warnings\n    delete this.nativeEvent;\n    delete this.preventDefault;\n    delete this.stopPropagation;\n    delete this.isDefaultPrevented;\n    delete this.isPropagationStopped;\n  }\n\n  this.dispatchConfig = dispatchConfig;\n  this._targetInst = targetInst;\n  this.nativeEvent = nativeEvent;\n  var Interface = this.constructor.Interface;\n\n  for (var propName in Interface) {\n    if (!Interface.hasOwnProperty(propName)) {\n      continue;\n    }\n\n    {\n      delete this[propName]; // this has a getter/setter for warnings\n    }\n\n    var normalize = Interface[propName];\n\n    if (normalize) {\n      this[propName] = normalize(nativeEvent);\n    } else {\n      if (propName === 'target') {\n        this.target = nativeEventTarget;\n      } else {\n        this[propName] = nativeEvent[propName];\n      }\n    }\n  }\n\n  var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n\n  if (defaultPrevented) {\n    this.isDefaultPrevented = functionThatReturnsTrue;\n  } else {\n    this.isDefaultPrevented = functionThatReturnsFalse;\n  }\n\n  this.isPropagationStopped = functionThatReturnsFalse;\n  return this;\n}\n\n_assign(SyntheticEvent.prototype, {\n  preventDefault: function () {\n    this.defaultPrevented = true;\n    var event = this.nativeEvent;\n\n    if (!event) {\n      return;\n    }\n\n    if (event.preventDefault) {\n      event.preventDefault();\n    } else if (typeof event.returnValue !== 'unknown') {\n      event.returnValue = false;\n    }\n\n    this.isDefaultPrevented = functionThatReturnsTrue;\n  },\n  stopPropagation: function () {\n    var event = this.nativeEvent;\n\n    if (!event) {\n      return;\n    }\n\n    if (event.stopPropagation) {\n      event.stopPropagation();\n    } else if (typeof event.cancelBubble !== 'unknown') {\n      // The ChangeEventPlugin registers a \"propertychange\" event for\n      // IE. This event does not support bubbling or cancelling, and\n      // any references to cancelBubble throw \"Member not found\".  A\n      // typeof check of \"unknown\" circumvents this issue (and is also\n      // IE specific).\n      event.cancelBubble = true;\n    }\n\n    this.isPropagationStopped = functionThatReturnsTrue;\n  },\n\n  /**\n   * We release all dispatched `SyntheticEvent`s after each event loop, adding\n   * them back into the pool. This allows a way to hold onto a reference that\n   * won't be added back into the pool.\n   */\n  persist: function () {\n    this.isPersistent = functionThatReturnsTrue;\n  },\n\n  /**\n   * Checks if this event should be released back into the pool.\n   *\n   * @return {boolean} True if this should not be released, false otherwise.\n   */\n  isPersistent: functionThatReturnsFalse,\n\n  /**\n   * `PooledClass` looks for `destructor` on each instance it releases.\n   */\n  destructor: function () {\n    var Interface = this.constructor.Interface;\n\n    for (var propName in Interface) {\n      {\n        Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n      }\n    }\n\n    this.dispatchConfig = null;\n    this._targetInst = null;\n    this.nativeEvent = null;\n    this.isDefaultPrevented = functionThatReturnsFalse;\n    this.isPropagationStopped = functionThatReturnsFalse;\n    this._dispatchListeners = null;\n    this._dispatchInstances = null;\n\n    {\n      Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));\n      Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));\n      Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));\n      Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));\n      Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));\n    }\n  }\n});\n\nSyntheticEvent.Interface = EventInterface;\n/**\n * Helper to reduce boilerplate when creating subclasses.\n */\n\nSyntheticEvent.extend = function (Interface) {\n  var Super = this;\n\n  var E = function () {};\n\n  E.prototype = Super.prototype;\n  var prototype = new E();\n\n  function Class() {\n    return Super.apply(this, arguments);\n  }\n\n  _assign(prototype, Class.prototype);\n\n  Class.prototype = prototype;\n  Class.prototype.constructor = Class;\n  Class.Interface = _assign({}, Super.Interface, Interface);\n  Class.extend = Super.extend;\n  addEventPoolingTo(Class);\n  return Class;\n};\n\naddEventPoolingTo(SyntheticEvent);\n/**\n * Helper to nullify syntheticEvent instance properties when destructing\n *\n * @param {String} propName\n * @param {?object} getVal\n * @return {object} defineProperty object\n */\n\nfunction getPooledWarningPropertyDefinition(propName, getVal) {\n  var isFunction = typeof getVal === 'function';\n  return {\n    configurable: true,\n    set: set,\n    get: get\n  };\n\n  function set(val) {\n    var action = isFunction ? 'setting the method' : 'setting the property';\n    warn(action, 'This is effectively a no-op');\n    return val;\n  }\n\n  function get() {\n    var action = isFunction ? 'accessing the method' : 'accessing the property';\n    var result = isFunction ? 'This is a no-op function' : 'This is set to null';\n    warn(action, result);\n    return getVal;\n  }\n\n  function warn(action, result) {\n    {\n      error(\"This synthetic event is reused for performance reasons. If you're seeing this, \" + \"you're %s `%s` on a released/nullified synthetic event. %s. \" + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result);\n    }\n  }\n}\n\nfunction getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {\n  var EventConstructor = this;\n\n  if (EventConstructor.eventPool.length) {\n    var instance = EventConstructor.eventPool.pop();\n    EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);\n    return instance;\n  }\n\n  return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);\n}\n\nfunction releasePooledEvent(event) {\n  var EventConstructor = this;\n\n  if (!(event instanceof EventConstructor)) {\n    {\n      throw Error( \"Trying to release an event instance into a pool of a different type.\" );\n    }\n  }\n\n  event.destructor();\n\n  if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {\n    EventConstructor.eventPool.push(event);\n  }\n}\n\nfunction addEventPoolingTo(EventConstructor) {\n  EventConstructor.eventPool = [];\n  EventConstructor.getPooled = getPooledEvent;\n  EventConstructor.release = releasePooledEvent;\n}\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\n\nvar SyntheticCompositionEvent = SyntheticEvent.extend({\n  data: null\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n *      /#events-inputevents\n */\n\nvar SyntheticInputEvent = SyntheticEvent.extend({\n  data: null\n});\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\n\nvar START_KEYCODE = 229;\nvar canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;\nvar documentMode = null;\n\nif (canUseDOM && 'documentMode' in document) {\n  documentMode = document.documentMode;\n} // Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\n\n\nvar canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\n\nvar useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names.\n\nvar eventTypes = {\n  beforeInput: {\n    phasedRegistrationNames: {\n      bubbled: 'onBeforeInput',\n      captured: 'onBeforeInputCapture'\n    },\n    dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]\n  },\n  compositionEnd: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionEnd',\n      captured: 'onCompositionEndCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  },\n  compositionStart: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionStart',\n      captured: 'onCompositionStartCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  },\n  compositionUpdate: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionUpdate',\n      captured: 'onCompositionUpdateCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  }\n}; // Track whether we've ever handled a keypress on the space key.\n\nvar hasSpaceKeypress = false;\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\n\nfunction isKeypressCommand(nativeEvent) {\n  return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n  !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\n\n\nfunction getCompositionEventType(topLevelType) {\n  switch (topLevelType) {\n    case TOP_COMPOSITION_START:\n      return eventTypes.compositionStart;\n\n    case TOP_COMPOSITION_END:\n      return eventTypes.compositionEnd;\n\n    case TOP_COMPOSITION_UPDATE:\n      return eventTypes.compositionUpdate;\n  }\n}\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n  return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;\n}\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_KEY_UP:\n      // Command keys insert or clear IME input.\n      return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n\n    case TOP_KEY_DOWN:\n      // Expect IME keyCode on each keydown. If we get any other\n      // code we must have exited earlier.\n      return nativeEvent.keyCode !== START_KEYCODE;\n\n    case TOP_KEY_PRESS:\n    case TOP_MOUSE_DOWN:\n    case TOP_BLUR:\n      // Events are not possible without cancelling IME.\n      return true;\n\n    default:\n      return false;\n  }\n}\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\n\n\nfunction getDataFromCustomEvent(nativeEvent) {\n  var detail = nativeEvent.detail;\n\n  if (typeof detail === 'object' && 'data' in detail) {\n    return detail.data;\n  }\n\n  return null;\n}\n/**\n * Check if a composition event was triggered by Korean IME.\n * Our fallback mode does not work well with IE's Korean IME,\n * so just use native composition events when Korean IME is used.\n * Although CompositionEvent.locale property is deprecated,\n * it is available in IE, where our fallback mode is enabled.\n *\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isUsingKoreanIME(nativeEvent) {\n  return nativeEvent.locale === 'ko';\n} // Track the current IME composition status, if any.\n\n\nvar isComposing = false;\n/**\n * @return {?object} A SyntheticCompositionEvent.\n */\n\nfunction extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var eventType;\n  var fallbackData;\n\n  if (canUseCompositionEvent) {\n    eventType = getCompositionEventType(topLevelType);\n  } else if (!isComposing) {\n    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n      eventType = eventTypes.compositionStart;\n    }\n  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n    eventType = eventTypes.compositionEnd;\n  }\n\n  if (!eventType) {\n    return null;\n  }\n\n  if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {\n    // The current composition is stored statically and must not be\n    // overwritten while composition continues.\n    if (!isComposing && eventType === eventTypes.compositionStart) {\n      isComposing = initialize(nativeEventTarget);\n    } else if (eventType === eventTypes.compositionEnd) {\n      if (isComposing) {\n        fallbackData = getData();\n      }\n    }\n  }\n\n  var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n\n  if (fallbackData) {\n    // Inject data generated from fallback path into the synthetic event.\n    // This matches the property of native CompositionEventInterface.\n    event.data = fallbackData;\n  } else {\n    var customData = getDataFromCustomEvent(nativeEvent);\n\n    if (customData !== null) {\n      event.data = customData;\n    }\n  }\n\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * @param {TopLevelType} topLevelType Number from `TopLevelType`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\n\n\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_COMPOSITION_END:\n      return getDataFromCustomEvent(nativeEvent);\n\n    case TOP_KEY_PRESS:\n      /**\n       * If native `textInput` events are available, our goal is to make\n       * use of them. However, there is a special case: the spacebar key.\n       * In Webkit, preventing default on a spacebar `textInput` event\n       * cancels character insertion, but it *also* causes the browser\n       * to fall back to its default spacebar behavior of scrolling the\n       * page.\n       *\n       * Tracking at:\n       * https://code.google.com/p/chromium/issues/detail?id=355103\n       *\n       * To avoid this issue, use the keypress event as if no `textInput`\n       * event is available.\n       */\n      var which = nativeEvent.which;\n\n      if (which !== SPACEBAR_CODE) {\n        return null;\n      }\n\n      hasSpaceKeypress = true;\n      return SPACEBAR_CHAR;\n\n    case TOP_TEXT_INPUT:\n      // Record the characters to be added to the DOM.\n      var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled\n      // it at the keypress level and bail immediately. Android Chrome\n      // doesn't give us keycodes, so we need to ignore it.\n\n      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n        return null;\n      }\n\n      return chars;\n\n    default:\n      // For other native event types, do nothing.\n      return null;\n  }\n}\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {number} topLevelType Number from `TopLevelEventTypes`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\n\n\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n  // If we are currently composing (IME) and using a fallback to do so,\n  // try to extract the composed characters from the fallback object.\n  // If composition event is available, we extract a string only at\n  // compositionevent, otherwise extract it at fallback events.\n  if (isComposing) {\n    if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n      var chars = getData();\n      reset();\n      isComposing = false;\n      return chars;\n    }\n\n    return null;\n  }\n\n  switch (topLevelType) {\n    case TOP_PASTE:\n      // If a paste event occurs after a keypress, throw out the input\n      // chars. Paste events should not lead to BeforeInput events.\n      return null;\n\n    case TOP_KEY_PRESS:\n      /**\n       * As of v27, Firefox may fire keypress events even when no character\n       * will be inserted. A few possibilities:\n       *\n       * - `which` is `0`. Arrow keys, Esc key, etc.\n       *\n       * - `which` is the pressed key code, but no char is available.\n       *   Ex: 'AltGr + d` in Polish. There is no modified character for\n       *   this key combination and no character is inserted into the\n       *   document, but FF fires the keypress for char code `100` anyway.\n       *   No `input` event will occur.\n       *\n       * - `which` is the pressed key code, but a command combination is\n       *   being used. Ex: `Cmd+C`. No character is inserted, and no\n       *   `input` event will occur.\n       */\n      if (!isKeypressCommand(nativeEvent)) {\n        // IE fires the `keypress` event when a user types an emoji via\n        // Touch keyboard of Windows.  In such a case, the `char` property\n        // holds an emoji character like `\\uD83D\\uDE0A`.  Because its length\n        // is 2, the property `which` does not represent an emoji correctly.\n        // In such a case, we directly return the `char` property instead of\n        // using `which`.\n        if (nativeEvent.char && nativeEvent.char.length > 1) {\n          return nativeEvent.char;\n        } else if (nativeEvent.which) {\n          return String.fromCharCode(nativeEvent.which);\n        }\n      }\n\n      return null;\n\n    case TOP_COMPOSITION_END:\n      return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;\n\n    default:\n      return null;\n  }\n}\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @return {?object} A SyntheticInputEvent.\n */\n\n\nfunction extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var chars;\n\n  if (canUseTextInputEvent) {\n    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n  } else {\n    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n  } // If no characters are being inserted, no BeforeInput event should\n  // be fired.\n\n\n  if (!chars) {\n    return null;\n  }\n\n  var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n  event.data = chars;\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\n\n\nvar BeforeInputEventPlugin = {\n  eventTypes: eventTypes,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n    var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n\n    if (composition === null) {\n      return beforeInput;\n    }\n\n    if (beforeInput === null) {\n      return composition;\n    }\n\n    return [composition, beforeInput];\n  }\n};\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n  color: true,\n  date: true,\n  datetime: true,\n  'datetime-local': true,\n  email: true,\n  month: true,\n  number: true,\n  password: true,\n  range: true,\n  search: true,\n  tel: true,\n  text: true,\n  time: true,\n  url: true,\n  week: true\n};\n\nfunction isTextInputElement(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\n  if (nodeName === 'input') {\n    return !!supportedInputTypes[elem.type];\n  }\n\n  if (nodeName === 'textarea') {\n    return true;\n  }\n\n  return false;\n}\n\nvar eventTypes$1 = {\n  change: {\n    phasedRegistrationNames: {\n      bubbled: 'onChange',\n      captured: 'onChangeCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]\n  }\n};\n\nfunction createAndAccumulateChangeEvent(inst, nativeEvent, target) {\n  var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target);\n  event.type = 'change'; // Flag this event loop as needing state restore.\n\n  enqueueStateRestore(target);\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * For IE shims\n */\n\n\nvar activeElement = null;\nvar activeElementInst = null;\n/**\n * SECTION: handle `change` event\n */\n\nfunction shouldUseChangeEvent(elem) {\n  var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n  var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the\n  // other events and have it go through ReactBrowserEventEmitter. Since it\n  // doesn't, we manually listen for the events and so we have to enqueue and\n  // process the abstract event manually.\n  //\n  // Batching is necessary here in order to ensure that all event handlers run\n  // before the next rerender (including event handlers attached to ancestor\n  // elements instead of directly on the input). Without this, controlled\n  // components don't work properly in conjunction with event bubbling because\n  // the component is rerendered and the value reverted before all the event\n  // handlers can run. See https://github.com/facebook/react/issues/708.\n\n  batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n  runEventsInBatch(event);\n}\n\nfunction getInstIfValueChanged(targetInst) {\n  var targetNode = getNodeFromInstance$1(targetInst);\n\n  if (updateValueIfChanged(targetNode)) {\n    return targetInst;\n  }\n}\n\nfunction getTargetInstForChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_CHANGE) {\n    return targetInst;\n  }\n}\n/**\n * SECTION: handle `input` event\n */\n\n\nvar isInputEventSupported = false;\n\nif (canUseDOM) {\n  // IE9 claims to support the input event but fails to trigger it when\n  // deleting text, so we ignore its input events.\n  isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);\n}\n/**\n * (For IE <=9) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\n\n\nfunction startWatchingForValueChange(target, targetInst) {\n  activeElement = target;\n  activeElementInst = targetInst;\n  activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n/**\n * (For IE <=9) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\n\n\nfunction stopWatchingForValueChange() {\n  if (!activeElement) {\n    return;\n  }\n\n  activeElement.detachEvent('onpropertychange', handlePropertyChange);\n  activeElement = null;\n  activeElementInst = null;\n}\n/**\n * (For IE <=9) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\n\n\nfunction handlePropertyChange(nativeEvent) {\n  if (nativeEvent.propertyName !== 'value') {\n    return;\n  }\n\n  if (getInstIfValueChanged(activeElementInst)) {\n    manualDispatchChangeEvent(nativeEvent);\n  }\n}\n\nfunction handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {\n  if (topLevelType === TOP_FOCUS) {\n    // In IE9, propertychange fires for most input events but is buggy and\n    // doesn't fire when text is deleted, but conveniently, selectionchange\n    // appears to fire in all of the remaining cases so we catch those and\n    // forward the event if the value has changed\n    // In either case, we don't want to call the event handler if the value\n    // is changed from JS so we redefine a setter for `.value` that updates\n    // our activeElementValue variable, allowing us to ignore those changes\n    //\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForValueChange();\n    startWatchingForValueChange(target, targetInst);\n  } else if (topLevelType === TOP_BLUR) {\n    stopWatchingForValueChange();\n  }\n} // For IE8 and IE9.\n\n\nfunction getTargetInstForInputEventPolyfill(topLevelType, targetInst) {\n  if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {\n    // On the selectionchange event, the target is just document which isn't\n    // helpful for us so just check activeElement instead.\n    //\n    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n    // propertychange on the first input event after setting `value` from a\n    // script and fires only keydown, keypress, keyup. Catching keyup usually\n    // gets it and catching keydown lets us fire an event for the first\n    // keystroke if user does a key repeat (it'll be a little delayed: right\n    // before the second keystroke). Other input methods (e.g., paste) seem to\n    // fire selectionchange normally.\n    return getInstIfValueChanged(activeElementInst);\n  }\n}\n/**\n * SECTION: handle `click` event\n */\n\n\nfunction shouldUseClickEvent(elem) {\n  // Use the `click` event to detect changes to checkbox and radio inputs.\n  // This approach works across all browsers, whereas `change` does not fire\n  // until `blur` in IE8.\n  var nodeName = elem.nodeName;\n  return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetInstForClickEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_CLICK) {\n    return getInstIfValueChanged(targetInst);\n  }\n}\n\nfunction getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {\n    return getInstIfValueChanged(targetInst);\n  }\n}\n\nfunction handleControlledInputBlur(node) {\n  var state = node._wrapperState;\n\n  if (!state || !state.controlled || node.type !== 'number') {\n    return;\n  }\n\n  {\n    // If controlled, assign the value attribute to the current value on blur\n    setDefaultValue(node, 'number', node.value);\n  }\n}\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\n\n\nvar ChangeEventPlugin = {\n  eventTypes: eventTypes$1,\n  _isInputEventSupported: isInputEventSupported,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n    var getTargetInstFunc, handleEventFunc;\n\n    if (shouldUseChangeEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForChangeEvent;\n    } else if (isTextInputElement(targetNode)) {\n      if (isInputEventSupported) {\n        getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n      } else {\n        getTargetInstFunc = getTargetInstForInputEventPolyfill;\n        handleEventFunc = handleEventsForInputEventPolyfill;\n      }\n    } else if (shouldUseClickEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForClickEvent;\n    }\n\n    if (getTargetInstFunc) {\n      var inst = getTargetInstFunc(topLevelType, targetInst);\n\n      if (inst) {\n        var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);\n        return event;\n      }\n    }\n\n    if (handleEventFunc) {\n      handleEventFunc(topLevelType, targetNode, targetInst);\n    } // When blurring, set the value attribute for number inputs\n\n\n    if (topLevelType === TOP_BLUR) {\n      handleControlledInputBlur(targetNode);\n    }\n  }\n};\n\nvar SyntheticUIEvent = SyntheticEvent.extend({\n  view: null,\n  detail: null\n});\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\nvar modifierKeyToProp = {\n  Alt: 'altKey',\n  Control: 'ctrlKey',\n  Meta: 'metaKey',\n  Shift: 'shiftKey'\n}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support\n// getModifierState. If getModifierState is not supported, we map it to a set of\n// modifier keys exposed by the event. In this case, Lock-keys are not supported.\n\nfunction modifierStateGetter(keyArg) {\n  var syntheticEvent = this;\n  var nativeEvent = syntheticEvent.nativeEvent;\n\n  if (nativeEvent.getModifierState) {\n    return nativeEvent.getModifierState(keyArg);\n  }\n\n  var keyProp = modifierKeyToProp[keyArg];\n  return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n  return modifierStateGetter;\n}\n\nvar previousScreenX = 0;\nvar previousScreenY = 0; // Use flags to signal movementX/Y has already been set\n\nvar isMovementXSet = false;\nvar isMovementYSet = false;\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticMouseEvent = SyntheticUIEvent.extend({\n  screenX: null,\n  screenY: null,\n  clientX: null,\n  clientY: null,\n  pageX: null,\n  pageY: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  getModifierState: getEventModifierState,\n  button: null,\n  buttons: null,\n  relatedTarget: function (event) {\n    return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n  },\n  movementX: function (event) {\n    if ('movementX' in event) {\n      return event.movementX;\n    }\n\n    var screenX = previousScreenX;\n    previousScreenX = event.screenX;\n\n    if (!isMovementXSet) {\n      isMovementXSet = true;\n      return 0;\n    }\n\n    return event.type === 'mousemove' ? event.screenX - screenX : 0;\n  },\n  movementY: function (event) {\n    if ('movementY' in event) {\n      return event.movementY;\n    }\n\n    var screenY = previousScreenY;\n    previousScreenY = event.screenY;\n\n    if (!isMovementYSet) {\n      isMovementYSet = true;\n      return 0;\n    }\n\n    return event.type === 'mousemove' ? event.screenY - screenY : 0;\n  }\n});\n\n/**\n * @interface PointerEvent\n * @see http://www.w3.org/TR/pointerevents/\n */\n\nvar SyntheticPointerEvent = SyntheticMouseEvent.extend({\n  pointerId: null,\n  width: null,\n  height: null,\n  pressure: null,\n  tangentialPressure: null,\n  tiltX: null,\n  tiltY: null,\n  twist: null,\n  pointerType: null,\n  isPrimary: null\n});\n\nvar eventTypes$2 = {\n  mouseEnter: {\n    registrationName: 'onMouseEnter',\n    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n  },\n  mouseLeave: {\n    registrationName: 'onMouseLeave',\n    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n  },\n  pointerEnter: {\n    registrationName: 'onPointerEnter',\n    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n  },\n  pointerLeave: {\n    registrationName: 'onPointerLeave',\n    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n  }\n};\nvar EnterLeaveEventPlugin = {\n  eventTypes: eventTypes$2,\n\n  /**\n   * For almost every interaction we care about, there will be both a top-level\n   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n   * we do not extract duplicate events. However, moving the mouse into the\n   * browser from outside will not fire a `mouseout` event. In this case, we use\n   * the `mouseover` top-level event.\n   */\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;\n    var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;\n\n    if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n      // If this is an over event with a target, then we've already dispatched\n      // the event in the out event of the other target. If this is replayed,\n      // then it's because we couldn't dispatch against this target previously\n      // so we have to do it now instead.\n      return null;\n    }\n\n    if (!isOutEvent && !isOverEvent) {\n      // Must not be a mouse or pointer in or out - ignoring.\n      return null;\n    }\n\n    var win;\n\n    if (nativeEventTarget.window === nativeEventTarget) {\n      // `nativeEventTarget` is probably a window object.\n      win = nativeEventTarget;\n    } else {\n      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n      var doc = nativeEventTarget.ownerDocument;\n\n      if (doc) {\n        win = doc.defaultView || doc.parentWindow;\n      } else {\n        win = window;\n      }\n    }\n\n    var from;\n    var to;\n\n    if (isOutEvent) {\n      from = targetInst;\n      var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n      to = related ? getClosestInstanceFromNode(related) : null;\n\n      if (to !== null) {\n        var nearestMounted = getNearestMountedFiber(to);\n\n        if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {\n          to = null;\n        }\n      }\n    } else {\n      // Moving to a node from outside the window.\n      from = null;\n      to = targetInst;\n    }\n\n    if (from === to) {\n      // Nothing pertains to our managed components.\n      return null;\n    }\n\n    var eventInterface, leaveEventType, enterEventType, eventTypePrefix;\n\n    if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {\n      eventInterface = SyntheticMouseEvent;\n      leaveEventType = eventTypes$2.mouseLeave;\n      enterEventType = eventTypes$2.mouseEnter;\n      eventTypePrefix = 'mouse';\n    } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {\n      eventInterface = SyntheticPointerEvent;\n      leaveEventType = eventTypes$2.pointerLeave;\n      enterEventType = eventTypes$2.pointerEnter;\n      eventTypePrefix = 'pointer';\n    }\n\n    var fromNode = from == null ? win : getNodeFromInstance$1(from);\n    var toNode = to == null ? win : getNodeFromInstance$1(to);\n    var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);\n    leave.type = eventTypePrefix + 'leave';\n    leave.target = fromNode;\n    leave.relatedTarget = toNode;\n    var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);\n    enter.type = eventTypePrefix + 'enter';\n    enter.target = toNode;\n    enter.relatedTarget = fromNode;\n    accumulateEnterLeaveDispatches(leave, enter, from, to); // If we are not processing the first ancestor, then we\n    // should not process the same nativeEvent again, as we\n    // will have already processed it in the first ancestor.\n\n    if ((eventSystemFlags & IS_FIRST_ANCESTOR) === 0) {\n      return [leave];\n    }\n\n    return [leave, enter];\n  }\n};\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n  ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\nvar hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\n\nfunction shallowEqual(objA, objB) {\n  if (objectIs(objA, objB)) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  } // Test for A's keys different from B.\n\n\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvar skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;\nvar eventTypes$3 = {\n  select: {\n    phasedRegistrationNames: {\n      bubbled: 'onSelect',\n      captured: 'onSelectCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]\n  }\n};\nvar activeElement$1 = null;\nvar activeElementInst$1 = null;\nvar lastSelection = null;\nvar mouseDown = false;\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\n\nfunction getSelection$1(node) {\n  if ('selectionStart' in node && hasSelectionCapabilities(node)) {\n    return {\n      start: node.selectionStart,\n      end: node.selectionEnd\n    };\n  } else {\n    var win = node.ownerDocument && node.ownerDocument.defaultView || window;\n    var selection = win.getSelection();\n    return {\n      anchorNode: selection.anchorNode,\n      anchorOffset: selection.anchorOffset,\n      focusNode: selection.focusNode,\n      focusOffset: selection.focusOffset\n    };\n  }\n}\n/**\n * Get document associated with the event target.\n *\n * @param {object} nativeEventTarget\n * @return {Document}\n */\n\n\nfunction getEventTargetDocument(eventTarget) {\n  return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;\n}\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @param {object} nativeEventTarget\n * @return {?SyntheticEvent}\n */\n\n\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n  // Ensure we have the right element, and that the user is not dragging a\n  // selection (this matches native `select` event behavior). In HTML5, select\n  // fires only on input and textarea thus if there's no focused element we\n  // won't dispatch.\n  var doc = getEventTargetDocument(nativeEventTarget);\n\n  if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {\n    return null;\n  } // Only fire when selection has actually changed.\n\n\n  var currentSelection = getSelection$1(activeElement$1);\n\n  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n    lastSelection = currentSelection;\n    var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);\n    syntheticEvent.type = 'select';\n    syntheticEvent.target = activeElement$1;\n    accumulateTwoPhaseDispatches(syntheticEvent);\n    return syntheticEvent;\n  }\n\n  return null;\n}\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\n\n\nvar SelectEventPlugin = {\n  eventTypes: eventTypes$3,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, container) {\n    var containerOrDoc = container || getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do\n    // not extract events. See #3639.\n\n    if (!containerOrDoc || !isListeningToAllDependencies('onSelect', containerOrDoc)) {\n      return null;\n    }\n\n    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n\n    switch (topLevelType) {\n      // Track the input node that has focus.\n      case TOP_FOCUS:\n        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {\n          activeElement$1 = targetNode;\n          activeElementInst$1 = targetInst;\n          lastSelection = null;\n        }\n\n        break;\n\n      case TOP_BLUR:\n        activeElement$1 = null;\n        activeElementInst$1 = null;\n        lastSelection = null;\n        break;\n      // Don't fire the event while the user is dragging. This matches the\n      // semantics of the native select event.\n\n      case TOP_MOUSE_DOWN:\n        mouseDown = true;\n        break;\n\n      case TOP_CONTEXT_MENU:\n      case TOP_MOUSE_UP:\n      case TOP_DRAG_END:\n        mouseDown = false;\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n      // Chrome and IE fire non-standard event when selection is changed (and\n      // sometimes when it hasn't). IE's event fires out of order with respect\n      // to key and input events on deletion, so we discard it.\n      //\n      // Firefox doesn't support selectionchange, so check selection status\n      // after each key entry. The selection changes after keydown and before\n      // keyup, but we check on keydown as well in the case of holding down a\n      // key, when multiple keydown events are fired but only one keyup is.\n      // This is also our approach for IE handling, for the reason above.\n\n      case TOP_SELECTION_CHANGE:\n        if (skipSelectionChangeEvent) {\n          break;\n        }\n\n      // falls through\n\n      case TOP_KEY_DOWN:\n      case TOP_KEY_UP:\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n    }\n\n    return null;\n  }\n};\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent\n */\n\nvar SyntheticAnimationEvent = SyntheticEvent.extend({\n  animationName: null,\n  elapsedTime: null,\n  pseudoElement: null\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\n\nvar SyntheticClipboardEvent = SyntheticEvent.extend({\n  clipboardData: function (event) {\n    return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n  }\n});\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticFocusEvent = SyntheticUIEvent.extend({\n  relatedTarget: null\n});\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\nfunction getEventCharCode(nativeEvent) {\n  var charCode;\n  var keyCode = nativeEvent.keyCode;\n\n  if ('charCode' in nativeEvent) {\n    charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n\n    if (charCode === 0 && keyCode === 13) {\n      charCode = 13;\n    }\n  } else {\n    // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n    charCode = keyCode;\n  } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)\n  // report Enter as charCode 10 when ctrl is pressed.\n\n\n  if (charCode === 10) {\n    charCode = 13;\n  } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n  // Must not discard the (non-)printable Enter-key.\n\n\n  if (charCode >= 32 || charCode === 13) {\n    return charCode;\n  }\n\n  return 0;\n}\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\n\nvar normalizeKey = {\n  Esc: 'Escape',\n  Spacebar: ' ',\n  Left: 'ArrowLeft',\n  Up: 'ArrowUp',\n  Right: 'ArrowRight',\n  Down: 'ArrowDown',\n  Del: 'Delete',\n  Win: 'OS',\n  Menu: 'ContextMenu',\n  Apps: 'ContextMenu',\n  Scroll: 'ScrollLock',\n  MozPrintableKey: 'Unidentified'\n};\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\n\nvar translateToKey = {\n  '8': 'Backspace',\n  '9': 'Tab',\n  '12': 'Clear',\n  '13': 'Enter',\n  '16': 'Shift',\n  '17': 'Control',\n  '18': 'Alt',\n  '19': 'Pause',\n  '20': 'CapsLock',\n  '27': 'Escape',\n  '32': ' ',\n  '33': 'PageUp',\n  '34': 'PageDown',\n  '35': 'End',\n  '36': 'Home',\n  '37': 'ArrowLeft',\n  '38': 'ArrowUp',\n  '39': 'ArrowRight',\n  '40': 'ArrowDown',\n  '45': 'Insert',\n  '46': 'Delete',\n  '112': 'F1',\n  '113': 'F2',\n  '114': 'F3',\n  '115': 'F4',\n  '116': 'F5',\n  '117': 'F6',\n  '118': 'F7',\n  '119': 'F8',\n  '120': 'F9',\n  '121': 'F10',\n  '122': 'F11',\n  '123': 'F12',\n  '144': 'NumLock',\n  '145': 'ScrollLock',\n  '224': 'Meta'\n};\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\n\nfunction getEventKey(nativeEvent) {\n  if (nativeEvent.key) {\n    // Normalize inconsistent values reported by browsers due to\n    // implementations of a working draft specification.\n    // FireFox implements `key` but returns `MozPrintableKey` for all\n    // printable characters (normalized to `Unidentified`), ignore it.\n    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n\n    if (key !== 'Unidentified') {\n      return key;\n    }\n  } // Browser does not implement `key`, polyfill as much of it as we can.\n\n\n  if (nativeEvent.type === 'keypress') {\n    var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can\n    // thus be captured by `keypress`, no other non-printable key should.\n\n    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n  }\n\n  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n    // While user keyboard layout determines the actual meaning of each\n    // `keyCode` value, almost all function keys have a universal value.\n    return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n  }\n\n  return '';\n}\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticKeyboardEvent = SyntheticUIEvent.extend({\n  key: getEventKey,\n  location: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  repeat: null,\n  locale: null,\n  getModifierState: getEventModifierState,\n  // Legacy Interface\n  charCode: function (event) {\n    // `charCode` is the result of a KeyPress event and represents the value of\n    // the actual printable character.\n    // KeyPress is deprecated, but its replacement is not yet final and not\n    // implemented in any major browser. Only KeyPress has charCode.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n\n    return 0;\n  },\n  keyCode: function (event) {\n    // `keyCode` is the result of a KeyDown/Up event and represents the value of\n    // physical keyboard key.\n    // The actual meaning of the value depends on the users' keyboard layout\n    // which cannot be detected. Assuming that it is a US keyboard layout\n    // provides a surprisingly accurate mapping for US and European users.\n    // Due to this, it is left to the user to implement at this time.\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n\n    return 0;\n  },\n  which: function (event) {\n    // `which` is an alias for either `keyCode` or `charCode` depending on the\n    // type of the event.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n\n    return 0;\n  }\n});\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticDragEvent = SyntheticMouseEvent.extend({\n  dataTransfer: null\n});\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\n\nvar SyntheticTouchEvent = SyntheticUIEvent.extend({\n  touches: null,\n  targetTouches: null,\n  changedTouches: null,\n  altKey: null,\n  metaKey: null,\n  ctrlKey: null,\n  shiftKey: null,\n  getModifierState: getEventModifierState\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent\n */\n\nvar SyntheticTransitionEvent = SyntheticEvent.extend({\n  propertyName: null,\n  elapsedTime: null,\n  pseudoElement: null\n});\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticWheelEvent = SyntheticMouseEvent.extend({\n  deltaX: function (event) {\n    return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n    'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n  },\n  deltaY: function (event) {\n    return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n    'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n    'wheelDelta' in event ? -event.wheelDelta : 0;\n  },\n  deltaZ: null,\n  // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n  // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n  deltaMode: null\n});\n\nvar knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];\nvar SimpleEventPlugin = {\n  // simpleEventPluginEventTypes gets populated from\n  // the DOMEventProperties module.\n  eventTypes: simpleEventPluginEventTypes,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var dispatchConfig = topLevelEventsToDispatchConfig.get(topLevelType);\n\n    if (!dispatchConfig) {\n      return null;\n    }\n\n    var EventConstructor;\n\n    switch (topLevelType) {\n      case TOP_KEY_PRESS:\n        // Firefox creates a keypress event for function keys too. This removes\n        // the unwanted keypress events. Enter is however both printable and\n        // non-printable. One would expect Tab to be as well (but it isn't).\n        if (getEventCharCode(nativeEvent) === 0) {\n          return null;\n        }\n\n      /* falls through */\n\n      case TOP_KEY_DOWN:\n      case TOP_KEY_UP:\n        EventConstructor = SyntheticKeyboardEvent;\n        break;\n\n      case TOP_BLUR:\n      case TOP_FOCUS:\n        EventConstructor = SyntheticFocusEvent;\n        break;\n\n      case TOP_CLICK:\n        // Firefox creates a click event on right mouse clicks. This removes the\n        // unwanted click events.\n        if (nativeEvent.button === 2) {\n          return null;\n        }\n\n      /* falls through */\n\n      case TOP_AUX_CLICK:\n      case TOP_DOUBLE_CLICK:\n      case TOP_MOUSE_DOWN:\n      case TOP_MOUSE_MOVE:\n      case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events\n\n      /* falls through */\n\n      case TOP_MOUSE_OUT:\n      case TOP_MOUSE_OVER:\n      case TOP_CONTEXT_MENU:\n        EventConstructor = SyntheticMouseEvent;\n        break;\n\n      case TOP_DRAG:\n      case TOP_DRAG_END:\n      case TOP_DRAG_ENTER:\n      case TOP_DRAG_EXIT:\n      case TOP_DRAG_LEAVE:\n      case TOP_DRAG_OVER:\n      case TOP_DRAG_START:\n      case TOP_DROP:\n        EventConstructor = SyntheticDragEvent;\n        break;\n\n      case TOP_TOUCH_CANCEL:\n      case TOP_TOUCH_END:\n      case TOP_TOUCH_MOVE:\n      case TOP_TOUCH_START:\n        EventConstructor = SyntheticTouchEvent;\n        break;\n\n      case TOP_ANIMATION_END:\n      case TOP_ANIMATION_ITERATION:\n      case TOP_ANIMATION_START:\n        EventConstructor = SyntheticAnimationEvent;\n        break;\n\n      case TOP_TRANSITION_END:\n        EventConstructor = SyntheticTransitionEvent;\n        break;\n\n      case TOP_SCROLL:\n        EventConstructor = SyntheticUIEvent;\n        break;\n\n      case TOP_WHEEL:\n        EventConstructor = SyntheticWheelEvent;\n        break;\n\n      case TOP_COPY:\n      case TOP_CUT:\n      case TOP_PASTE:\n        EventConstructor = SyntheticClipboardEvent;\n        break;\n\n      case TOP_GOT_POINTER_CAPTURE:\n      case TOP_LOST_POINTER_CAPTURE:\n      case TOP_POINTER_CANCEL:\n      case TOP_POINTER_DOWN:\n      case TOP_POINTER_MOVE:\n      case TOP_POINTER_OUT:\n      case TOP_POINTER_OVER:\n      case TOP_POINTER_UP:\n        EventConstructor = SyntheticPointerEvent;\n        break;\n\n      default:\n        {\n          if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {\n            error('SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);\n          }\n        } // HTML Events\n        // @see http://www.w3.org/TR/html5/index.html#events-0\n\n\n        EventConstructor = SyntheticEvent;\n        break;\n    }\n\n    var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n    accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n};\n\n/**\n * Specifies a deterministic ordering of `EventPlugin`s. A convenient way to\n * reason about plugins, without having to package every one of them. This\n * is better than having plugins be ordered in the same order that they\n * are injected because that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\n\nvar DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];\n/**\n * Inject modules for resolving DOM hierarchy and plugin ordering.\n */\n\ninjectEventPluginOrder(DOMEventPluginOrder);\nsetComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);\n/**\n * Some important event plugins included by default (without having to require\n * them).\n */\n\ninjectEventPluginsByName({\n  SimpleEventPlugin: SimpleEventPlugin,\n  EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n  ChangeEventPlugin: ChangeEventPlugin,\n  SelectEventPlugin: SelectEventPlugin,\n  BeforeInputEventPlugin: BeforeInputEventPlugin\n});\n\n// Prefix measurements so that it's possible to filter them.\n// Longer prefixes are hard to read in DevTools.\nvar reactEmoji = \"\\u269B\";\nvar warningEmoji = \"\\u26D4\";\nvar supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause.\n// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?\n\nvar currentFiber = null; // If we're in the middle of user code, which fiber and method is it?\n// Reusing `currentFiber` would be confusing for this because user code fiber\n// can change during commit phase too, but we don't need to unwind it (since\n// lifecycles in the commit phase don't resemble a tree).\n\nvar currentPhase = null;\nvar currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem,\n// so we will keep track of it, and include it in the report.\n// Track commits caused by cascading updates.\n\nvar isCommitting = false;\nvar hasScheduledUpdateInCurrentCommit = false;\nvar hasScheduledUpdateInCurrentPhase = false;\nvar commitCountInCurrentWorkLoop = 0;\nvar effectCountInCurrentCommit = 0;\n// to avoid stretch the commit phase with measurement overhead.\n\nvar labelsInCurrentCommit = new Set();\n\nvar formatMarkName = function (markName) {\n  return reactEmoji + \" \" + markName;\n};\n\nvar formatLabel = function (label, warning) {\n  var prefix = warning ? warningEmoji + \" \" : reactEmoji + \" \";\n  var suffix = warning ? \" Warning: \" + warning : '';\n  return \"\" + prefix + label + suffix;\n};\n\nvar beginMark = function (markName) {\n  performance.mark(formatMarkName(markName));\n};\n\nvar clearMark = function (markName) {\n  performance.clearMarks(formatMarkName(markName));\n};\n\nvar endMark = function (label, markName, warning) {\n  var formattedMarkName = formatMarkName(markName);\n  var formattedLabel = formatLabel(label, warning);\n\n  try {\n    performance.measure(formattedLabel, formattedMarkName);\n  } catch (err) {} // If previous mark was missing for some reason, this will throw.\n  // This could only happen if React crashed in an unexpected place earlier.\n  // Don't pile on with more errors.\n  // Clear marks immediately to avoid growing buffer.\n\n\n  performance.clearMarks(formattedMarkName);\n  performance.clearMeasures(formattedLabel);\n};\n\nvar getFiberMarkName = function (label, debugID) {\n  return label + \" (#\" + debugID + \")\";\n};\n\nvar getFiberLabel = function (componentName, isMounted, phase) {\n  if (phase === null) {\n    // These are composite component total time measurements.\n    return componentName + \" [\" + (isMounted ? 'update' : 'mount') + \"]\";\n  } else {\n    // Composite component methods.\n    return componentName + \".\" + phase;\n  }\n};\n\nvar beginFiberMark = function (fiber, phase) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n\n  if (isCommitting && labelsInCurrentCommit.has(label)) {\n    // During the commit phase, we don't show duplicate labels because\n    // there is a fixed overhead for every measurement, and we don't\n    // want to stretch the commit phase beyond necessary.\n    return false;\n  }\n\n  labelsInCurrentCommit.add(label);\n  var markName = getFiberMarkName(label, debugID);\n  beginMark(markName);\n  return true;\n};\n\nvar clearFiberMark = function (fiber, phase) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n  var markName = getFiberMarkName(label, debugID);\n  clearMark(markName);\n};\n\nvar endFiberMark = function (fiber, phase, warning) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n  var markName = getFiberMarkName(label, debugID);\n  endMark(label, markName, warning);\n};\n\nvar shouldIgnoreFiber = function (fiber) {\n  // Host components should be skipped in the timeline.\n  // We could check typeof fiber.type, but does this work with RN?\n  switch (fiber.tag) {\n    case HostRoot:\n    case HostComponent:\n    case HostText:\n    case HostPortal:\n    case Fragment:\n    case ContextProvider:\n    case ContextConsumer:\n    case Mode:\n      return true;\n\n    default:\n      return false;\n  }\n};\n\nvar clearPendingPhaseMeasurement = function () {\n  if (currentPhase !== null && currentPhaseFiber !== null) {\n    clearFiberMark(currentPhaseFiber, currentPhase);\n  }\n\n  currentPhaseFiber = null;\n  currentPhase = null;\n  hasScheduledUpdateInCurrentPhase = false;\n};\n\nvar pauseTimers = function () {\n  // Stops all currently active measurements so that they can be resumed\n  // if we continue in a later deferred loop from the same unit of work.\n  var fiber = currentFiber;\n\n  while (fiber) {\n    if (fiber._debugIsCurrentlyTiming) {\n      endFiberMark(fiber, null, null);\n    }\n\n    fiber = fiber.return;\n  }\n};\n\nvar resumeTimersRecursively = function (fiber) {\n  if (fiber.return !== null) {\n    resumeTimersRecursively(fiber.return);\n  }\n\n  if (fiber._debugIsCurrentlyTiming) {\n    beginFiberMark(fiber, null);\n  }\n};\n\nvar resumeTimers = function () {\n  // Resumes all measurements that were active during the last deferred loop.\n  if (currentFiber !== null) {\n    resumeTimersRecursively(currentFiber);\n  }\n};\n\nfunction recordEffect() {\n  {\n    effectCountInCurrentCommit++;\n  }\n}\nfunction recordScheduleUpdate() {\n  {\n    if (isCommitting) {\n      hasScheduledUpdateInCurrentCommit = true;\n    }\n\n    if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {\n      hasScheduledUpdateInCurrentPhase = true;\n    }\n  }\n}\nfunction startWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, this is the fiber to unwind from.\n\n\n    currentFiber = fiber;\n\n    if (!beginFiberMark(fiber, null)) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = true;\n  }\n}\nfunction cancelWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // Remember we shouldn't complete measurement for this fiber.\n    // Otherwise flamechart will be deep even for small updates.\n\n\n    fiber._debugIsCurrentlyTiming = false;\n    clearFiberMark(fiber, null);\n  }\n}\nfunction stopWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, its parent is the fiber to unwind from.\n\n\n    currentFiber = fiber.return;\n\n    if (!fiber._debugIsCurrentlyTiming) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = false;\n    endFiberMark(fiber, null, null);\n  }\n}\nfunction stopFailedWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, its parent is the fiber to unwind from.\n\n\n    currentFiber = fiber.return;\n\n    if (!fiber._debugIsCurrentlyTiming) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = false;\n    var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';\n    endFiberMark(fiber, null, warning);\n  }\n}\nfunction startPhaseTimer(fiber, phase) {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    clearPendingPhaseMeasurement();\n\n    if (!beginFiberMark(fiber, phase)) {\n      return;\n    }\n\n    currentPhaseFiber = fiber;\n    currentPhase = phase;\n  }\n}\nfunction stopPhaseTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    if (currentPhase !== null && currentPhaseFiber !== null) {\n      var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;\n      endFiberMark(currentPhaseFiber, currentPhase, warning);\n    }\n\n    currentPhase = null;\n    currentPhaseFiber = null;\n  }\n}\nfunction startWorkLoopTimer(nextUnitOfWork) {\n  {\n    currentFiber = nextUnitOfWork;\n\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    commitCountInCurrentWorkLoop = 0; // This is top level call.\n    // Any other measurements are performed within.\n\n    beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop.\n\n    resumeTimers();\n  }\n}\nfunction stopWorkLoopTimer(interruptedBy, didCompleteRoot) {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var warning = null;\n\n    if (interruptedBy !== null) {\n      if (interruptedBy.tag === HostRoot) {\n        warning = 'A top-level update interrupted the previous render';\n      } else {\n        var componentName = getComponentName(interruptedBy.type) || 'Unknown';\n        warning = \"An update to \" + componentName + \" interrupted the previous render\";\n      }\n    } else if (commitCountInCurrentWorkLoop > 1) {\n      warning = 'There were cascading updates';\n    }\n\n    commitCountInCurrentWorkLoop = 0;\n    var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop.\n\n    pauseTimers();\n    endMark(label, '(React Tree Reconciliation)', warning);\n  }\n}\nfunction startCommitTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    isCommitting = true;\n    hasScheduledUpdateInCurrentCommit = false;\n    labelsInCurrentCommit.clear();\n    beginMark('(Committing Changes)');\n  }\n}\nfunction stopCommitTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var warning = null;\n\n    if (hasScheduledUpdateInCurrentCommit) {\n      warning = 'Lifecycle hook scheduled a cascading update';\n    } else if (commitCountInCurrentWorkLoop > 0) {\n      warning = 'Caused by a cascading update in earlier commit';\n    }\n\n    hasScheduledUpdateInCurrentCommit = false;\n    commitCountInCurrentWorkLoop++;\n    isCommitting = false;\n    labelsInCurrentCommit.clear();\n    endMark('(Committing Changes)', '(Committing Changes)', warning);\n  }\n}\nfunction startCommitSnapshotEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Committing Snapshot Effects)');\n  }\n}\nfunction stopCommitSnapshotEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Committing Snapshot Effects: \" + count + \" Total)\", '(Committing Snapshot Effects)', null);\n  }\n}\nfunction startCommitHostEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Committing Host Effects)');\n  }\n}\nfunction stopCommitHostEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Committing Host Effects: \" + count + \" Total)\", '(Committing Host Effects)', null);\n  }\n}\nfunction startCommitLifeCyclesTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Calling Lifecycle Methods)');\n  }\n}\nfunction stopCommitLifeCyclesTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Calling Lifecycle Methods: \" + count + \" Total)\", '(Calling Lifecycle Methods)', null);\n  }\n}\n\nvar valueStack = [];\nvar fiberStack;\n\n{\n  fiberStack = [];\n}\n\nvar index = -1;\n\nfunction createCursor(defaultValue) {\n  return {\n    current: defaultValue\n  };\n}\n\nfunction pop(cursor, fiber) {\n  if (index < 0) {\n    {\n      error('Unexpected pop.');\n    }\n\n    return;\n  }\n\n  {\n    if (fiber !== fiberStack[index]) {\n      error('Unexpected Fiber popped.');\n    }\n  }\n\n  cursor.current = valueStack[index];\n  valueStack[index] = null;\n\n  {\n    fiberStack[index] = null;\n  }\n\n  index--;\n}\n\nfunction push(cursor, value, fiber) {\n  index++;\n  valueStack[index] = cursor.current;\n\n  {\n    fiberStack[index] = fiber;\n  }\n\n  cursor.current = value;\n}\n\nvar warnedAboutMissingGetChildContext;\n\n{\n  warnedAboutMissingGetChildContext = {};\n}\n\nvar emptyContextObject = {};\n\n{\n  Object.freeze(emptyContextObject);\n} // A cursor to the current merged context object on the stack.\n\n\nvar contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.\n\nvar didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.\n// We use this to get access to the parent context after we have already\n// pushed the next context provider, and now need to merge their contexts.\n\nvar previousContext = emptyContextObject;\n\nfunction getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {\n  {\n    if (didPushOwnContextIfProvider && isContextProvider(Component)) {\n      // If the fiber is a context provider itself, when we read its context\n      // we may have already pushed its own child context on the stack. A context\n      // provider should not \"see\" its own child context. Therefore we read the\n      // previous (parent) context instead for a context provider.\n      return previousContext;\n    }\n\n    return contextStackCursor.current;\n  }\n}\n\nfunction cacheContext(workInProgress, unmaskedContext, maskedContext) {\n  {\n    var instance = workInProgress.stateNode;\n    instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;\n    instance.__reactInternalMemoizedMaskedChildContext = maskedContext;\n  }\n}\n\nfunction getMaskedContext(workInProgress, unmaskedContext) {\n  {\n    var type = workInProgress.type;\n    var contextTypes = type.contextTypes;\n\n    if (!contextTypes) {\n      return emptyContextObject;\n    } // Avoid recreating masked context unless unmasked context has changed.\n    // Failing to do this will result in unnecessary calls to componentWillReceiveProps.\n    // This may trigger infinite loops if componentWillReceiveProps calls setState.\n\n\n    var instance = workInProgress.stateNode;\n\n    if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {\n      return instance.__reactInternalMemoizedMaskedChildContext;\n    }\n\n    var context = {};\n\n    for (var key in contextTypes) {\n      context[key] = unmaskedContext[key];\n    }\n\n    {\n      var name = getComponentName(type) || 'Unknown';\n      checkPropTypes(contextTypes, context, 'context', name, getCurrentFiberStackInDev);\n    } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n    // Context is created before the class component is instantiated so check for instance.\n\n\n    if (instance) {\n      cacheContext(workInProgress, unmaskedContext, context);\n    }\n\n    return context;\n  }\n}\n\nfunction hasContextChanged() {\n  {\n    return didPerformWorkStackCursor.current;\n  }\n}\n\nfunction isContextProvider(type) {\n  {\n    var childContextTypes = type.childContextTypes;\n    return childContextTypes !== null && childContextTypes !== undefined;\n  }\n}\n\nfunction popContext(fiber) {\n  {\n    pop(didPerformWorkStackCursor, fiber);\n    pop(contextStackCursor, fiber);\n  }\n}\n\nfunction popTopLevelContextObject(fiber) {\n  {\n    pop(didPerformWorkStackCursor, fiber);\n    pop(contextStackCursor, fiber);\n  }\n}\n\nfunction pushTopLevelContextObject(fiber, context, didChange) {\n  {\n    if (!(contextStackCursor.current === emptyContextObject)) {\n      {\n        throw Error( \"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    push(contextStackCursor, context, fiber);\n    push(didPerformWorkStackCursor, didChange, fiber);\n  }\n}\n\nfunction processChildContext(fiber, type, parentContext) {\n  {\n    var instance = fiber.stateNode;\n    var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.\n    // It has only been added in Fiber to match the (unintentional) behavior in Stack.\n\n    if (typeof instance.getChildContext !== 'function') {\n      {\n        var componentName = getComponentName(type) || 'Unknown';\n\n        if (!warnedAboutMissingGetChildContext[componentName]) {\n          warnedAboutMissingGetChildContext[componentName] = true;\n\n          error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);\n        }\n      }\n\n      return parentContext;\n    }\n\n    var childContext;\n    startPhaseTimer(fiber, 'getChildContext');\n    childContext = instance.getChildContext();\n    stopPhaseTimer();\n\n    for (var contextKey in childContext) {\n      if (!(contextKey in childContextTypes)) {\n        {\n          throw Error( (getComponentName(type) || 'Unknown') + \".getChildContext(): key \\\"\" + contextKey + \"\\\" is not defined in childContextTypes.\" );\n        }\n      }\n    }\n\n    {\n      var name = getComponentName(type) || 'Unknown';\n      checkPropTypes(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when\n      // somebody calls unstable_renderSubtreeIntoContainer() and we process\n      // context from the parent component instance. The stack will be missing\n      // because it's outside of the reconciliation, and so the pointer has not\n      // been set. This is rare and doesn't matter. We'll also remove that API.\n      getCurrentFiberStackInDev);\n    }\n\n    return _assign({}, parentContext, {}, childContext);\n  }\n}\n\nfunction pushContextProvider(workInProgress) {\n  {\n    var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.\n    // If the instance does not exist yet, we will push null at first,\n    // and replace it on the stack later when invalidating the context.\n\n    var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.\n    // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.\n\n    previousContext = contextStackCursor.current;\n    push(contextStackCursor, memoizedMergedChildContext, workInProgress);\n    push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);\n    return true;\n  }\n}\n\nfunction invalidateContextProvider(workInProgress, type, didChange) {\n  {\n    var instance = workInProgress.stateNode;\n\n    if (!instance) {\n      {\n        throw Error( \"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    if (didChange) {\n      // Merge parent and own context.\n      // Skip this if we're not updating due to sCU.\n      // This avoids unnecessarily recomputing memoized values.\n      var mergedContext = processChildContext(workInProgress, type, previousContext);\n      instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.\n      // It is important to unwind the context in the reverse order.\n\n      pop(didPerformWorkStackCursor, workInProgress);\n      pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.\n\n      push(contextStackCursor, mergedContext, workInProgress);\n      push(didPerformWorkStackCursor, didChange, workInProgress);\n    } else {\n      pop(didPerformWorkStackCursor, workInProgress);\n      push(didPerformWorkStackCursor, didChange, workInProgress);\n    }\n  }\n}\n\nfunction findCurrentUnmaskedContext(fiber) {\n  {\n    // Currently this is only used with renderSubtreeIntoContainer; not sure if it\n    // makes sense elsewhere\n    if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) {\n      {\n        throw Error( \"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    var node = fiber;\n\n    do {\n      switch (node.tag) {\n        case HostRoot:\n          return node.stateNode.context;\n\n        case ClassComponent:\n          {\n            var Component = node.type;\n\n            if (isContextProvider(Component)) {\n              return node.stateNode.__reactInternalMemoizedMergedChildContext;\n            }\n\n            break;\n          }\n      }\n\n      node = node.return;\n    } while (node !== null);\n\n    {\n      {\n        throw Error( \"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n}\n\nvar LegacyRoot = 0;\nvar BlockingRoot = 1;\nvar ConcurrentRoot = 2;\n\nvar Scheduler_runWithPriority = Scheduler.unstable_runWithPriority,\n    Scheduler_scheduleCallback = Scheduler.unstable_scheduleCallback,\n    Scheduler_cancelCallback = Scheduler.unstable_cancelCallback,\n    Scheduler_shouldYield = Scheduler.unstable_shouldYield,\n    Scheduler_requestPaint = Scheduler.unstable_requestPaint,\n    Scheduler_now = Scheduler.unstable_now,\n    Scheduler_getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n    Scheduler_ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n    Scheduler_UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n    Scheduler_NormalPriority = Scheduler.unstable_NormalPriority,\n    Scheduler_LowPriority = Scheduler.unstable_LowPriority,\n    Scheduler_IdlePriority = Scheduler.unstable_IdlePriority;\n\n{\n  // Provide explicit error message when production+profiling bundle of e.g.\n  // react-dom is used with production (non-profiling) bundle of\n  // scheduler/tracing\n  if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) {\n    {\n      throw Error( \"It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling\" );\n    }\n  }\n}\n\nvar fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use\n// ascending numbers so we can compare them like numbers. They start at 90 to\n// avoid clashing with Scheduler's priorities.\n\nvar ImmediatePriority = 99;\nvar UserBlockingPriority$1 = 98;\nvar NormalPriority = 97;\nvar LowPriority = 96;\nvar IdlePriority = 95; // NoPriority is the absence of priority. Also React-only.\n\nvar NoPriority = 90;\nvar shouldYield = Scheduler_shouldYield;\nvar requestPaint = // Fall back gracefully if we're running an older version of Scheduler.\nScheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {};\nvar syncQueue = null;\nvar immediateQueueCallbackNode = null;\nvar isFlushingSyncQueue = false;\nvar initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly.\n// This will be the case for modern browsers that support `performance.now`. In\n// older browsers, Scheduler falls back to `Date.now`, which returns a Unix\n// timestamp. In that case, subtract the module initialization time to simulate\n// the behavior of performance.now and keep our times small enough to fit\n// within 32 bits.\n// TODO: Consider lifting this into Scheduler.\n\nvar now = initialTimeMs < 10000 ? Scheduler_now : function () {\n  return Scheduler_now() - initialTimeMs;\n};\nfunction getCurrentPriorityLevel() {\n  switch (Scheduler_getCurrentPriorityLevel()) {\n    case Scheduler_ImmediatePriority:\n      return ImmediatePriority;\n\n    case Scheduler_UserBlockingPriority:\n      return UserBlockingPriority$1;\n\n    case Scheduler_NormalPriority:\n      return NormalPriority;\n\n    case Scheduler_LowPriority:\n      return LowPriority;\n\n    case Scheduler_IdlePriority:\n      return IdlePriority;\n\n    default:\n      {\n        {\n          throw Error( \"Unknown priority level.\" );\n        }\n      }\n\n  }\n}\n\nfunction reactPriorityToSchedulerPriority(reactPriorityLevel) {\n  switch (reactPriorityLevel) {\n    case ImmediatePriority:\n      return Scheduler_ImmediatePriority;\n\n    case UserBlockingPriority$1:\n      return Scheduler_UserBlockingPriority;\n\n    case NormalPriority:\n      return Scheduler_NormalPriority;\n\n    case LowPriority:\n      return Scheduler_LowPriority;\n\n    case IdlePriority:\n      return Scheduler_IdlePriority;\n\n    default:\n      {\n        {\n          throw Error( \"Unknown priority level.\" );\n        }\n      }\n\n  }\n}\n\nfunction runWithPriority$1(reactPriorityLevel, fn) {\n  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n  return Scheduler_runWithPriority(priorityLevel, fn);\n}\nfunction scheduleCallback(reactPriorityLevel, callback, options) {\n  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n  return Scheduler_scheduleCallback(priorityLevel, callback, options);\n}\nfunction scheduleSyncCallback(callback) {\n  // Push this callback into an internal queue. We'll flush these either in\n  // the next tick, or earlier if something calls `flushSyncCallbackQueue`.\n  if (syncQueue === null) {\n    syncQueue = [callback]; // Flush the queue in the next tick, at the earliest.\n\n    immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl);\n  } else {\n    // Push onto existing queue. Don't need to schedule a callback because\n    // we already scheduled one when we created the queue.\n    syncQueue.push(callback);\n  }\n\n  return fakeCallbackNode;\n}\nfunction cancelCallback(callbackNode) {\n  if (callbackNode !== fakeCallbackNode) {\n    Scheduler_cancelCallback(callbackNode);\n  }\n}\nfunction flushSyncCallbackQueue() {\n  if (immediateQueueCallbackNode !== null) {\n    var node = immediateQueueCallbackNode;\n    immediateQueueCallbackNode = null;\n    Scheduler_cancelCallback(node);\n  }\n\n  flushSyncCallbackQueueImpl();\n}\n\nfunction flushSyncCallbackQueueImpl() {\n  if (!isFlushingSyncQueue && syncQueue !== null) {\n    // Prevent re-entrancy.\n    isFlushingSyncQueue = true;\n    var i = 0;\n\n    try {\n      var _isSync = true;\n      var queue = syncQueue;\n      runWithPriority$1(ImmediatePriority, function () {\n        for (; i < queue.length; i++) {\n          var callback = queue[i];\n\n          do {\n            callback = callback(_isSync);\n          } while (callback !== null);\n        }\n      });\n      syncQueue = null;\n    } catch (error) {\n      // If something throws, leave the remaining callbacks on the queue.\n      if (syncQueue !== null) {\n        syncQueue = syncQueue.slice(i + 1);\n      } // Resume flushing in the next tick\n\n\n      Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue);\n      throw error;\n    } finally {\n      isFlushingSyncQueue = false;\n    }\n  }\n}\n\nvar NoMode = 0;\nvar StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root\n// tag instead\n\nvar BlockingMode = 2;\nvar ConcurrentMode = 4;\nvar ProfileMode = 8;\n\n// Max 31 bit integer. The max integer size in V8 for 32-bit systems.\n// Math.pow(2, 30) - 1\n// 0b111111111111111111111111111111\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\n\nvar NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that\n// Never work can be committed in an inconsistent state without tearing the UI.\n// The main example is offscreen content, like a hidden subtree. So one possible\n// name is Offscreen. However, it also includes dehydrated Suspense boundaries,\n// which are inconsistent in the sense that they haven't finished yet, but\n// aren't visibly inconsistent because the server rendered HTML matches what the\n// hydrated tree would look like.\n\nvar Never = 1; // Idle is slightly higher priority than Never. It must completely finish in\n// order to be consistent.\n\nvar Idle = 2; // Continuous Hydration is slightly higher than Idle and is used to increase\n// priority of hover targets.\n\nvar ContinuousHydration = 3;\nvar Sync = MAX_SIGNED_31_BIT_INT;\nvar Batched = Sync - 1;\nvar UNIT_SIZE = 10;\nvar MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms.\n\nfunction msToExpirationTime(ms) {\n  // Always subtract from the offset so that we don't clash with the magic number for NoWork.\n  return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);\n}\nfunction expirationTimeToMs(expirationTime) {\n  return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;\n}\n\nfunction ceiling(num, precision) {\n  return ((num / precision | 0) + 1) * precision;\n}\n\nfunction computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {\n  return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);\n} // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update\n// the names to reflect.\n\n\nvar LOW_PRIORITY_EXPIRATION = 5000;\nvar LOW_PRIORITY_BATCH_SIZE = 250;\nfunction computeAsyncExpiration(currentTime) {\n  return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);\n}\nfunction computeSuspenseExpiration(currentTime, timeoutMs) {\n  // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time?\n  return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE);\n} // We intentionally set a higher expiration time for interactive updates in\n// dev than in production.\n//\n// If the main thread is being blocked so long that you hit the expiration,\n// it's a problem that could be solved with better scheduling.\n//\n// People will be more likely to notice this and fix it with the long\n// expiration time in development.\n//\n// In production we opt for better UX at the risk of masking scheduling\n// problems, by expiring fast.\n\nvar HIGH_PRIORITY_EXPIRATION =  500 ;\nvar HIGH_PRIORITY_BATCH_SIZE = 100;\nfunction computeInteractiveExpiration(currentTime) {\n  return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);\n}\nfunction inferPriorityFromExpirationTime(currentTime, expirationTime) {\n  if (expirationTime === Sync) {\n    return ImmediatePriority;\n  }\n\n  if (expirationTime === Never || expirationTime === Idle) {\n    return IdlePriority;\n  }\n\n  var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime);\n\n  if (msUntil <= 0) {\n    return ImmediatePriority;\n  }\n\n  if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) {\n    return UserBlockingPriority$1;\n  }\n\n  if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) {\n    return NormalPriority;\n  } // TODO: Handle LowPriority\n  // Assume anything lower has idle priority\n\n\n  return IdlePriority;\n}\n\nvar ReactStrictModeWarnings = {\n  recordUnsafeLifecycleWarnings: function (fiber, instance) {},\n  flushPendingUnsafeLifecycleWarnings: function () {},\n  recordLegacyContextWarning: function (fiber, instance) {},\n  flushLegacyContextWarning: function () {},\n  discardPendingWarnings: function () {}\n};\n\n{\n  var findStrictRoot = function (fiber) {\n    var maybeStrictRoot = null;\n    var node = fiber;\n\n    while (node !== null) {\n      if (node.mode & StrictMode) {\n        maybeStrictRoot = node;\n      }\n\n      node = node.return;\n    }\n\n    return maybeStrictRoot;\n  };\n\n  var setToSortedString = function (set) {\n    var array = [];\n    set.forEach(function (value) {\n      array.push(value);\n    });\n    return array.sort().join(', ');\n  };\n\n  var pendingComponentWillMountWarnings = [];\n  var pendingUNSAFE_ComponentWillMountWarnings = [];\n  var pendingComponentWillReceivePropsWarnings = [];\n  var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n  var pendingComponentWillUpdateWarnings = [];\n  var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.\n\n  var didWarnAboutUnsafeLifecycles = new Set();\n\n  ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {\n    // Dedup strategy: Warn once per component.\n    if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {\n      return;\n    }\n\n    if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.\n    instance.componentWillMount.__suppressDeprecationWarning !== true) {\n      pendingComponentWillMountWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') {\n      pendingUNSAFE_ComponentWillMountWarnings.push(fiber);\n    }\n\n    if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n      pendingComponentWillReceivePropsWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n      pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);\n    }\n\n    if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n      pendingComponentWillUpdateWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {\n      pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);\n    }\n  };\n\n  ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {\n    // We do an initial pass to gather component names\n    var componentWillMountUniqueNames = new Set();\n\n    if (pendingComponentWillMountWarnings.length > 0) {\n      pendingComponentWillMountWarnings.forEach(function (fiber) {\n        componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillMountWarnings = [];\n    }\n\n    var UNSAFE_componentWillMountUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillMountWarnings = [];\n    }\n\n    var componentWillReceivePropsUniqueNames = new Set();\n\n    if (pendingComponentWillReceivePropsWarnings.length > 0) {\n      pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {\n        componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillReceivePropsWarnings = [];\n    }\n\n    var UNSAFE_componentWillReceivePropsUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    }\n\n    var componentWillUpdateUniqueNames = new Set();\n\n    if (pendingComponentWillUpdateWarnings.length > 0) {\n      pendingComponentWillUpdateWarnings.forEach(function (fiber) {\n        componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillUpdateWarnings = [];\n    }\n\n    var UNSAFE_componentWillUpdateUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillUpdateWarnings = [];\n    } // Finally, we flush all the warnings\n    // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'\n\n\n    if (UNSAFE_componentWillMountUniqueNames.size > 0) {\n      var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);\n\n      error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '\\nPlease update the following components: %s', sortedNames);\n    }\n\n    if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {\n      var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);\n\n      error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, \" + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '\\nPlease update the following components: %s', _sortedNames);\n    }\n\n    if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {\n      var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);\n\n      error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '\\nPlease update the following components: %s', _sortedNames2);\n    }\n\n    if (componentWillMountUniqueNames.size > 0) {\n      var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);\n\n      warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames3);\n    }\n\n    if (componentWillReceivePropsUniqueNames.size > 0) {\n      var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);\n\n      warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, refactor your \" + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames4);\n    }\n\n    if (componentWillUpdateUniqueNames.size > 0) {\n      var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);\n\n      warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames5);\n    }\n  };\n\n  var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.\n\n  var didWarnAboutLegacyContext = new Set();\n\n  ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {\n    var strictRoot = findStrictRoot(fiber);\n\n    if (strictRoot === null) {\n      error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');\n\n      return;\n    } // Dedup strategy: Warn once per component.\n\n\n    if (didWarnAboutLegacyContext.has(fiber.type)) {\n      return;\n    }\n\n    var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);\n\n    if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {\n      if (warningsForRoot === undefined) {\n        warningsForRoot = [];\n        pendingLegacyContextWarning.set(strictRoot, warningsForRoot);\n      }\n\n      warningsForRoot.push(fiber);\n    }\n  };\n\n  ReactStrictModeWarnings.flushLegacyContextWarning = function () {\n    pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {\n      if (fiberArray.length === 0) {\n        return;\n      }\n\n      var firstFiber = fiberArray[0];\n      var uniqueNames = new Set();\n      fiberArray.forEach(function (fiber) {\n        uniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutLegacyContext.add(fiber.type);\n      });\n      var sortedNames = setToSortedString(uniqueNames);\n      var firstComponentStack = getStackByFiberInDevAndProd(firstFiber);\n\n      error('Legacy context API has been detected within a strict-mode tree.' + '\\n\\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\\n\\nPlease update the following components: %s' + '\\n\\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, firstComponentStack);\n    });\n  };\n\n  ReactStrictModeWarnings.discardPendingWarnings = function () {\n    pendingComponentWillMountWarnings = [];\n    pendingUNSAFE_ComponentWillMountWarnings = [];\n    pendingComponentWillReceivePropsWarnings = [];\n    pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    pendingComponentWillUpdateWarnings = [];\n    pendingUNSAFE_ComponentWillUpdateWarnings = [];\n    pendingLegacyContextWarning = new Map();\n  };\n}\n\nvar resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.\n\nvar failedBoundaries = null;\nvar setRefreshHandler = function (handler) {\n  {\n    resolveFamily = handler;\n  }\n};\nfunction resolveFunctionForHotReloading(type) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return type;\n    }\n\n    var family = resolveFamily(type);\n\n    if (family === undefined) {\n      return type;\n    } // Use the latest known implementation.\n\n\n    return family.current;\n  }\n}\nfunction resolveClassForHotReloading(type) {\n  // No implementation differences.\n  return resolveFunctionForHotReloading(type);\n}\nfunction resolveForwardRefForHotReloading(type) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return type;\n    }\n\n    var family = resolveFamily(type);\n\n    if (family === undefined) {\n      // Check if we're dealing with a real forwardRef. Don't want to crash early.\n      if (type !== null && type !== undefined && typeof type.render === 'function') {\n        // ForwardRef is special because its resolved .type is an object,\n        // but it's possible that we only have its inner render function in the map.\n        // If that inner render function is different, we'll build a new forwardRef type.\n        var currentRender = resolveFunctionForHotReloading(type.render);\n\n        if (type.render !== currentRender) {\n          var syntheticType = {\n            $$typeof: REACT_FORWARD_REF_TYPE,\n            render: currentRender\n          };\n\n          if (type.displayName !== undefined) {\n            syntheticType.displayName = type.displayName;\n          }\n\n          return syntheticType;\n        }\n      }\n\n      return type;\n    } // Use the latest known implementation.\n\n\n    return family.current;\n  }\n}\nfunction isCompatibleFamilyForHotReloading(fiber, element) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return false;\n    }\n\n    var prevType = fiber.elementType;\n    var nextType = element.type; // If we got here, we know types aren't === equal.\n\n    var needsCompareFamilies = false;\n    var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;\n\n    switch (fiber.tag) {\n      case ClassComponent:\n        {\n          if (typeof nextType === 'function') {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case FunctionComponent:\n        {\n          if (typeof nextType === 'function') {\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            // We don't know the inner type yet.\n            // We're going to assume that the lazy inner type is stable,\n            // and so it is sufficient to avoid reconciling it away.\n            // We're not going to unwrap or actually use the new lazy type.\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case ForwardRef:\n        {\n          if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case MemoComponent:\n      case SimpleMemoComponent:\n        {\n          if ($$typeofNextType === REACT_MEMO_TYPE) {\n            // TODO: if it was but can no longer be simple,\n            // we shouldn't set this.\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      default:\n        return false;\n    } // Check if both types have a family and it's the same one.\n\n\n    if (needsCompareFamilies) {\n      // Note: memo() and forwardRef() we'll compare outer rather than inner type.\n      // This means both of them need to be registered to preserve state.\n      // If we unwrapped and compared the inner types for wrappers instead,\n      // then we would risk falsely saying two separate memo(Foo)\n      // calls are equivalent because they wrap the same Foo function.\n      var prevFamily = resolveFamily(prevType);\n\n      if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\nfunction markFailedErrorBoundaryForHotReloading(fiber) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return;\n    }\n\n    if (typeof WeakSet !== 'function') {\n      return;\n    }\n\n    if (failedBoundaries === null) {\n      failedBoundaries = new WeakSet();\n    }\n\n    failedBoundaries.add(fiber);\n  }\n}\nvar scheduleRefresh = function (root, update) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return;\n    }\n\n    var staleFamilies = update.staleFamilies,\n        updatedFamilies = update.updatedFamilies;\n    flushPassiveEffects();\n    flushSync(function () {\n      scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);\n    });\n  }\n};\nvar scheduleRoot = function (root, element) {\n  {\n    if (root.context !== emptyContextObject) {\n      // Super edge case: root has a legacy _renderSubtree context\n      // but we don't know the parentComponent so we can't pass it.\n      // Just ignore. We'll delete this with _renderSubtree code path later.\n      return;\n    }\n\n    flushPassiveEffects();\n    syncUpdates(function () {\n      updateContainer(element, root, null, null);\n    });\n  }\n};\n\nfunction scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {\n  {\n    var alternate = fiber.alternate,\n        child = fiber.child,\n        sibling = fiber.sibling,\n        tag = fiber.tag,\n        type = fiber.type;\n    var candidateType = null;\n\n    switch (tag) {\n      case FunctionComponent:\n      case SimpleMemoComponent:\n      case ClassComponent:\n        candidateType = type;\n        break;\n\n      case ForwardRef:\n        candidateType = type.render;\n        break;\n    }\n\n    if (resolveFamily === null) {\n      throw new Error('Expected resolveFamily to be set during hot reload.');\n    }\n\n    var needsRender = false;\n    var needsRemount = false;\n\n    if (candidateType !== null) {\n      var family = resolveFamily(candidateType);\n\n      if (family !== undefined) {\n        if (staleFamilies.has(family)) {\n          needsRemount = true;\n        } else if (updatedFamilies.has(family)) {\n          if (tag === ClassComponent) {\n            needsRemount = true;\n          } else {\n            needsRender = true;\n          }\n        }\n      }\n    }\n\n    if (failedBoundaries !== null) {\n      if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {\n        needsRemount = true;\n      }\n    }\n\n    if (needsRemount) {\n      fiber._debugNeedsRemount = true;\n    }\n\n    if (needsRemount || needsRender) {\n      scheduleWork(fiber, Sync);\n    }\n\n    if (child !== null && !needsRemount) {\n      scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);\n    }\n\n    if (sibling !== null) {\n      scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);\n    }\n  }\n}\n\nvar findHostInstancesForRefresh = function (root, families) {\n  {\n    var hostInstances = new Set();\n    var types = new Set(families.map(function (family) {\n      return family.current;\n    }));\n    findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);\n    return hostInstances;\n  }\n};\n\nfunction findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {\n  {\n    var child = fiber.child,\n        sibling = fiber.sibling,\n        tag = fiber.tag,\n        type = fiber.type;\n    var candidateType = null;\n\n    switch (tag) {\n      case FunctionComponent:\n      case SimpleMemoComponent:\n      case ClassComponent:\n        candidateType = type;\n        break;\n\n      case ForwardRef:\n        candidateType = type.render;\n        break;\n    }\n\n    var didMatch = false;\n\n    if (candidateType !== null) {\n      if (types.has(candidateType)) {\n        didMatch = true;\n      }\n    }\n\n    if (didMatch) {\n      // We have a match. This only drills down to the closest host components.\n      // There's no need to search deeper because for the purpose of giving\n      // visual feedback, \"flashing\" outermost parent rectangles is sufficient.\n      findHostInstancesForFiberShallowly(fiber, hostInstances);\n    } else {\n      // If there's no match, maybe there will be one further down in the child tree.\n      if (child !== null) {\n        findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);\n      }\n    }\n\n    if (sibling !== null) {\n      findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);\n    }\n  }\n}\n\nfunction findHostInstancesForFiberShallowly(fiber, hostInstances) {\n  {\n    var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);\n\n    if (foundHostInstances) {\n      return;\n    } // If we didn't find any host children, fallback to closest host parent.\n\n\n    var node = fiber;\n\n    while (true) {\n      switch (node.tag) {\n        case HostComponent:\n          hostInstances.add(node.stateNode);\n          return;\n\n        case HostPortal:\n          hostInstances.add(node.stateNode.containerInfo);\n          return;\n\n        case HostRoot:\n          hostInstances.add(node.stateNode.containerInfo);\n          return;\n      }\n\n      if (node.return === null) {\n        throw new Error('Expected to reach root first.');\n      }\n\n      node = node.return;\n    }\n  }\n}\n\nfunction findChildHostInstancesForFiberShallowly(fiber, hostInstances) {\n  {\n    var node = fiber;\n    var foundHostInstances = false;\n\n    while (true) {\n      if (node.tag === HostComponent) {\n        // We got a match.\n        foundHostInstances = true;\n        hostInstances.add(node.stateNode); // There may still be more, so keep searching.\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === fiber) {\n        return foundHostInstances;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === fiber) {\n          return foundHostInstances;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n\n  return false;\n}\n\nfunction resolveDefaultProps(Component, baseProps) {\n  if (Component && Component.defaultProps) {\n    // Resolve default props. Taken from ReactElement\n    var props = _assign({}, baseProps);\n\n    var defaultProps = Component.defaultProps;\n\n    for (var propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n\n    return props;\n  }\n\n  return baseProps;\n}\nfunction readLazyComponentType(lazyComponent) {\n  initializeLazyComponentType(lazyComponent);\n\n  if (lazyComponent._status !== Resolved) {\n    throw lazyComponent._result;\n  }\n\n  return lazyComponent._result;\n}\n\nvar valueCursor = createCursor(null);\nvar rendererSigil;\n\n{\n  // Use this to detect multiple renderers using the same context\n  rendererSigil = {};\n}\n\nvar currentlyRenderingFiber = null;\nvar lastContextDependency = null;\nvar lastContextWithAllBitsObserved = null;\nvar isDisallowedContextReadInDEV = false;\nfunction resetContextDependencies() {\n  // This is called right before React yields execution, to ensure `readContext`\n  // cannot be called outside the render phase.\n  currentlyRenderingFiber = null;\n  lastContextDependency = null;\n  lastContextWithAllBitsObserved = null;\n\n  {\n    isDisallowedContextReadInDEV = false;\n  }\n}\nfunction enterDisallowedContextReadInDEV() {\n  {\n    isDisallowedContextReadInDEV = true;\n  }\n}\nfunction exitDisallowedContextReadInDEV() {\n  {\n    isDisallowedContextReadInDEV = false;\n  }\n}\nfunction pushProvider(providerFiber, nextValue) {\n  var context = providerFiber.type._context;\n\n  {\n    push(valueCursor, context._currentValue, providerFiber);\n    context._currentValue = nextValue;\n\n    {\n      if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {\n        error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');\n      }\n\n      context._currentRenderer = rendererSigil;\n    }\n  }\n}\nfunction popProvider(providerFiber) {\n  var currentValue = valueCursor.current;\n  pop(valueCursor, providerFiber);\n  var context = providerFiber.type._context;\n\n  {\n    context._currentValue = currentValue;\n  }\n}\nfunction calculateChangedBits(context, newValue, oldValue) {\n  if (objectIs(oldValue, newValue)) {\n    // No change\n    return 0;\n  } else {\n    var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n    {\n      if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) {\n        error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);\n      }\n    }\n\n    return changedBits | 0;\n  }\n}\nfunction scheduleWorkOnParentPath(parent, renderExpirationTime) {\n  // Update the child expiration time of all the ancestors, including\n  // the alternates.\n  var node = parent;\n\n  while (node !== null) {\n    var alternate = node.alternate;\n\n    if (node.childExpirationTime < renderExpirationTime) {\n      node.childExpirationTime = renderExpirationTime;\n\n      if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n        alternate.childExpirationTime = renderExpirationTime;\n      }\n    } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n      alternate.childExpirationTime = renderExpirationTime;\n    } else {\n      // Neither alternate was updated, which means the rest of the\n      // ancestor path already has sufficient priority.\n      break;\n    }\n\n    node = node.return;\n  }\n}\nfunction propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {\n  var fiber = workInProgress.child;\n\n  if (fiber !== null) {\n    // Set the return pointer of the child to the work-in-progress fiber.\n    fiber.return = workInProgress;\n  }\n\n  while (fiber !== null) {\n    var nextFiber = void 0; // Visit this fiber.\n\n    var list = fiber.dependencies;\n\n    if (list !== null) {\n      nextFiber = fiber.child;\n      var dependency = list.firstContext;\n\n      while (dependency !== null) {\n        // Check if the context matches.\n        if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {\n          // Match! Schedule an update on this fiber.\n          if (fiber.tag === ClassComponent) {\n            // Schedule a force update on the work-in-progress.\n            var update = createUpdate(renderExpirationTime, null);\n            update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the\n            // update to the current fiber, too, which means it will persist even if\n            // this render is thrown away. Since it's a race condition, not sure it's\n            // worth fixing.\n\n            enqueueUpdate(fiber, update);\n          }\n\n          if (fiber.expirationTime < renderExpirationTime) {\n            fiber.expirationTime = renderExpirationTime;\n          }\n\n          var alternate = fiber.alternate;\n\n          if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n            alternate.expirationTime = renderExpirationTime;\n          }\n\n          scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too.\n\n          if (list.expirationTime < renderExpirationTime) {\n            list.expirationTime = renderExpirationTime;\n          } // Since we already found a match, we can stop traversing the\n          // dependency list.\n\n\n          break;\n        }\n\n        dependency = dependency.next;\n      }\n    } else if (fiber.tag === ContextProvider) {\n      // Don't scan deeper if this is a matching provider\n      nextFiber = fiber.type === workInProgress.type ? null : fiber.child;\n    } else {\n      // Traverse down.\n      nextFiber = fiber.child;\n    }\n\n    if (nextFiber !== null) {\n      // Set the return pointer of the child to the work-in-progress fiber.\n      nextFiber.return = fiber;\n    } else {\n      // No child. Traverse to next sibling.\n      nextFiber = fiber;\n\n      while (nextFiber !== null) {\n        if (nextFiber === workInProgress) {\n          // We're back to the root of this subtree. Exit.\n          nextFiber = null;\n          break;\n        }\n\n        var sibling = nextFiber.sibling;\n\n        if (sibling !== null) {\n          // Set the return pointer of the sibling to the work-in-progress fiber.\n          sibling.return = nextFiber.return;\n          nextFiber = sibling;\n          break;\n        } // No more siblings. Traverse up.\n\n\n        nextFiber = nextFiber.return;\n      }\n    }\n\n    fiber = nextFiber;\n  }\n}\nfunction prepareToReadContext(workInProgress, renderExpirationTime) {\n  currentlyRenderingFiber = workInProgress;\n  lastContextDependency = null;\n  lastContextWithAllBitsObserved = null;\n  var dependencies = workInProgress.dependencies;\n\n  if (dependencies !== null) {\n    var firstContext = dependencies.firstContext;\n\n    if (firstContext !== null) {\n      if (dependencies.expirationTime >= renderExpirationTime) {\n        // Context list has a pending update. Mark that this fiber performed work.\n        markWorkInProgressReceivedUpdate();\n      } // Reset the work-in-progress list\n\n\n      dependencies.firstContext = null;\n    }\n  }\n}\nfunction readContext(context, observedBits) {\n  {\n    // This warning would fire if you read context inside a Hook like useMemo.\n    // Unlike the class check below, it's not enforced in production for perf.\n    if (isDisallowedContextReadInDEV) {\n      error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n    }\n  }\n\n  if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else {\n    var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types.\n\n    if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) {\n      // Observe all updates.\n      lastContextWithAllBitsObserved = context;\n      resolvedObservedBits = MAX_SIGNED_31_BIT_INT;\n    } else {\n      resolvedObservedBits = observedBits;\n    }\n\n    var contextItem = {\n      context: context,\n      observedBits: resolvedObservedBits,\n      next: null\n    };\n\n    if (lastContextDependency === null) {\n      if (!(currentlyRenderingFiber !== null)) {\n        {\n          throw Error( \"Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().\" );\n        }\n      } // This is the first dependency for this component. Create a new list.\n\n\n      lastContextDependency = contextItem;\n      currentlyRenderingFiber.dependencies = {\n        expirationTime: NoWork,\n        firstContext: contextItem,\n        responders: null\n      };\n    } else {\n      // Append a new context item.\n      lastContextDependency = lastContextDependency.next = contextItem;\n    }\n  }\n\n  return  context._currentValue ;\n}\n\nvar UpdateState = 0;\nvar ReplaceState = 1;\nvar ForceUpdate = 2;\nvar CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.\n// It should only be read right after calling `processUpdateQueue`, via\n// `checkHasForceUpdateAfterProcessing`.\n\nvar hasForceUpdate = false;\nvar didWarnUpdateInsideUpdate;\nvar currentlyProcessingQueue;\n\n{\n  didWarnUpdateInsideUpdate = false;\n  currentlyProcessingQueue = null;\n}\n\nfunction initializeUpdateQueue(fiber) {\n  var queue = {\n    baseState: fiber.memoizedState,\n    baseQueue: null,\n    shared: {\n      pending: null\n    },\n    effects: null\n  };\n  fiber.updateQueue = queue;\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n  // Clone the update queue from current. Unless it's already a clone.\n  var queue = workInProgress.updateQueue;\n  var currentQueue = current.updateQueue;\n\n  if (queue === currentQueue) {\n    var clone = {\n      baseState: currentQueue.baseState,\n      baseQueue: currentQueue.baseQueue,\n      shared: currentQueue.shared,\n      effects: currentQueue.effects\n    };\n    workInProgress.updateQueue = clone;\n  }\n}\nfunction createUpdate(expirationTime, suspenseConfig) {\n  var update = {\n    expirationTime: expirationTime,\n    suspenseConfig: suspenseConfig,\n    tag: UpdateState,\n    payload: null,\n    callback: null,\n    next: null\n  };\n  update.next = update;\n\n  {\n    update.priority = getCurrentPriorityLevel();\n  }\n\n  return update;\n}\nfunction enqueueUpdate(fiber, update) {\n  var updateQueue = fiber.updateQueue;\n\n  if (updateQueue === null) {\n    // Only occurs if the fiber has been unmounted.\n    return;\n  }\n\n  var sharedQueue = updateQueue.shared;\n  var pending = sharedQueue.pending;\n\n  if (pending === null) {\n    // This is the first update. Create a circular list.\n    update.next = update;\n  } else {\n    update.next = pending.next;\n    pending.next = update;\n  }\n\n  sharedQueue.pending = update;\n\n  {\n    if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {\n      error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');\n\n      didWarnUpdateInsideUpdate = true;\n    }\n  }\n}\nfunction enqueueCapturedUpdate(workInProgress, update) {\n  var current = workInProgress.alternate;\n\n  if (current !== null) {\n    // Ensure the work-in-progress queue is a clone\n    cloneUpdateQueue(current, workInProgress);\n  } // Captured updates go only on the work-in-progress queue.\n\n\n  var queue = workInProgress.updateQueue; // Append the update to the end of the list.\n\n  var last = queue.baseQueue;\n\n  if (last === null) {\n    queue.baseQueue = update.next = update;\n    update.next = update;\n  } else {\n    update.next = last.next;\n    last.next = update;\n  }\n}\n\nfunction getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {\n  switch (update.tag) {\n    case ReplaceState:\n      {\n        var payload = update.payload;\n\n        if (typeof payload === 'function') {\n          // Updater function\n          {\n            enterDisallowedContextReadInDEV();\n\n            if ( workInProgress.mode & StrictMode) {\n              payload.call(instance, prevState, nextProps);\n            }\n          }\n\n          var nextState = payload.call(instance, prevState, nextProps);\n\n          {\n            exitDisallowedContextReadInDEV();\n          }\n\n          return nextState;\n        } // State object\n\n\n        return payload;\n      }\n\n    case CaptureUpdate:\n      {\n        workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;\n      }\n    // Intentional fallthrough\n\n    case UpdateState:\n      {\n        var _payload = update.payload;\n        var partialState;\n\n        if (typeof _payload === 'function') {\n          // Updater function\n          {\n            enterDisallowedContextReadInDEV();\n\n            if ( workInProgress.mode & StrictMode) {\n              _payload.call(instance, prevState, nextProps);\n            }\n          }\n\n          partialState = _payload.call(instance, prevState, nextProps);\n\n          {\n            exitDisallowedContextReadInDEV();\n          }\n        } else {\n          // Partial state object\n          partialState = _payload;\n        }\n\n        if (partialState === null || partialState === undefined) {\n          // Null and undefined are treated as no-ops.\n          return prevState;\n        } // Merge the partial state and the previous state.\n\n\n        return _assign({}, prevState, partialState);\n      }\n\n    case ForceUpdate:\n      {\n        hasForceUpdate = true;\n        return prevState;\n      }\n  }\n\n  return prevState;\n}\n\nfunction processUpdateQueue(workInProgress, props, instance, renderExpirationTime) {\n  // This is always non-null on a ClassComponent or HostRoot\n  var queue = workInProgress.updateQueue;\n  hasForceUpdate = false;\n\n  {\n    currentlyProcessingQueue = queue.shared;\n  } // The last rebase update that is NOT part of the base state.\n\n\n  var baseQueue = queue.baseQueue; // The last pending update that hasn't been processed yet.\n\n  var pendingQueue = queue.shared.pending;\n\n  if (pendingQueue !== null) {\n    // We have new updates that haven't been processed yet.\n    // We'll add them to the base queue.\n    if (baseQueue !== null) {\n      // Merge the pending queue and the base queue.\n      var baseFirst = baseQueue.next;\n      var pendingFirst = pendingQueue.next;\n      baseQueue.next = pendingFirst;\n      pendingQueue.next = baseFirst;\n    }\n\n    baseQueue = pendingQueue;\n    queue.shared.pending = null; // TODO: Pass `current` as argument\n\n    var current = workInProgress.alternate;\n\n    if (current !== null) {\n      var currentQueue = current.updateQueue;\n\n      if (currentQueue !== null) {\n        currentQueue.baseQueue = pendingQueue;\n      }\n    }\n  } // These values may change as we process the queue.\n\n\n  if (baseQueue !== null) {\n    var first = baseQueue.next; // Iterate through the list of updates to compute the result.\n\n    var newState = queue.baseState;\n    var newExpirationTime = NoWork;\n    var newBaseState = null;\n    var newBaseQueueFirst = null;\n    var newBaseQueueLast = null;\n\n    if (first !== null) {\n      var update = first;\n\n      do {\n        var updateExpirationTime = update.expirationTime;\n\n        if (updateExpirationTime < renderExpirationTime) {\n          // Priority is insufficient. Skip this update. If this is the first\n          // skipped update, the previous update/state is the new base\n          // update/state.\n          var clone = {\n            expirationTime: update.expirationTime,\n            suspenseConfig: update.suspenseConfig,\n            tag: update.tag,\n            payload: update.payload,\n            callback: update.callback,\n            next: null\n          };\n\n          if (newBaseQueueLast === null) {\n            newBaseQueueFirst = newBaseQueueLast = clone;\n            newBaseState = newState;\n          } else {\n            newBaseQueueLast = newBaseQueueLast.next = clone;\n          } // Update the remaining priority in the queue.\n\n\n          if (updateExpirationTime > newExpirationTime) {\n            newExpirationTime = updateExpirationTime;\n          }\n        } else {\n          // This update does have sufficient priority.\n          if (newBaseQueueLast !== null) {\n            var _clone = {\n              expirationTime: Sync,\n              // This update is going to be committed so we never want uncommit it.\n              suspenseConfig: update.suspenseConfig,\n              tag: update.tag,\n              payload: update.payload,\n              callback: update.callback,\n              next: null\n            };\n            newBaseQueueLast = newBaseQueueLast.next = _clone;\n          } // Mark the event time of this update as relevant to this render pass.\n          // TODO: This should ideally use the true event time of this update rather than\n          // its priority which is a derived and not reverseable value.\n          // TODO: We should skip this update if it was already committed but currently\n          // we have no way of detecting the difference between a committed and suspended\n          // update here.\n\n\n          markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n          newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);\n          var callback = update.callback;\n\n          if (callback !== null) {\n            workInProgress.effectTag |= Callback;\n            var effects = queue.effects;\n\n            if (effects === null) {\n              queue.effects = [update];\n            } else {\n              effects.push(update);\n            }\n          }\n        }\n\n        update = update.next;\n\n        if (update === null || update === first) {\n          pendingQueue = queue.shared.pending;\n\n          if (pendingQueue === null) {\n            break;\n          } else {\n            // An update was scheduled from inside a reducer. Add the new\n            // pending updates to the end of the list and keep processing.\n            update = baseQueue.next = pendingQueue.next;\n            pendingQueue.next = first;\n            queue.baseQueue = baseQueue = pendingQueue;\n            queue.shared.pending = null;\n          }\n        }\n      } while (true);\n    }\n\n    if (newBaseQueueLast === null) {\n      newBaseState = newState;\n    } else {\n      newBaseQueueLast.next = newBaseQueueFirst;\n    }\n\n    queue.baseState = newBaseState;\n    queue.baseQueue = newBaseQueueLast; // Set the remaining expiration time to be whatever is remaining in the queue.\n    // This should be fine because the only two other things that contribute to\n    // expiration time are props and context. We're already in the middle of the\n    // begin phase by the time we start processing the queue, so we've already\n    // dealt with the props. Context in components that specify\n    // shouldComponentUpdate is tricky; but we'll have to account for\n    // that regardless.\n\n    markUnprocessedUpdateTime(newExpirationTime);\n    workInProgress.expirationTime = newExpirationTime;\n    workInProgress.memoizedState = newState;\n  }\n\n  {\n    currentlyProcessingQueue = null;\n  }\n}\n\nfunction callCallback(callback, context) {\n  if (!(typeof callback === 'function')) {\n    {\n      throw Error( \"Invalid argument passed as callback. Expected a function. Instead received: \" + callback );\n    }\n  }\n\n  callback.call(context);\n}\n\nfunction resetHasForceUpdateBeforeProcessing() {\n  hasForceUpdate = false;\n}\nfunction checkHasForceUpdateAfterProcessing() {\n  return hasForceUpdate;\n}\nfunction commitUpdateQueue(finishedWork, finishedQueue, instance) {\n  // Commit the effects\n  var effects = finishedQueue.effects;\n  finishedQueue.effects = null;\n\n  if (effects !== null) {\n    for (var i = 0; i < effects.length; i++) {\n      var effect = effects[i];\n      var callback = effect.callback;\n\n      if (callback !== null) {\n        effect.callback = null;\n        callCallback(callback, instance);\n      }\n    }\n  }\n}\n\nvar ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;\nfunction requestCurrentSuspenseConfig() {\n  return ReactCurrentBatchConfig.suspense;\n}\n\nvar fakeInternalInstance = {};\nvar isArray = Array.isArray; // React.Component uses a shared frozen object by default.\n// We'll use it to determine whether we need to initialize legacy refs.\n\nvar emptyRefsObject = new React.Component().refs;\nvar didWarnAboutStateAssignmentForComponent;\nvar didWarnAboutUninitializedState;\nvar didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;\nvar didWarnAboutLegacyLifecyclesAndDerivedState;\nvar didWarnAboutUndefinedDerivedState;\nvar warnOnUndefinedDerivedState;\nvar warnOnInvalidCallback;\nvar didWarnAboutDirectlyAssigningPropsToState;\nvar didWarnAboutContextTypeAndContextTypes;\nvar didWarnAboutInvalidateContextType;\n\n{\n  didWarnAboutStateAssignmentForComponent = new Set();\n  didWarnAboutUninitializedState = new Set();\n  didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();\n  didWarnAboutLegacyLifecyclesAndDerivedState = new Set();\n  didWarnAboutDirectlyAssigningPropsToState = new Set();\n  didWarnAboutUndefinedDerivedState = new Set();\n  didWarnAboutContextTypeAndContextTypes = new Set();\n  didWarnAboutInvalidateContextType = new Set();\n  var didWarnOnInvalidCallback = new Set();\n\n  warnOnInvalidCallback = function (callback, callerName) {\n    if (callback === null || typeof callback === 'function') {\n      return;\n    }\n\n    var key = callerName + \"_\" + callback;\n\n    if (!didWarnOnInvalidCallback.has(key)) {\n      didWarnOnInvalidCallback.add(key);\n\n      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n    }\n  };\n\n  warnOnUndefinedDerivedState = function (type, partialState) {\n    if (partialState === undefined) {\n      var componentName = getComponentName(type) || 'Component';\n\n      if (!didWarnAboutUndefinedDerivedState.has(componentName)) {\n        didWarnAboutUndefinedDerivedState.add(componentName);\n\n        error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);\n      }\n    }\n  }; // This is so gross but it's at least non-critical and can be removed if\n  // it causes problems. This is meant to give a nicer error message for\n  // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,\n  // ...)) which otherwise throws a \"_processChildContext is not a function\"\n  // exception.\n\n\n  Object.defineProperty(fakeInternalInstance, '_processChildContext', {\n    enumerable: false,\n    value: function () {\n      {\n        {\n          throw Error( \"_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).\" );\n        }\n      }\n    }\n  });\n  Object.freeze(fakeInternalInstance);\n}\n\nfunction applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {\n  var prevState = workInProgress.memoizedState;\n\n  {\n    if ( workInProgress.mode & StrictMode) {\n      // Invoke the function an extra time to help detect side-effects.\n      getDerivedStateFromProps(nextProps, prevState);\n    }\n  }\n\n  var partialState = getDerivedStateFromProps(nextProps, prevState);\n\n  {\n    warnOnUndefinedDerivedState(ctor, partialState);\n  } // Merge the partial state and the previous state.\n\n\n  var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);\n  workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the\n  // base state.\n\n  if (workInProgress.expirationTime === NoWork) {\n    // Queue is always non-null for classes\n    var updateQueue = workInProgress.updateQueue;\n    updateQueue.baseState = memoizedState;\n  }\n}\nvar classComponentUpdater = {\n  isMounted: isMounted,\n  enqueueSetState: function (inst, payload, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.payload = payload;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'setState');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  },\n  enqueueReplaceState: function (inst, payload, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.tag = ReplaceState;\n    update.payload = payload;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'replaceState');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  },\n  enqueueForceUpdate: function (inst, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.tag = ForceUpdate;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'forceUpdate');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  }\n};\n\nfunction checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {\n  var instance = workInProgress.stateNode;\n\n  if (typeof instance.shouldComponentUpdate === 'function') {\n    {\n      if ( workInProgress.mode & StrictMode) {\n        // Invoke the function an extra time to help detect side-effects.\n        instance.shouldComponentUpdate(newProps, newState, nextContext);\n      }\n    }\n\n    startPhaseTimer(workInProgress, 'shouldComponentUpdate');\n    var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);\n    stopPhaseTimer();\n\n    {\n      if (shouldUpdate === undefined) {\n        error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component');\n      }\n    }\n\n    return shouldUpdate;\n  }\n\n  if (ctor.prototype && ctor.prototype.isPureReactComponent) {\n    return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);\n  }\n\n  return true;\n}\n\nfunction checkClassInstance(workInProgress, ctor, newProps) {\n  var instance = workInProgress.stateNode;\n\n  {\n    var name = getComponentName(ctor) || 'Component';\n    var renderPresent = instance.render;\n\n    if (!renderPresent) {\n      if (ctor.prototype && typeof ctor.prototype.render === 'function') {\n        error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);\n      } else {\n        error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);\n      }\n    }\n\n    if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {\n      error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);\n    }\n\n    if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);\n    }\n\n    if (instance.propTypes) {\n      error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);\n    }\n\n    if (instance.contextType) {\n      error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);\n    }\n\n    {\n      if (instance.contextTypes) {\n        error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);\n      }\n\n      if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {\n        didWarnAboutContextTypeAndContextTypes.add(ctor);\n\n        error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);\n      }\n    }\n\n    if (typeof instance.componentShouldUpdate === 'function') {\n      error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);\n    }\n\n    if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {\n      error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');\n    }\n\n    if (typeof instance.componentDidUnmount === 'function') {\n      error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);\n    }\n\n    if (typeof instance.componentDidReceiveProps === 'function') {\n      error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);\n    }\n\n    if (typeof instance.componentWillRecieveProps === 'function') {\n      error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);\n    }\n\n    if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {\n      error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);\n    }\n\n    var hasMutatedProps = instance.props !== newProps;\n\n    if (instance.props !== undefined && hasMutatedProps) {\n      error('%s(...): When calling super() in `%s`, make sure to pass ' + \"up the same props that your component's constructor was passed.\", name, name);\n    }\n\n    if (instance.defaultProps) {\n      error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {\n      didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);\n\n      error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));\n    }\n\n    if (typeof instance.getDerivedStateFromProps === 'function') {\n      error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n    }\n\n    if (typeof instance.getDerivedStateFromError === 'function') {\n      error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n    }\n\n    if (typeof ctor.getSnapshotBeforeUpdate === 'function') {\n      error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);\n    }\n\n    var _state = instance.state;\n\n    if (_state && (typeof _state !== 'object' || isArray(_state))) {\n      error('%s.state: must be set to an object or null', name);\n    }\n\n    if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {\n      error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);\n    }\n  }\n}\n\nfunction adoptClassInstance(workInProgress, instance) {\n  instance.updater = classComponentUpdater;\n  workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates\n\n  set(instance, workInProgress);\n\n  {\n    instance._reactInternalInstance = fakeInternalInstance;\n  }\n}\n\nfunction constructClassInstance(workInProgress, ctor, props) {\n  var isLegacyContextConsumer = false;\n  var unmaskedContext = emptyContextObject;\n  var context = emptyContextObject;\n  var contextType = ctor.contextType;\n\n  {\n    if ('contextType' in ctor) {\n      var isValid = // Allow null for conditional declaration\n      contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>\n\n      if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {\n        didWarnAboutInvalidateContextType.add(ctor);\n        var addendum = '';\n\n        if (contextType === undefined) {\n          addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';\n        } else if (typeof contextType !== 'object') {\n          addendum = ' However, it is set to a ' + typeof contextType + '.';\n        } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {\n          addendum = ' Did you accidentally pass the Context.Provider instead?';\n        } else if (contextType._context !== undefined) {\n          // <Context.Consumer>\n          addendum = ' Did you accidentally pass the Context.Consumer instead?';\n        } else {\n          addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';\n        }\n\n        error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum);\n      }\n    }\n  }\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    context = readContext(contextType);\n  } else {\n    unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    var contextTypes = ctor.contextTypes;\n    isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;\n    context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;\n  } // Instantiate twice to help detect side-effects.\n\n\n  {\n    if ( workInProgress.mode & StrictMode) {\n      new ctor(props, context); // eslint-disable-line no-new\n    }\n  }\n\n  var instance = new ctor(props, context);\n  var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;\n  adoptClassInstance(workInProgress, instance);\n\n  {\n    if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {\n      var componentName = getComponentName(ctor) || 'Component';\n\n      if (!didWarnAboutUninitializedState.has(componentName)) {\n        didWarnAboutUninitializedState.add(componentName);\n\n        error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);\n      }\n    } // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n    // Warn about these lifecycles if they are present.\n    // Don't warn about react-lifecycles-compat polyfilled methods though.\n\n\n    if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {\n      var foundWillMountName = null;\n      var foundWillReceivePropsName = null;\n      var foundWillUpdateName = null;\n\n      if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {\n        foundWillMountName = 'componentWillMount';\n      } else if (typeof instance.UNSAFE_componentWillMount === 'function') {\n        foundWillMountName = 'UNSAFE_componentWillMount';\n      }\n\n      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n        foundWillReceivePropsName = 'componentWillReceiveProps';\n      } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n        foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n      }\n\n      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n        foundWillUpdateName = 'componentWillUpdate';\n      } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n      }\n\n      if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {\n        var _componentName = getComponentName(ctor) || 'Component';\n\n        var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';\n\n        if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {\n          didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);\n\n          error('Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\\n\\n' + 'The above lifecycles should be removed. Learn more about this warning here:\\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? \"\\n  \" + foundWillMountName : '', foundWillReceivePropsName !== null ? \"\\n  \" + foundWillReceivePropsName : '', foundWillUpdateName !== null ? \"\\n  \" + foundWillUpdateName : '');\n        }\n      }\n    }\n  } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n  // ReactFiberContext usually updates this cache but can't for newly-created instances.\n\n\n  if (isLegacyContextConsumer) {\n    cacheContext(workInProgress, unmaskedContext, context);\n  }\n\n  return instance;\n}\n\nfunction callComponentWillMount(workInProgress, instance) {\n  startPhaseTimer(workInProgress, 'componentWillMount');\n  var oldState = instance.state;\n\n  if (typeof instance.componentWillMount === 'function') {\n    instance.componentWillMount();\n  }\n\n  if (typeof instance.UNSAFE_componentWillMount === 'function') {\n    instance.UNSAFE_componentWillMount();\n  }\n\n  stopPhaseTimer();\n\n  if (oldState !== instance.state) {\n    {\n      error('%s.componentWillMount(): Assigning directly to this.state is ' + \"deprecated (except inside a component's \" + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');\n    }\n\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n  }\n}\n\nfunction callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {\n  var oldState = instance.state;\n  startPhaseTimer(workInProgress, 'componentWillReceiveProps');\n\n  if (typeof instance.componentWillReceiveProps === 'function') {\n    instance.componentWillReceiveProps(newProps, nextContext);\n  }\n\n  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n  }\n\n  stopPhaseTimer();\n\n  if (instance.state !== oldState) {\n    {\n      var componentName = getComponentName(workInProgress.type) || 'Component';\n\n      if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {\n        didWarnAboutStateAssignmentForComponent.add(componentName);\n\n        error('%s.componentWillReceiveProps(): Assigning directly to ' + \"this.state is deprecated (except inside a component's \" + 'constructor). Use setState instead.', componentName);\n      }\n    }\n\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n  }\n} // Invokes the mount life-cycles on a previously never rendered instance.\n\n\nfunction mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n  {\n    checkClassInstance(workInProgress, ctor, newProps);\n  }\n\n  var instance = workInProgress.stateNode;\n  instance.props = newProps;\n  instance.state = workInProgress.memoizedState;\n  instance.refs = emptyRefsObject;\n  initializeUpdateQueue(workInProgress);\n  var contextType = ctor.contextType;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    instance.context = readContext(contextType);\n  } else {\n    var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    instance.context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  {\n    if (instance.state === newProps) {\n      var componentName = getComponentName(ctor) || 'Component';\n\n      if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {\n        didWarnAboutDirectlyAssigningPropsToState.add(componentName);\n\n        error('%s: It is not recommended to assign props directly to state ' + \"because updates to props won't be reflected in state. \" + 'In most cases, it is better to use props directly.', componentName);\n      }\n    }\n\n    if (workInProgress.mode & StrictMode) {\n      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);\n    }\n\n    {\n      ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);\n    }\n  }\n\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  instance.state = workInProgress.memoizedState;\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    instance.state = workInProgress.memoizedState;\n  } // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n\n  if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n    callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's\n    // process them now.\n\n    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n    instance.state = workInProgress.memoizedState;\n  }\n\n  if (typeof instance.componentDidMount === 'function') {\n    workInProgress.effectTag |= Update;\n  }\n}\n\nfunction resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n  var instance = workInProgress.stateNode;\n  var oldProps = workInProgress.memoizedProps;\n  instance.props = oldProps;\n  var oldContext = instance.context;\n  var contextType = ctor.contextType;\n  var nextContext = emptyContextObject;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    nextContext = readContext(contextType);\n  } else {\n    var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);\n  }\n\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n  // ever the previously attempted to render - not the \"current\". However,\n  // during componentDidUpdate we pass the \"current\" props.\n  // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n    if (oldProps !== newProps || oldContext !== nextContext) {\n      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n    }\n  }\n\n  resetHasForceUpdateBeforeProcessing();\n  var oldState = workInProgress.memoizedState;\n  var newState = instance.state = oldState;\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  newState = workInProgress.memoizedState;\n\n  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n\n    return false;\n  }\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    newState = workInProgress.memoizedState;\n  }\n\n  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n  if (shouldUpdate) {\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n      startPhaseTimer(workInProgress, 'componentWillMount');\n\n      if (typeof instance.componentWillMount === 'function') {\n        instance.componentWillMount();\n      }\n\n      if (typeof instance.UNSAFE_componentWillMount === 'function') {\n        instance.UNSAFE_componentWillMount();\n      }\n\n      stopPhaseTimer();\n    }\n\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n  } else {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    } // If shouldComponentUpdate returned false, we should still update the\n    // memoized state to indicate that this work can be reused.\n\n\n    workInProgress.memoizedProps = newProps;\n    workInProgress.memoizedState = newState;\n  } // Update the existing instance's state, props, and context pointers even\n  // if shouldComponentUpdate returns false.\n\n\n  instance.props = newProps;\n  instance.state = newState;\n  instance.context = nextContext;\n  return shouldUpdate;\n} // Invokes the update life-cycles and returns false if it shouldn't rerender.\n\n\nfunction updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {\n  var instance = workInProgress.stateNode;\n  cloneUpdateQueue(current, workInProgress);\n  var oldProps = workInProgress.memoizedProps;\n  instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);\n  var oldContext = instance.context;\n  var contextType = ctor.contextType;\n  var nextContext = emptyContextObject;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    nextContext = readContext(contextType);\n  } else {\n    var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);\n  }\n\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n  // ever the previously attempted to render - not the \"current\". However,\n  // during componentDidUpdate we pass the \"current\" props.\n  // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n    if (oldProps !== newProps || oldContext !== nextContext) {\n      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n    }\n  }\n\n  resetHasForceUpdateBeforeProcessing();\n  var oldState = workInProgress.memoizedState;\n  var newState = instance.state = oldState;\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  newState = workInProgress.memoizedState;\n\n  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Update;\n      }\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Snapshot;\n      }\n    }\n\n    return false;\n  }\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    newState = workInProgress.memoizedState;\n  }\n\n  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n  if (shouldUpdate) {\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {\n      startPhaseTimer(workInProgress, 'componentWillUpdate');\n\n      if (typeof instance.componentWillUpdate === 'function') {\n        instance.componentWillUpdate(newProps, newState, nextContext);\n      }\n\n      if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);\n      }\n\n      stopPhaseTimer();\n    }\n\n    if (typeof instance.componentDidUpdate === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      workInProgress.effectTag |= Snapshot;\n    }\n  } else {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Update;\n      }\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Snapshot;\n      }\n    } // If shouldComponentUpdate returned false, we should still update the\n    // memoized props/state to indicate that this work can be reused.\n\n\n    workInProgress.memoizedProps = newProps;\n    workInProgress.memoizedState = newState;\n  } // Update the existing instance's state, props, and context pointers even\n  // if shouldComponentUpdate returns false.\n\n\n  instance.props = newProps;\n  instance.state = newState;\n  instance.context = nextContext;\n  return shouldUpdate;\n}\n\nvar didWarnAboutMaps;\nvar didWarnAboutGenerators;\nvar didWarnAboutStringRefs;\nvar ownerHasKeyUseWarning;\nvar ownerHasFunctionTypeWarning;\n\nvar warnForMissingKey = function (child) {};\n\n{\n  didWarnAboutMaps = false;\n  didWarnAboutGenerators = false;\n  didWarnAboutStringRefs = {};\n  /**\n   * Warn if there's no key explicitly set on dynamic arrays of children or\n   * object keys are not valid. This allows us to keep track of children between\n   * updates.\n   */\n\n  ownerHasKeyUseWarning = {};\n  ownerHasFunctionTypeWarning = {};\n\n  warnForMissingKey = function (child) {\n    if (child === null || typeof child !== 'object') {\n      return;\n    }\n\n    if (!child._store || child._store.validated || child.key != null) {\n      return;\n    }\n\n    if (!(typeof child._store === 'object')) {\n      {\n        throw Error( \"React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    child._store.validated = true;\n    var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();\n\n    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasKeyUseWarning[currentComponentErrorInfo] = true;\n\n    error('Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.');\n  };\n}\n\nvar isArray$1 = Array.isArray;\n\nfunction coerceRef(returnFiber, current, element) {\n  var mixedRef = element.ref;\n\n  if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {\n    {\n      // TODO: Clean this up once we turn on the string ref warning for\n      // everyone, because the strict mode case will no longer be relevant\n      if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs\n      // because these cannot be automatically converted to an arrow function\n      // using a codemod. Therefore, we don't have to warn about string refs again.\n      !(element._owner && element._self && element._owner.stateNode !== element._self)) {\n        var componentName = getComponentName(returnFiber.type) || 'Component';\n\n        if (!didWarnAboutStringRefs[componentName]) {\n          {\n            error('A string ref, \"%s\", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber));\n          }\n\n          didWarnAboutStringRefs[componentName] = true;\n        }\n      }\n    }\n\n    if (element._owner) {\n      var owner = element._owner;\n      var inst;\n\n      if (owner) {\n        var ownerFiber = owner;\n\n        if (!(ownerFiber.tag === ClassComponent)) {\n          {\n            throw Error( \"Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref\" );\n          }\n        }\n\n        inst = ownerFiber.stateNode;\n      }\n\n      if (!inst) {\n        {\n          throw Error( \"Missing owner for string ref \" + mixedRef + \". This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref\n\n      if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {\n        return current.ref;\n      }\n\n      var ref = function (value) {\n        var refs = inst.refs;\n\n        if (refs === emptyRefsObject) {\n          // This is a lazy pooled frozen object, so we need to initialize.\n          refs = inst.refs = {};\n        }\n\n        if (value === null) {\n          delete refs[stringRef];\n        } else {\n          refs[stringRef] = value;\n        }\n      };\n\n      ref._stringRef = stringRef;\n      return ref;\n    } else {\n      if (!(typeof mixedRef === 'string')) {\n        {\n          throw Error( \"Expected ref to be a function, a string, an object returned by React.createRef(), or null.\" );\n        }\n      }\n\n      if (!element._owner) {\n        {\n          throw Error( \"Element ref was specified as a string (\" + mixedRef + \") but no owner was set. This could happen for one of the following reasons:\\n1. You may be adding a ref to a function component\\n2. You may be adding a ref to a component that was not created inside a component's render method\\n3. You have multiple copies of React loaded\\nSee https://fb.me/react-refs-must-have-owner for more information.\" );\n        }\n      }\n    }\n  }\n\n  return mixedRef;\n}\n\nfunction throwOnInvalidObjectType(returnFiber, newChild) {\n  if (returnFiber.type !== 'textarea') {\n    var addendum = '';\n\n    {\n      addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();\n    }\n\n    {\n      {\n        throw Error( \"Objects are not valid as a React child (found: \" + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + \").\" + addendum );\n      }\n    }\n  }\n}\n\nfunction warnOnFunctionType() {\n  {\n    var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();\n\n    if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;\n\n    error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');\n  }\n} // This wrapper function exists because I expect to clone the code in each path\n// to be able to optimize each path individually by branching early. This needs\n// a compiler or we can do it manually. Helpers that don't need this branching\n// live outside of this function.\n\n\nfunction ChildReconciler(shouldTrackSideEffects) {\n  function deleteChild(returnFiber, childToDelete) {\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return;\n    } // Deletions are added in reversed order so we add it to the front.\n    // At this point, the return fiber's effect list is empty except for\n    // deletions, so we can just append the deletion to the list. The remaining\n    // effects aren't added until the complete phase. Once we implement\n    // resuming, this may not be true.\n\n\n    var last = returnFiber.lastEffect;\n\n    if (last !== null) {\n      last.nextEffect = childToDelete;\n      returnFiber.lastEffect = childToDelete;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n    }\n\n    childToDelete.nextEffect = null;\n    childToDelete.effectTag = Deletion;\n  }\n\n  function deleteRemainingChildren(returnFiber, currentFirstChild) {\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return null;\n    } // TODO: For the shouldClone case, this could be micro-optimized a bit by\n    // assuming that after the first child we've already added everything.\n\n\n    var childToDelete = currentFirstChild;\n\n    while (childToDelete !== null) {\n      deleteChild(returnFiber, childToDelete);\n      childToDelete = childToDelete.sibling;\n    }\n\n    return null;\n  }\n\n  function mapRemainingChildren(returnFiber, currentFirstChild) {\n    // Add the remaining children to a temporary map so that we can find them by\n    // keys quickly. Implicit (null) keys get added to this set with their index\n    // instead.\n    var existingChildren = new Map();\n    var existingChild = currentFirstChild;\n\n    while (existingChild !== null) {\n      if (existingChild.key !== null) {\n        existingChildren.set(existingChild.key, existingChild);\n      } else {\n        existingChildren.set(existingChild.index, existingChild);\n      }\n\n      existingChild = existingChild.sibling;\n    }\n\n    return existingChildren;\n  }\n\n  function useFiber(fiber, pendingProps) {\n    // We currently set sibling to null and index to 0 here because it is easy\n    // to forget to do before returning it. E.g. for the single child case.\n    var clone = createWorkInProgress(fiber, pendingProps);\n    clone.index = 0;\n    clone.sibling = null;\n    return clone;\n  }\n\n  function placeChild(newFiber, lastPlacedIndex, newIndex) {\n    newFiber.index = newIndex;\n\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return lastPlacedIndex;\n    }\n\n    var current = newFiber.alternate;\n\n    if (current !== null) {\n      var oldIndex = current.index;\n\n      if (oldIndex < lastPlacedIndex) {\n        // This is a move.\n        newFiber.effectTag = Placement;\n        return lastPlacedIndex;\n      } else {\n        // This item can stay in place.\n        return oldIndex;\n      }\n    } else {\n      // This is an insertion.\n      newFiber.effectTag = Placement;\n      return lastPlacedIndex;\n    }\n  }\n\n  function placeSingleChild(newFiber) {\n    // This is simpler for the single child case. We only need to do a\n    // placement for inserting new children.\n    if (shouldTrackSideEffects && newFiber.alternate === null) {\n      newFiber.effectTag = Placement;\n    }\n\n    return newFiber;\n  }\n\n  function updateTextNode(returnFiber, current, textContent, expirationTime) {\n    if (current === null || current.tag !== HostText) {\n      // Insert\n      var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, textContent);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function updateElement(returnFiber, current, element, expirationTime) {\n    if (current !== null) {\n      if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n       isCompatibleFamilyForHotReloading(current, element) )) {\n        // Move based on index\n        var existing = useFiber(current, element.props);\n        existing.ref = coerceRef(returnFiber, current, element);\n        existing.return = returnFiber;\n\n        {\n          existing._debugSource = element._source;\n          existing._debugOwner = element._owner;\n        }\n\n        return existing;\n      }\n    } // Insert\n\n\n    var created = createFiberFromElement(element, returnFiber.mode, expirationTime);\n    created.ref = coerceRef(returnFiber, current, element);\n    created.return = returnFiber;\n    return created;\n  }\n\n  function updatePortal(returnFiber, current, portal, expirationTime) {\n    if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {\n      // Insert\n      var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, portal.children || []);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function updateFragment(returnFiber, current, fragment, expirationTime, key) {\n    if (current === null || current.tag !== Fragment) {\n      // Insert\n      var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, fragment);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function createChild(returnFiber, newChild, expirationTime) {\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys. If the previous node is implicitly keyed\n      // we can continue to replace it without aborting even if it is not a text\n      // node.\n      var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);\n\n            _created.ref = coerceRef(returnFiber, null, newChild);\n            _created.return = returnFiber;\n            return _created;\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);\n\n            _created2.return = returnFiber;\n            return _created2;\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);\n\n        _created3.return = returnFiber;\n        return _created3;\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n\n  function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {\n    // Update the fiber if the keys match, otherwise return null.\n    var key = oldFiber !== null ? oldFiber.key : null;\n\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys. If the previous node is implicitly keyed\n      // we can continue to replace it without aborting even if it is not a text\n      // node.\n      if (key !== null) {\n        return null;\n      }\n\n      return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            if (newChild.key === key) {\n              if (newChild.type === REACT_FRAGMENT_TYPE) {\n                return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);\n              }\n\n              return updateElement(returnFiber, oldFiber, newChild, expirationTime);\n            } else {\n              return null;\n            }\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            if (newChild.key === key) {\n              return updatePortal(returnFiber, oldFiber, newChild, expirationTime);\n            } else {\n              return null;\n            }\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        if (key !== null) {\n          return null;\n        }\n\n        return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n\n  function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys, so we neither have to check the old nor\n      // new node for the key. If both are text nodes, they match.\n      var matchedFiber = existingChildren.get(newIdx) || null;\n      return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n            if (newChild.type === REACT_FRAGMENT_TYPE) {\n              return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);\n            }\n\n            return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n            return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        var _matchedFiber3 = existingChildren.get(newIdx) || null;\n\n        return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n  /**\n   * Warns if there is a duplicate or missing key\n   */\n\n\n  function warnOnInvalidKey(child, knownKeys) {\n    {\n      if (typeof child !== 'object' || child === null) {\n        return knownKeys;\n      }\n\n      switch (child.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n        case REACT_PORTAL_TYPE:\n          warnForMissingKey(child);\n          var key = child.key;\n\n          if (typeof key !== 'string') {\n            break;\n          }\n\n          if (knownKeys === null) {\n            knownKeys = new Set();\n            knownKeys.add(key);\n            break;\n          }\n\n          if (!knownKeys.has(key)) {\n            knownKeys.add(key);\n            break;\n          }\n\n          error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);\n\n          break;\n      }\n    }\n\n    return knownKeys;\n  }\n\n  function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {\n    // This algorithm can't optimize by searching from both ends since we\n    // don't have backpointers on fibers. I'm trying to see how far we can get\n    // with that model. If it ends up not being worth the tradeoffs, we can\n    // add it later.\n    // Even with a two ended optimization, we'd want to optimize for the case\n    // where there are few changes and brute force the comparison instead of\n    // going for the Map. It'd like to explore hitting that path first in\n    // forward-only mode and only go for the Map once we notice that we need\n    // lots of look ahead. This doesn't handle reversal as well as two ended\n    // search but that's unusual. Besides, for the two ended optimization to\n    // work on Iterables, we'd need to copy the whole set.\n    // In this first iteration, we'll just live with hitting the bad case\n    // (adding everything to a Map) in for every insert/move.\n    // If you change this code, also update reconcileChildrenIterator() which\n    // uses the same algorithm.\n    {\n      // First, validate keys.\n      var knownKeys = null;\n\n      for (var i = 0; i < newChildren.length; i++) {\n        var child = newChildren[i];\n        knownKeys = warnOnInvalidKey(child, knownKeys);\n      }\n    }\n\n    var resultingFirstChild = null;\n    var previousNewFiber = null;\n    var oldFiber = currentFirstChild;\n    var lastPlacedIndex = 0;\n    var newIdx = 0;\n    var nextOldFiber = null;\n\n    for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {\n      if (oldFiber.index > newIdx) {\n        nextOldFiber = oldFiber;\n        oldFiber = null;\n      } else {\n        nextOldFiber = oldFiber.sibling;\n      }\n\n      var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);\n\n      if (newFiber === null) {\n        // TODO: This breaks on empty slots like null children. That's\n        // unfortunate because it triggers the slow path all the time. We need\n        // a better way to communicate whether this was a miss or null,\n        // boolean, undefined, etc.\n        if (oldFiber === null) {\n          oldFiber = nextOldFiber;\n        }\n\n        break;\n      }\n\n      if (shouldTrackSideEffects) {\n        if (oldFiber && newFiber.alternate === null) {\n          // We matched the slot, but we didn't reuse the existing fiber, so we\n          // need to delete the existing child.\n          deleteChild(returnFiber, oldFiber);\n        }\n      }\n\n      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n      if (previousNewFiber === null) {\n        // TODO: Move out of the loop. This only happens for the first run.\n        resultingFirstChild = newFiber;\n      } else {\n        // TODO: Defer siblings if we're not at the right index for this slot.\n        // I.e. if we had null values before, then we want to defer this\n        // for each null value. However, we also don't want to call updateSlot\n        // with the previous one.\n        previousNewFiber.sibling = newFiber;\n      }\n\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n\n    if (newIdx === newChildren.length) {\n      // We've reached the end of the new children. We can delete the rest.\n      deleteRemainingChildren(returnFiber, oldFiber);\n      return resultingFirstChild;\n    }\n\n    if (oldFiber === null) {\n      // If we don't have any more existing children we can choose a fast path\n      // since the rest will all be insertions.\n      for (; newIdx < newChildren.length; newIdx++) {\n        var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);\n\n        if (_newFiber === null) {\n          continue;\n        }\n\n        lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = _newFiber;\n        } else {\n          previousNewFiber.sibling = _newFiber;\n        }\n\n        previousNewFiber = _newFiber;\n      }\n\n      return resultingFirstChild;\n    } // Add all children to a key map for quick lookups.\n\n\n    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n    for (; newIdx < newChildren.length; newIdx++) {\n      var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);\n\n      if (_newFiber2 !== null) {\n        if (shouldTrackSideEffects) {\n          if (_newFiber2.alternate !== null) {\n            // The new fiber is a work in progress, but if there exists a\n            // current, that means that we reused the fiber. We need to delete\n            // it from the child list so that we don't add it to the deletion\n            // list.\n            existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);\n          }\n        }\n\n        lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          resultingFirstChild = _newFiber2;\n        } else {\n          previousNewFiber.sibling = _newFiber2;\n        }\n\n        previousNewFiber = _newFiber2;\n      }\n    }\n\n    if (shouldTrackSideEffects) {\n      // Any existing children that weren't consumed above were deleted. We need\n      // to add them to the deletion list.\n      existingChildren.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    }\n\n    return resultingFirstChild;\n  }\n\n  function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {\n    // This is the same implementation as reconcileChildrenArray(),\n    // but using the iterator instead.\n    var iteratorFn = getIteratorFn(newChildrenIterable);\n\n    if (!(typeof iteratorFn === 'function')) {\n      {\n        throw Error( \"An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    {\n      // We don't support rendering Generators because it's a mutation.\n      // See https://github.com/facebook/react/issues/12995\n      if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag\n      newChildrenIterable[Symbol.toStringTag] === 'Generator') {\n        if (!didWarnAboutGenerators) {\n          error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');\n        }\n\n        didWarnAboutGenerators = true;\n      } // Warn about using Maps as children\n\n\n      if (newChildrenIterable.entries === iteratorFn) {\n        if (!didWarnAboutMaps) {\n          error('Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.');\n        }\n\n        didWarnAboutMaps = true;\n      } // First, validate keys.\n      // We'll get a different iterator later for the main pass.\n\n\n      var _newChildren = iteratorFn.call(newChildrenIterable);\n\n      if (_newChildren) {\n        var knownKeys = null;\n\n        var _step = _newChildren.next();\n\n        for (; !_step.done; _step = _newChildren.next()) {\n          var child = _step.value;\n          knownKeys = warnOnInvalidKey(child, knownKeys);\n        }\n      }\n    }\n\n    var newChildren = iteratorFn.call(newChildrenIterable);\n\n    if (!(newChildren != null)) {\n      {\n        throw Error( \"An iterable object provided no iterator.\" );\n      }\n    }\n\n    var resultingFirstChild = null;\n    var previousNewFiber = null;\n    var oldFiber = currentFirstChild;\n    var lastPlacedIndex = 0;\n    var newIdx = 0;\n    var nextOldFiber = null;\n    var step = newChildren.next();\n\n    for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {\n      if (oldFiber.index > newIdx) {\n        nextOldFiber = oldFiber;\n        oldFiber = null;\n      } else {\n        nextOldFiber = oldFiber.sibling;\n      }\n\n      var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);\n\n      if (newFiber === null) {\n        // TODO: This breaks on empty slots like null children. That's\n        // unfortunate because it triggers the slow path all the time. We need\n        // a better way to communicate whether this was a miss or null,\n        // boolean, undefined, etc.\n        if (oldFiber === null) {\n          oldFiber = nextOldFiber;\n        }\n\n        break;\n      }\n\n      if (shouldTrackSideEffects) {\n        if (oldFiber && newFiber.alternate === null) {\n          // We matched the slot, but we didn't reuse the existing fiber, so we\n          // need to delete the existing child.\n          deleteChild(returnFiber, oldFiber);\n        }\n      }\n\n      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n      if (previousNewFiber === null) {\n        // TODO: Move out of the loop. This only happens for the first run.\n        resultingFirstChild = newFiber;\n      } else {\n        // TODO: Defer siblings if we're not at the right index for this slot.\n        // I.e. if we had null values before, then we want to defer this\n        // for each null value. However, we also don't want to call updateSlot\n        // with the previous one.\n        previousNewFiber.sibling = newFiber;\n      }\n\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n\n    if (step.done) {\n      // We've reached the end of the new children. We can delete the rest.\n      deleteRemainingChildren(returnFiber, oldFiber);\n      return resultingFirstChild;\n    }\n\n    if (oldFiber === null) {\n      // If we don't have any more existing children we can choose a fast path\n      // since the rest will all be insertions.\n      for (; !step.done; newIdx++, step = newChildren.next()) {\n        var _newFiber3 = createChild(returnFiber, step.value, expirationTime);\n\n        if (_newFiber3 === null) {\n          continue;\n        }\n\n        lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = _newFiber3;\n        } else {\n          previousNewFiber.sibling = _newFiber3;\n        }\n\n        previousNewFiber = _newFiber3;\n      }\n\n      return resultingFirstChild;\n    } // Add all children to a key map for quick lookups.\n\n\n    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n    for (; !step.done; newIdx++, step = newChildren.next()) {\n      var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);\n\n      if (_newFiber4 !== null) {\n        if (shouldTrackSideEffects) {\n          if (_newFiber4.alternate !== null) {\n            // The new fiber is a work in progress, but if there exists a\n            // current, that means that we reused the fiber. We need to delete\n            // it from the child list so that we don't add it to the deletion\n            // list.\n            existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);\n          }\n        }\n\n        lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          resultingFirstChild = _newFiber4;\n        } else {\n          previousNewFiber.sibling = _newFiber4;\n        }\n\n        previousNewFiber = _newFiber4;\n      }\n    }\n\n    if (shouldTrackSideEffects) {\n      // Any existing children that weren't consumed above were deleted. We need\n      // to add them to the deletion list.\n      existingChildren.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    }\n\n    return resultingFirstChild;\n  }\n\n  function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {\n    // There's no need to check for keys on text nodes since we don't have a\n    // way to define them.\n    if (currentFirstChild !== null && currentFirstChild.tag === HostText) {\n      // We already have an existing node so let's just update it and delete\n      // the rest.\n      deleteRemainingChildren(returnFiber, currentFirstChild.sibling);\n      var existing = useFiber(currentFirstChild, textContent);\n      existing.return = returnFiber;\n      return existing;\n    } // The existing first child is not a text node so we need to create one\n    // and delete the existing ones.\n\n\n    deleteRemainingChildren(returnFiber, currentFirstChild);\n    var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n    created.return = returnFiber;\n    return created;\n  }\n\n  function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {\n    var key = element.key;\n    var child = currentFirstChild;\n\n    while (child !== null) {\n      // TODO: If key === null and child.key === null, then this only applies to\n      // the first item in the list.\n      if (child.key === key) {\n        switch (child.tag) {\n          case Fragment:\n            {\n              if (element.type === REACT_FRAGMENT_TYPE) {\n                deleteRemainingChildren(returnFiber, child.sibling);\n                var existing = useFiber(child, element.props.children);\n                existing.return = returnFiber;\n\n                {\n                  existing._debugSource = element._source;\n                  existing._debugOwner = element._owner;\n                }\n\n                return existing;\n              }\n\n              break;\n            }\n\n          case Block:\n\n          // We intentionally fallthrough here if enableBlocksAPI is not on.\n          // eslint-disable-next-lined no-fallthrough\n\n          default:\n            {\n              if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n               isCompatibleFamilyForHotReloading(child, element) )) {\n                deleteRemainingChildren(returnFiber, child.sibling);\n\n                var _existing3 = useFiber(child, element.props);\n\n                _existing3.ref = coerceRef(returnFiber, child, element);\n                _existing3.return = returnFiber;\n\n                {\n                  _existing3._debugSource = element._source;\n                  _existing3._debugOwner = element._owner;\n                }\n\n                return _existing3;\n              }\n\n              break;\n            }\n        } // Didn't match.\n\n\n        deleteRemainingChildren(returnFiber, child);\n        break;\n      } else {\n        deleteChild(returnFiber, child);\n      }\n\n      child = child.sibling;\n    }\n\n    if (element.type === REACT_FRAGMENT_TYPE) {\n      var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);\n      created.return = returnFiber;\n      return created;\n    } else {\n      var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);\n\n      _created4.ref = coerceRef(returnFiber, currentFirstChild, element);\n      _created4.return = returnFiber;\n      return _created4;\n    }\n  }\n\n  function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {\n    var key = portal.key;\n    var child = currentFirstChild;\n\n    while (child !== null) {\n      // TODO: If key === null and child.key === null, then this only applies to\n      // the first item in the list.\n      if (child.key === key) {\n        if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {\n          deleteRemainingChildren(returnFiber, child.sibling);\n          var existing = useFiber(child, portal.children || []);\n          existing.return = returnFiber;\n          return existing;\n        } else {\n          deleteRemainingChildren(returnFiber, child);\n          break;\n        }\n      } else {\n        deleteChild(returnFiber, child);\n      }\n\n      child = child.sibling;\n    }\n\n    var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n    created.return = returnFiber;\n    return created;\n  } // This API will tag the children with the side-effect of the reconciliation\n  // itself. They will be added to the side-effect list as we pass through the\n  // children and the parent.\n\n\n  function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {\n    // This function is not recursive.\n    // If the top level item is an array, we treat it as a set of children,\n    // not as a fragment. Nested arrays on the other hand will be treated as\n    // fragment nodes. Recursion happens at the normal flow.\n    // Handle top level unkeyed fragments as if they were arrays.\n    // This leads to an ambiguity between <>{[...]}</> and <>...</>.\n    // We treat the ambiguous cases above the same.\n    var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;\n\n    if (isUnkeyedTopLevelFragment) {\n      newChild = newChild.props.children;\n    } // Handle object types\n\n\n    var isObject = typeof newChild === 'object' && newChild !== null;\n\n    if (isObject) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));\n\n        case REACT_PORTAL_TYPE:\n          return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));\n      }\n    }\n\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));\n    }\n\n    if (isArray$1(newChild)) {\n      return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);\n    }\n\n    if (getIteratorFn(newChild)) {\n      return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);\n    }\n\n    if (isObject) {\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {\n      // If the new child is undefined, and the return fiber is a composite\n      // component, throw an error. If Fiber return types are disabled,\n      // we already threw above.\n      switch (returnFiber.tag) {\n        case ClassComponent:\n          {\n            {\n              var instance = returnFiber.stateNode;\n\n              if (instance.render._isMockFunction) {\n                // We allow auto-mocks to proceed as if they're returning null.\n                break;\n              }\n            }\n          }\n        // Intentionally fall through to the next case, which handles both\n        // functions and classes\n        // eslint-disable-next-lined no-fallthrough\n\n        case FunctionComponent:\n          {\n            var Component = returnFiber.type;\n\n            {\n              {\n                throw Error( (Component.displayName || Component.name || 'Component') + \"(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.\" );\n              }\n            }\n          }\n      }\n    } // Remaining cases are all treated as empty.\n\n\n    return deleteRemainingChildren(returnFiber, currentFirstChild);\n  }\n\n  return reconcileChildFibers;\n}\n\nvar reconcileChildFibers = ChildReconciler(true);\nvar mountChildFibers = ChildReconciler(false);\nfunction cloneChildFibers(current, workInProgress) {\n  if (!(current === null || workInProgress.child === current.child)) {\n    {\n      throw Error( \"Resuming work not yet implemented.\" );\n    }\n  }\n\n  if (workInProgress.child === null) {\n    return;\n  }\n\n  var currentChild = workInProgress.child;\n  var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);\n  workInProgress.child = newChild;\n  newChild.return = workInProgress;\n\n  while (currentChild.sibling !== null) {\n    currentChild = currentChild.sibling;\n    newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);\n    newChild.return = workInProgress;\n  }\n\n  newChild.sibling = null;\n} // Reset a workInProgress child set to prepare it for a second pass.\n\nfunction resetChildFibers(workInProgress, renderExpirationTime) {\n  var child = workInProgress.child;\n\n  while (child !== null) {\n    resetWorkInProgress(child, renderExpirationTime);\n    child = child.sibling;\n  }\n}\n\nvar NO_CONTEXT = {};\nvar contextStackCursor$1 = createCursor(NO_CONTEXT);\nvar contextFiberStackCursor = createCursor(NO_CONTEXT);\nvar rootInstanceStackCursor = createCursor(NO_CONTEXT);\n\nfunction requiredContext(c) {\n  if (!(c !== NO_CONTEXT)) {\n    {\n      throw Error( \"Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  return c;\n}\n\nfunction getRootHostContainer() {\n  var rootInstance = requiredContext(rootInstanceStackCursor.current);\n  return rootInstance;\n}\n\nfunction pushHostContainer(fiber, nextRootInstance) {\n  // Push current root instance onto the stack;\n  // This allows us to reset root when portals are popped.\n  push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.\n  // This enables us to pop only Fibers that provide unique contexts.\n\n  push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.\n  // However, we can't just call getRootHostContext() and push it because\n  // we'd have a different number of entries on the stack depending on\n  // whether getRootHostContext() throws somewhere in renderer code or not.\n  // So we push an empty value first. This lets us safely unwind on errors.\n\n  push(contextStackCursor$1, NO_CONTEXT, fiber);\n  var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.\n\n  pop(contextStackCursor$1, fiber);\n  push(contextStackCursor$1, nextRootContext, fiber);\n}\n\nfunction popHostContainer(fiber) {\n  pop(contextStackCursor$1, fiber);\n  pop(contextFiberStackCursor, fiber);\n  pop(rootInstanceStackCursor, fiber);\n}\n\nfunction getHostContext() {\n  var context = requiredContext(contextStackCursor$1.current);\n  return context;\n}\n\nfunction pushHostContext(fiber) {\n  var rootInstance = requiredContext(rootInstanceStackCursor.current);\n  var context = requiredContext(contextStackCursor$1.current);\n  var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.\n\n  if (context === nextContext) {\n    return;\n  } // Track the context and the Fiber that provided it.\n  // This enables us to pop only Fibers that provide unique contexts.\n\n\n  push(contextFiberStackCursor, fiber, fiber);\n  push(contextStackCursor$1, nextContext, fiber);\n}\n\nfunction popHostContext(fiber) {\n  // Do not pop unless this Fiber provided the current context.\n  // pushHostContext() only pushes Fibers that provide unique contexts.\n  if (contextFiberStackCursor.current !== fiber) {\n    return;\n  }\n\n  pop(contextStackCursor$1, fiber);\n  pop(contextFiberStackCursor, fiber);\n}\n\nvar DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is\n// inherited deeply down the subtree. The upper bits only affect\n// this immediate suspense boundary and gets reset each new\n// boundary or suspense list.\n\nvar SubtreeSuspenseContextMask = 1; // Subtree Flags:\n// InvisibleParentSuspenseContext indicates that one of our parent Suspense\n// boundaries is not currently showing visible main content.\n// Either because it is already showing a fallback or is not mounted at all.\n// We can use this to determine if it is desirable to trigger a fallback at\n// the parent. If not, then we might need to trigger undesirable boundaries\n// and/or suspend the commit to avoid hiding the parent content.\n\nvar InvisibleParentSuspenseContext = 1; // Shallow Flags:\n// ForceSuspenseFallback can be used by SuspenseList to force newly added\n// items into their fallback state during one of the render passes.\n\nvar ForceSuspenseFallback = 2;\nvar suspenseStackCursor = createCursor(DefaultSuspenseContext);\nfunction hasSuspenseContext(parentContext, flag) {\n  return (parentContext & flag) !== 0;\n}\nfunction setDefaultShallowSuspenseContext(parentContext) {\n  return parentContext & SubtreeSuspenseContextMask;\n}\nfunction setShallowSuspenseContext(parentContext, shallowContext) {\n  return parentContext & SubtreeSuspenseContextMask | shallowContext;\n}\nfunction addSubtreeSuspenseContext(parentContext, subtreeContext) {\n  return parentContext | subtreeContext;\n}\nfunction pushSuspenseContext(fiber, newContext) {\n  push(suspenseStackCursor, newContext, fiber);\n}\nfunction popSuspenseContext(fiber) {\n  pop(suspenseStackCursor, fiber);\n}\n\nfunction shouldCaptureSuspense(workInProgress, hasInvisibleParent) {\n  // If it was the primary children that just suspended, capture and render the\n  // fallback. Otherwise, don't capture and bubble to the next boundary.\n  var nextState = workInProgress.memoizedState;\n\n  if (nextState !== null) {\n    if (nextState.dehydrated !== null) {\n      // A dehydrated boundary always captures.\n      return true;\n    }\n\n    return false;\n  }\n\n  var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop.\n\n  if (props.fallback === undefined) {\n    return false;\n  } // Regular boundaries always capture.\n\n\n  if (props.unstable_avoidThisFallback !== true) {\n    return true;\n  } // If it's a boundary we should avoid, then we prefer to bubble up to the\n  // parent boundary if it is currently invisible.\n\n\n  if (hasInvisibleParent) {\n    return false;\n  } // If the parent is not able to handle it, we must handle it.\n\n\n  return true;\n}\nfunction findFirstSuspended(row) {\n  var node = row;\n\n  while (node !== null) {\n    if (node.tag === SuspenseComponent) {\n      var state = node.memoizedState;\n\n      if (state !== null) {\n        var dehydrated = state.dehydrated;\n\n        if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {\n          return node;\n        }\n      }\n    } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't\n    // keep track of whether it suspended or not.\n    node.memoizedProps.revealOrder !== undefined) {\n      var didSuspend = (node.effectTag & DidCapture) !== NoEffect;\n\n      if (didSuspend) {\n        return node;\n      }\n    } else if (node.child !== null) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === row) {\n      return null;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === row) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n\n  return null;\n}\n\nfunction createDeprecatedResponderListener(responder, props) {\n  var eventResponderListener = {\n    responder: responder,\n    props: props\n  };\n\n  {\n    Object.freeze(eventResponderListener);\n  }\n\n  return eventResponderListener;\n}\n\nvar HasEffect =\n/* */\n1; // Represents the phase in which the effect (not the clean-up) fires.\n\nvar Layout =\n/*    */\n2;\nvar Passive$1 =\n/*   */\n4;\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher,\n    ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;\nvar didWarnAboutMismatchedHooksForComponent;\n\n{\n  didWarnAboutMismatchedHooksForComponent = new Set();\n}\n\n// These are set right before calling the component.\nvar renderExpirationTime = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from\n// the work-in-progress hook.\n\nvar currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The\n// current hook list is the list that belongs to the current fiber. The\n// work-in-progress hook list is a new list that will be added to the\n// work-in-progress fiber.\n\nvar currentHook = null;\nvar workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This\n// does not get reset if we do another render pass; only when we're completely\n// finished evaluating this component. This is an optimization so we know\n// whether we need to clear render phase updates after a throw.\n\nvar didScheduleRenderPhaseUpdate = false;\nvar RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook\n\nvar currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.\n// The list stores the order of hooks used during the initial render (mount).\n// Subsequent renders (updates) reference this list.\n\nvar hookTypesDev = null;\nvar hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore\n// the dependencies for Hooks that need them (e.g. useEffect or useMemo).\n// When true, such Hooks will always be \"remounted\". Only used during hot reload.\n\nvar ignorePreviousDependencies = false;\n\nfunction mountHookTypesDev() {\n  {\n    var hookName = currentHookNameInDev;\n\n    if (hookTypesDev === null) {\n      hookTypesDev = [hookName];\n    } else {\n      hookTypesDev.push(hookName);\n    }\n  }\n}\n\nfunction updateHookTypesDev() {\n  {\n    var hookName = currentHookNameInDev;\n\n    if (hookTypesDev !== null) {\n      hookTypesUpdateIndexDev++;\n\n      if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {\n        warnOnHookMismatchInDev(hookName);\n      }\n    }\n  }\n}\n\nfunction checkDepsAreArrayDev(deps) {\n  {\n    if (deps !== undefined && deps !== null && !Array.isArray(deps)) {\n      // Verify deps, but only on mount to avoid extra checks.\n      // It's unlikely their type would change as usually you define them inline.\n      error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);\n    }\n  }\n}\n\nfunction warnOnHookMismatchInDev(currentHookName) {\n  {\n    var componentName = getComponentName(currentlyRenderingFiber$1.type);\n\n    if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {\n      didWarnAboutMismatchedHooksForComponent.add(componentName);\n\n      if (hookTypesDev !== null) {\n        var table = '';\n        var secondColumnStart = 30;\n\n        for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {\n          var oldHookName = hookTypesDev[i];\n          var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;\n          var row = i + 1 + \". \" + oldHookName; // Extra space so second column lines up\n          // lol @ IE not supporting String#repeat\n\n          while (row.length < secondColumnStart) {\n            row += ' ';\n          }\n\n          row += newHookName + '\\n';\n          table += row;\n        }\n\n        error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\\n\\n' + '   Previous render            Next render\\n' + '   ------------------------------------------------------\\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\n', componentName, table);\n      }\n    }\n  }\n}\n\nfunction throwInvalidHookError() {\n  {\n    {\n      throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n    }\n  }\n}\n\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n  {\n    if (ignorePreviousDependencies) {\n      // Only true when this component is being hot reloaded.\n      return false;\n    }\n  }\n\n  if (prevDeps === null) {\n    {\n      error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);\n    }\n\n    return false;\n  }\n\n  {\n    // Don't bother comparing lengths in prod because these arrays should be\n    // passed inline.\n    if (nextDeps.length !== prevDeps.length) {\n      error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\\n\\n' + 'Previous: %s\\n' + 'Incoming: %s', currentHookNameInDev, \"[\" + prevDeps.join(', ') + \"]\", \"[\" + nextDeps.join(', ') + \"]\");\n    }\n  }\n\n  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {\n    if (objectIs(nextDeps[i], prevDeps[i])) {\n      continue;\n    }\n\n    return false;\n  }\n\n  return true;\n}\n\nfunction renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderExpirationTime) {\n  renderExpirationTime = nextRenderExpirationTime;\n  currentlyRenderingFiber$1 = workInProgress;\n\n  {\n    hookTypesDev = current !== null ? current._debugHookTypes : null;\n    hookTypesUpdateIndexDev = -1; // Used for hot reloading:\n\n    ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;\n  }\n\n  workInProgress.memoizedState = null;\n  workInProgress.updateQueue = null;\n  workInProgress.expirationTime = NoWork; // The following should have already been reset\n  // currentHook = null;\n  // workInProgressHook = null;\n  // didScheduleRenderPhaseUpdate = false;\n  // TODO Warn if no hooks are used at all during mount, then some are used during update.\n  // Currently we will identify the update render as a mount because memoizedState === null.\n  // This is tricky because it's valid for certain types of components (e.g. React.lazy)\n  // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.\n  // Non-stateful hooks (e.g. context) don't get added to memoizedState,\n  // so memoizedState would be null during updates and mounts.\n\n  {\n    if (current !== null && current.memoizedState !== null) {\n      ReactCurrentDispatcher.current = HooksDispatcherOnUpdateInDEV;\n    } else if (hookTypesDev !== null) {\n      // This dispatcher handles an edge case where a component is updating,\n      // but no stateful hooks have been used.\n      // We want to match the production code behavior (which will use HooksDispatcherOnMount),\n      // but with the extra DEV validation to ensure hooks ordering hasn't changed.\n      // This dispatcher does that.\n      ReactCurrentDispatcher.current = HooksDispatcherOnMountWithHookTypesInDEV;\n    } else {\n      ReactCurrentDispatcher.current = HooksDispatcherOnMountInDEV;\n    }\n  }\n\n  var children = Component(props, secondArg); // Check if there was a render phase update\n\n  if (workInProgress.expirationTime === renderExpirationTime) {\n    // Keep rendering in a loop for as long as render phase updates continue to\n    // be scheduled. Use a counter to prevent infinite loops.\n    var numberOfReRenders = 0;\n\n    do {\n      workInProgress.expirationTime = NoWork;\n\n      if (!(numberOfReRenders < RE_RENDER_LIMIT)) {\n        {\n          throw Error( \"Too many re-renders. React limits the number of renders to prevent an infinite loop.\" );\n        }\n      }\n\n      numberOfReRenders += 1;\n\n      {\n        // Even when hot reloading, allow dependencies to stabilize\n        // after first render to prevent infinite render phase updates.\n        ignorePreviousDependencies = false;\n      } // Start over from the beginning of the list\n\n\n      currentHook = null;\n      workInProgressHook = null;\n      workInProgress.updateQueue = null;\n\n      {\n        // Also validate hook order for cascading updates.\n        hookTypesUpdateIndexDev = -1;\n      }\n\n      ReactCurrentDispatcher.current =  HooksDispatcherOnRerenderInDEV ;\n      children = Component(props, secondArg);\n    } while (workInProgress.expirationTime === renderExpirationTime);\n  } // We can assume the previous dispatcher is always this one, since we set it\n  // at the beginning of the render phase and there's no re-entrancy.\n\n\n  ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n  {\n    workInProgress._debugHookTypes = hookTypesDev;\n  } // This check uses currentHook so that it works the same in DEV and prod bundles.\n  // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.\n\n\n  var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;\n  renderExpirationTime = NoWork;\n  currentlyRenderingFiber$1 = null;\n  currentHook = null;\n  workInProgressHook = null;\n\n  {\n    currentHookNameInDev = null;\n    hookTypesDev = null;\n    hookTypesUpdateIndexDev = -1;\n  }\n\n  didScheduleRenderPhaseUpdate = false;\n\n  if (!!didRenderTooFewHooks) {\n    {\n      throw Error( \"Rendered fewer hooks than expected. This may be caused by an accidental early return statement.\" );\n    }\n  }\n\n  return children;\n}\nfunction bailoutHooks(current, workInProgress, expirationTime) {\n  workInProgress.updateQueue = current.updateQueue;\n  workInProgress.effectTag &= ~(Passive | Update);\n\n  if (current.expirationTime <= expirationTime) {\n    current.expirationTime = NoWork;\n  }\n}\nfunction resetHooksAfterThrow() {\n  // We can assume the previous dispatcher is always this one, since we set it\n  // at the beginning of the render phase and there's no re-entrancy.\n  ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n  if (didScheduleRenderPhaseUpdate) {\n    // There were render phase updates. These are only valid for this render\n    // phase, which we are now aborting. Remove the updates from the queues so\n    // they do not persist to the next render. Do not remove updates from hooks\n    // that weren't processed.\n    //\n    // Only reset the updates from the queue if it has a clone. If it does\n    // not have a clone, that means it wasn't processed, and the updates were\n    // scheduled before we entered the render phase.\n    var hook = currentlyRenderingFiber$1.memoizedState;\n\n    while (hook !== null) {\n      var queue = hook.queue;\n\n      if (queue !== null) {\n        queue.pending = null;\n      }\n\n      hook = hook.next;\n    }\n  }\n\n  renderExpirationTime = NoWork;\n  currentlyRenderingFiber$1 = null;\n  currentHook = null;\n  workInProgressHook = null;\n\n  {\n    hookTypesDev = null;\n    hookTypesUpdateIndexDev = -1;\n    currentHookNameInDev = null;\n  }\n\n  didScheduleRenderPhaseUpdate = false;\n}\n\nfunction mountWorkInProgressHook() {\n  var hook = {\n    memoizedState: null,\n    baseState: null,\n    baseQueue: null,\n    queue: null,\n    next: null\n  };\n\n  if (workInProgressHook === null) {\n    // This is the first hook in the list\n    currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;\n  } else {\n    // Append to the end of the list\n    workInProgressHook = workInProgressHook.next = hook;\n  }\n\n  return workInProgressHook;\n}\n\nfunction updateWorkInProgressHook() {\n  // This function is used both for updates and for re-renders triggered by a\n  // render phase update. It assumes there is either a current hook we can\n  // clone, or a work-in-progress hook from a previous render pass that we can\n  // use as a base. When we reach the end of the base list, we must switch to\n  // the dispatcher used for mounts.\n  var nextCurrentHook;\n\n  if (currentHook === null) {\n    var current = currentlyRenderingFiber$1.alternate;\n\n    if (current !== null) {\n      nextCurrentHook = current.memoizedState;\n    } else {\n      nextCurrentHook = null;\n    }\n  } else {\n    nextCurrentHook = currentHook.next;\n  }\n\n  var nextWorkInProgressHook;\n\n  if (workInProgressHook === null) {\n    nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;\n  } else {\n    nextWorkInProgressHook = workInProgressHook.next;\n  }\n\n  if (nextWorkInProgressHook !== null) {\n    // There's already a work-in-progress. Reuse it.\n    workInProgressHook = nextWorkInProgressHook;\n    nextWorkInProgressHook = workInProgressHook.next;\n    currentHook = nextCurrentHook;\n  } else {\n    // Clone from the current hook.\n    if (!(nextCurrentHook !== null)) {\n      {\n        throw Error( \"Rendered more hooks than during the previous render.\" );\n      }\n    }\n\n    currentHook = nextCurrentHook;\n    var newHook = {\n      memoizedState: currentHook.memoizedState,\n      baseState: currentHook.baseState,\n      baseQueue: currentHook.baseQueue,\n      queue: currentHook.queue,\n      next: null\n    };\n\n    if (workInProgressHook === null) {\n      // This is the first hook in the list.\n      currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;\n    } else {\n      // Append to the end of the list.\n      workInProgressHook = workInProgressHook.next = newHook;\n    }\n  }\n\n  return workInProgressHook;\n}\n\nfunction createFunctionComponentUpdateQueue() {\n  return {\n    lastEffect: null\n  };\n}\n\nfunction basicStateReducer(state, action) {\n  // $FlowFixMe: Flow doesn't like mixed types\n  return typeof action === 'function' ? action(state) : action;\n}\n\nfunction mountReducer(reducer, initialArg, init) {\n  var hook = mountWorkInProgressHook();\n  var initialState;\n\n  if (init !== undefined) {\n    initialState = init(initialArg);\n  } else {\n    initialState = initialArg;\n  }\n\n  hook.memoizedState = hook.baseState = initialState;\n  var queue = hook.queue = {\n    pending: null,\n    dispatch: null,\n    lastRenderedReducer: reducer,\n    lastRenderedState: initialState\n  };\n  var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n  return [hook.memoizedState, dispatch];\n}\n\nfunction updateReducer(reducer, initialArg, init) {\n  var hook = updateWorkInProgressHook();\n  var queue = hook.queue;\n\n  if (!(queue !== null)) {\n    {\n      throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n    }\n  }\n\n  queue.lastRenderedReducer = reducer;\n  var current = currentHook; // The last rebase update that is NOT part of the base state.\n\n  var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.\n\n  var pendingQueue = queue.pending;\n\n  if (pendingQueue !== null) {\n    // We have new updates that haven't been processed yet.\n    // We'll add them to the base queue.\n    if (baseQueue !== null) {\n      // Merge the pending queue and the base queue.\n      var baseFirst = baseQueue.next;\n      var pendingFirst = pendingQueue.next;\n      baseQueue.next = pendingFirst;\n      pendingQueue.next = baseFirst;\n    }\n\n    current.baseQueue = baseQueue = pendingQueue;\n    queue.pending = null;\n  }\n\n  if (baseQueue !== null) {\n    // We have a queue to process.\n    var first = baseQueue.next;\n    var newState = current.baseState;\n    var newBaseState = null;\n    var newBaseQueueFirst = null;\n    var newBaseQueueLast = null;\n    var update = first;\n\n    do {\n      var updateExpirationTime = update.expirationTime;\n\n      if (updateExpirationTime < renderExpirationTime) {\n        // Priority is insufficient. Skip this update. If this is the first\n        // skipped update, the previous update/state is the new base\n        // update/state.\n        var clone = {\n          expirationTime: update.expirationTime,\n          suspenseConfig: update.suspenseConfig,\n          action: update.action,\n          eagerReducer: update.eagerReducer,\n          eagerState: update.eagerState,\n          next: null\n        };\n\n        if (newBaseQueueLast === null) {\n          newBaseQueueFirst = newBaseQueueLast = clone;\n          newBaseState = newState;\n        } else {\n          newBaseQueueLast = newBaseQueueLast.next = clone;\n        } // Update the remaining priority in the queue.\n\n\n        if (updateExpirationTime > currentlyRenderingFiber$1.expirationTime) {\n          currentlyRenderingFiber$1.expirationTime = updateExpirationTime;\n          markUnprocessedUpdateTime(updateExpirationTime);\n        }\n      } else {\n        // This update does have sufficient priority.\n        if (newBaseQueueLast !== null) {\n          var _clone = {\n            expirationTime: Sync,\n            // This update is going to be committed so we never want uncommit it.\n            suspenseConfig: update.suspenseConfig,\n            action: update.action,\n            eagerReducer: update.eagerReducer,\n            eagerState: update.eagerState,\n            next: null\n          };\n          newBaseQueueLast = newBaseQueueLast.next = _clone;\n        } // Mark the event time of this update as relevant to this render pass.\n        // TODO: This should ideally use the true event time of this update rather than\n        // its priority which is a derived and not reverseable value.\n        // TODO: We should skip this update if it was already committed but currently\n        // we have no way of detecting the difference between a committed and suspended\n        // update here.\n\n\n        markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n        if (update.eagerReducer === reducer) {\n          // If this update was processed eagerly, and its reducer matches the\n          // current reducer, we can use the eagerly computed state.\n          newState = update.eagerState;\n        } else {\n          var action = update.action;\n          newState = reducer(newState, action);\n        }\n      }\n\n      update = update.next;\n    } while (update !== null && update !== first);\n\n    if (newBaseQueueLast === null) {\n      newBaseState = newState;\n    } else {\n      newBaseQueueLast.next = newBaseQueueFirst;\n    } // Mark that the fiber performed work, but only if the new state is\n    // different from the current state.\n\n\n    if (!objectIs(newState, hook.memoizedState)) {\n      markWorkInProgressReceivedUpdate();\n    }\n\n    hook.memoizedState = newState;\n    hook.baseState = newBaseState;\n    hook.baseQueue = newBaseQueueLast;\n    queue.lastRenderedState = newState;\n  }\n\n  var dispatch = queue.dispatch;\n  return [hook.memoizedState, dispatch];\n}\n\nfunction rerenderReducer(reducer, initialArg, init) {\n  var hook = updateWorkInProgressHook();\n  var queue = hook.queue;\n\n  if (!(queue !== null)) {\n    {\n      throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n    }\n  }\n\n  queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous\n  // work-in-progress hook.\n\n  var dispatch = queue.dispatch;\n  var lastRenderPhaseUpdate = queue.pending;\n  var newState = hook.memoizedState;\n\n  if (lastRenderPhaseUpdate !== null) {\n    // The queue doesn't persist past this render pass.\n    queue.pending = null;\n    var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;\n    var update = firstRenderPhaseUpdate;\n\n    do {\n      // Process this render phase update. We don't have to check the\n      // priority because it will always be the same as the current\n      // render's.\n      var action = update.action;\n      newState = reducer(newState, action);\n      update = update.next;\n    } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is\n    // different from the current state.\n\n\n    if (!objectIs(newState, hook.memoizedState)) {\n      markWorkInProgressReceivedUpdate();\n    }\n\n    hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to\n    // the base state unless the queue is empty.\n    // TODO: Not sure if this is the desired semantics, but it's what we\n    // do for gDSFP. I can't remember why.\n\n    if (hook.baseQueue === null) {\n      hook.baseState = newState;\n    }\n\n    queue.lastRenderedState = newState;\n  }\n\n  return [newState, dispatch];\n}\n\nfunction mountState(initialState) {\n  var hook = mountWorkInProgressHook();\n\n  if (typeof initialState === 'function') {\n    // $FlowFixMe: Flow doesn't like mixed types\n    initialState = initialState();\n  }\n\n  hook.memoizedState = hook.baseState = initialState;\n  var queue = hook.queue = {\n    pending: null,\n    dispatch: null,\n    lastRenderedReducer: basicStateReducer,\n    lastRenderedState: initialState\n  };\n  var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n  return [hook.memoizedState, dispatch];\n}\n\nfunction updateState(initialState) {\n  return updateReducer(basicStateReducer);\n}\n\nfunction rerenderState(initialState) {\n  return rerenderReducer(basicStateReducer);\n}\n\nfunction pushEffect(tag, create, destroy, deps) {\n  var effect = {\n    tag: tag,\n    create: create,\n    destroy: destroy,\n    deps: deps,\n    // Circular\n    next: null\n  };\n  var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;\n\n  if (componentUpdateQueue === null) {\n    componentUpdateQueue = createFunctionComponentUpdateQueue();\n    currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;\n    componentUpdateQueue.lastEffect = effect.next = effect;\n  } else {\n    var lastEffect = componentUpdateQueue.lastEffect;\n\n    if (lastEffect === null) {\n      componentUpdateQueue.lastEffect = effect.next = effect;\n    } else {\n      var firstEffect = lastEffect.next;\n      lastEffect.next = effect;\n      effect.next = firstEffect;\n      componentUpdateQueue.lastEffect = effect;\n    }\n  }\n\n  return effect;\n}\n\nfunction mountRef(initialValue) {\n  var hook = mountWorkInProgressHook();\n  var ref = {\n    current: initialValue\n  };\n\n  {\n    Object.seal(ref);\n  }\n\n  hook.memoizedState = ref;\n  return ref;\n}\n\nfunction updateRef(initialValue) {\n  var hook = updateWorkInProgressHook();\n  return hook.memoizedState;\n}\n\nfunction mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n  hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, undefined, nextDeps);\n}\n\nfunction updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var destroy = undefined;\n\n  if (currentHook !== null) {\n    var prevEffect = currentHook.memoizedState;\n    destroy = prevEffect.destroy;\n\n    if (nextDeps !== null) {\n      var prevDeps = prevEffect.deps;\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        pushEffect(hookEffectTag, create, destroy, nextDeps);\n        return;\n      }\n    }\n  }\n\n  currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n  hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, destroy, nextDeps);\n}\n\nfunction mountEffect(create, deps) {\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n    }\n  }\n\n  return mountEffectImpl(Update | Passive, Passive$1, create, deps);\n}\n\nfunction updateEffect(create, deps) {\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n    }\n  }\n\n  return updateEffectImpl(Update | Passive, Passive$1, create, deps);\n}\n\nfunction mountLayoutEffect(create, deps) {\n  return mountEffectImpl(Update, Layout, create, deps);\n}\n\nfunction updateLayoutEffect(create, deps) {\n  return updateEffectImpl(Update, Layout, create, deps);\n}\n\nfunction imperativeHandleEffect(create, ref) {\n  if (typeof ref === 'function') {\n    var refCallback = ref;\n\n    var _inst = create();\n\n    refCallback(_inst);\n    return function () {\n      refCallback(null);\n    };\n  } else if (ref !== null && ref !== undefined) {\n    var refObject = ref;\n\n    {\n      if (!refObject.hasOwnProperty('current')) {\n        error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');\n      }\n    }\n\n    var _inst2 = create();\n\n    refObject.current = _inst2;\n    return function () {\n      refObject.current = null;\n    };\n  }\n}\n\nfunction mountImperativeHandle(ref, create, deps) {\n  {\n    if (typeof create !== 'function') {\n      error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n    }\n  } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n  return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n}\n\nfunction updateImperativeHandle(ref, create, deps) {\n  {\n    if (typeof create !== 'function') {\n      error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n    }\n  } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n  return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n}\n\nfunction mountDebugValue(value, formatterFn) {// This hook is normally a no-op.\n  // The react-debug-hooks package injects its own implementation\n  // so that e.g. DevTools can display custom hook values.\n}\n\nvar updateDebugValue = mountDebugValue;\n\nfunction mountCallback(callback, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  hook.memoizedState = [callback, nextDeps];\n  return callback;\n}\n\nfunction updateCallback(callback, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var prevState = hook.memoizedState;\n\n  if (prevState !== null) {\n    if (nextDeps !== null) {\n      var prevDeps = prevState[1];\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        return prevState[0];\n      }\n    }\n  }\n\n  hook.memoizedState = [callback, nextDeps];\n  return callback;\n}\n\nfunction mountMemo(nextCreate, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var nextValue = nextCreate();\n  hook.memoizedState = [nextValue, nextDeps];\n  return nextValue;\n}\n\nfunction updateMemo(nextCreate, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var prevState = hook.memoizedState;\n\n  if (prevState !== null) {\n    // Assume these are defined. If they're not, areHookInputsEqual will warn.\n    if (nextDeps !== null) {\n      var prevDeps = prevState[1];\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        return prevState[0];\n      }\n    }\n  }\n\n  var nextValue = nextCreate();\n  hook.memoizedState = [nextValue, nextDeps];\n  return nextValue;\n}\n\nfunction mountDeferredValue(value, config) {\n  var _mountState = mountState(value),\n      prevValue = _mountState[0],\n      setValue = _mountState[1];\n\n  mountEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction updateDeferredValue(value, config) {\n  var _updateState = updateState(),\n      prevValue = _updateState[0],\n      setValue = _updateState[1];\n\n  updateEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction rerenderDeferredValue(value, config) {\n  var _rerenderState = rerenderState(),\n      prevValue = _rerenderState[0],\n      setValue = _rerenderState[1];\n\n  updateEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction startTransition(setPending, config, callback) {\n  var priorityLevel = getCurrentPriorityLevel();\n  runWithPriority$1(priorityLevel < UserBlockingPriority$1 ? UserBlockingPriority$1 : priorityLevel, function () {\n    setPending(true);\n  });\n  runWithPriority$1(priorityLevel > NormalPriority ? NormalPriority : priorityLevel, function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setPending(false);\n      callback();\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  });\n}\n\nfunction mountTransition(config) {\n  var _mountState2 = mountState(false),\n      isPending = _mountState2[0],\n      setPending = _mountState2[1];\n\n  var start = mountCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction updateTransition(config) {\n  var _updateState2 = updateState(),\n      isPending = _updateState2[0],\n      setPending = _updateState2[1];\n\n  var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction rerenderTransition(config) {\n  var _rerenderState2 = rerenderState(),\n      isPending = _rerenderState2[0],\n      setPending = _rerenderState2[1];\n\n  var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction dispatchAction(fiber, queue, action) {\n  {\n    if (typeof arguments[3] === 'function') {\n      error(\"State updates from the useState() and useReducer() Hooks don't support the \" + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');\n    }\n  }\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var suspenseConfig = requestCurrentSuspenseConfig();\n  var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n  var update = {\n    expirationTime: expirationTime,\n    suspenseConfig: suspenseConfig,\n    action: action,\n    eagerReducer: null,\n    eagerState: null,\n    next: null\n  };\n\n  {\n    update.priority = getCurrentPriorityLevel();\n  } // Append the update to the end of the list.\n\n\n  var pending = queue.pending;\n\n  if (pending === null) {\n    // This is the first update. Create a circular list.\n    update.next = update;\n  } else {\n    update.next = pending.next;\n    pending.next = update;\n  }\n\n  queue.pending = update;\n  var alternate = fiber.alternate;\n\n  if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {\n    // This is a render phase update. Stash it in a lazily-created map of\n    // queue -> linked list of updates. After this render pass, we'll restart\n    // and apply the stashed updates on top of the work-in-progress hook.\n    didScheduleRenderPhaseUpdate = true;\n    update.expirationTime = renderExpirationTime;\n    currentlyRenderingFiber$1.expirationTime = renderExpirationTime;\n  } else {\n    if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {\n      // The queue is currently empty, which means we can eagerly compute the\n      // next state before entering the render phase. If the new state is the\n      // same as the current state, we may be able to bail out entirely.\n      var lastRenderedReducer = queue.lastRenderedReducer;\n\n      if (lastRenderedReducer !== null) {\n        var prevDispatcher;\n\n        {\n          prevDispatcher = ReactCurrentDispatcher.current;\n          ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n        }\n\n        try {\n          var currentState = queue.lastRenderedState;\n          var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute\n          // it, on the update object. If the reducer hasn't changed by the\n          // time we enter the render phase, then the eager state can be used\n          // without calling the reducer again.\n\n          update.eagerReducer = lastRenderedReducer;\n          update.eagerState = eagerState;\n\n          if (objectIs(eagerState, currentState)) {\n            // Fast path. We can bail out without scheduling React to re-render.\n            // It's still possible that we'll need to rebase this update later,\n            // if the component re-renders for a different reason and by that\n            // time the reducer has changed.\n            return;\n          }\n        } catch (error) {// Suppress the error. It will throw again in the render phase.\n        } finally {\n          {\n            ReactCurrentDispatcher.current = prevDispatcher;\n          }\n        }\n      }\n    }\n\n    {\n      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n      if ('undefined' !== typeof jest) {\n        warnIfNotScopedWithMatchingAct(fiber);\n        warnIfNotCurrentlyActingUpdatesInDev(fiber);\n      }\n    }\n\n    scheduleWork(fiber, expirationTime);\n  }\n}\n\nvar ContextOnlyDispatcher = {\n  readContext: readContext,\n  useCallback: throwInvalidHookError,\n  useContext: throwInvalidHookError,\n  useEffect: throwInvalidHookError,\n  useImperativeHandle: throwInvalidHookError,\n  useLayoutEffect: throwInvalidHookError,\n  useMemo: throwInvalidHookError,\n  useReducer: throwInvalidHookError,\n  useRef: throwInvalidHookError,\n  useState: throwInvalidHookError,\n  useDebugValue: throwInvalidHookError,\n  useResponder: throwInvalidHookError,\n  useDeferredValue: throwInvalidHookError,\n  useTransition: throwInvalidHookError\n};\nvar HooksDispatcherOnMountInDEV = null;\nvar HooksDispatcherOnMountWithHookTypesInDEV = null;\nvar HooksDispatcherOnUpdateInDEV = null;\nvar HooksDispatcherOnRerenderInDEV = null;\nvar InvalidNestedHooksDispatcherOnMountInDEV = null;\nvar InvalidNestedHooksDispatcherOnUpdateInDEV = null;\nvar InvalidNestedHooksDispatcherOnRerenderInDEV = null;\n\n{\n  var warnInvalidContextAccess = function () {\n    error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n  };\n\n  var warnInvalidHookAccess = function () {\n    error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');\n  };\n\n  HooksDispatcherOnMountInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      mountHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      mountHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      mountHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      mountHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      mountHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      mountHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  HooksDispatcherOnMountWithHookTypesInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  HooksDispatcherOnUpdateInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return updateDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return updateTransition(config);\n    }\n  };\n  HooksDispatcherOnRerenderInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return rerenderReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return rerenderState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return rerenderDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return rerenderTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnMountInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnUpdateInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnRerenderInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return rerenderReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return rerenderState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return rerenderDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return rerenderTransition(config);\n    }\n  };\n}\n\nvar now$1 = Scheduler.unstable_now;\nvar commitTime = 0;\nvar profilerStartTime = -1;\n\nfunction getCommitTime() {\n  return commitTime;\n}\n\nfunction recordCommitTime() {\n\n  commitTime = now$1();\n}\n\nfunction startProfilerTimer(fiber) {\n\n  profilerStartTime = now$1();\n\n  if (fiber.actualStartTime < 0) {\n    fiber.actualStartTime = now$1();\n  }\n}\n\nfunction stopProfilerTimerIfRunning(fiber) {\n\n  profilerStartTime = -1;\n}\n\nfunction stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {\n\n  if (profilerStartTime >= 0) {\n    var elapsedTime = now$1() - profilerStartTime;\n    fiber.actualDuration += elapsedTime;\n\n    if (overrideBaseTime) {\n      fiber.selfBaseDuration = elapsedTime;\n    }\n\n    profilerStartTime = -1;\n  }\n}\n\n// This may have been an insertion or a hydration.\n\nvar hydrationParentFiber = null;\nvar nextHydratableInstance = null;\nvar isHydrating = false;\n\nfunction enterHydrationState(fiber) {\n\n  var parentInstance = fiber.stateNode.containerInfo;\n  nextHydratableInstance = getFirstHydratableChild(parentInstance);\n  hydrationParentFiber = fiber;\n  isHydrating = true;\n  return true;\n}\n\nfunction deleteHydratableInstance(returnFiber, instance) {\n  {\n    switch (returnFiber.tag) {\n      case HostRoot:\n        didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);\n        break;\n\n      case HostComponent:\n        didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);\n        break;\n    }\n  }\n\n  var childToDelete = createFiberFromHostInstanceForDeletion();\n  childToDelete.stateNode = instance;\n  childToDelete.return = returnFiber;\n  childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However,\n  // these children are not part of the reconciliation list of children.\n  // Even if we abort and rereconcile the children, that will try to hydrate\n  // again and the nodes are still in the host tree so these will be\n  // recreated.\n\n  if (returnFiber.lastEffect !== null) {\n    returnFiber.lastEffect.nextEffect = childToDelete;\n    returnFiber.lastEffect = childToDelete;\n  } else {\n    returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n  }\n}\n\nfunction insertNonHydratedInstance(returnFiber, fiber) {\n  fiber.effectTag = fiber.effectTag & ~Hydrating | Placement;\n\n  {\n    switch (returnFiber.tag) {\n      case HostRoot:\n        {\n          var parentContainer = returnFiber.stateNode.containerInfo;\n\n          switch (fiber.tag) {\n            case HostComponent:\n              var type = fiber.type;\n              var props = fiber.pendingProps;\n              didNotFindHydratableContainerInstance(parentContainer, type);\n              break;\n\n            case HostText:\n              var text = fiber.pendingProps;\n              didNotFindHydratableContainerTextInstance(parentContainer, text);\n              break;\n          }\n\n          break;\n        }\n\n      case HostComponent:\n        {\n          var parentType = returnFiber.type;\n          var parentProps = returnFiber.memoizedProps;\n          var parentInstance = returnFiber.stateNode;\n\n          switch (fiber.tag) {\n            case HostComponent:\n              var _type = fiber.type;\n              var _props = fiber.pendingProps;\n              didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type);\n              break;\n\n            case HostText:\n              var _text = fiber.pendingProps;\n              didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);\n              break;\n\n            case SuspenseComponent:\n              didNotFindHydratableSuspenseInstance(parentType, parentProps);\n              break;\n          }\n\n          break;\n        }\n\n      default:\n        return;\n    }\n  }\n}\n\nfunction tryHydrate(fiber, nextInstance) {\n  switch (fiber.tag) {\n    case HostComponent:\n      {\n        var type = fiber.type;\n        var props = fiber.pendingProps;\n        var instance = canHydrateInstance(nextInstance, type);\n\n        if (instance !== null) {\n          fiber.stateNode = instance;\n          return true;\n        }\n\n        return false;\n      }\n\n    case HostText:\n      {\n        var text = fiber.pendingProps;\n        var textInstance = canHydrateTextInstance(nextInstance, text);\n\n        if (textInstance !== null) {\n          fiber.stateNode = textInstance;\n          return true;\n        }\n\n        return false;\n      }\n\n    case SuspenseComponent:\n      {\n\n        return false;\n      }\n\n    default:\n      return false;\n  }\n}\n\nfunction tryToClaimNextHydratableInstance(fiber) {\n  if (!isHydrating) {\n    return;\n  }\n\n  var nextInstance = nextHydratableInstance;\n\n  if (!nextInstance) {\n    // Nothing to hydrate. Make it an insertion.\n    insertNonHydratedInstance(hydrationParentFiber, fiber);\n    isHydrating = false;\n    hydrationParentFiber = fiber;\n    return;\n  }\n\n  var firstAttemptedInstance = nextInstance;\n\n  if (!tryHydrate(fiber, nextInstance)) {\n    // If we can't hydrate this instance let's try the next one.\n    // We use this as a heuristic. It's based on intuition and not data so it\n    // might be flawed or unnecessary.\n    nextInstance = getNextHydratableSibling(firstAttemptedInstance);\n\n    if (!nextInstance || !tryHydrate(fiber, nextInstance)) {\n      // Nothing to hydrate. Make it an insertion.\n      insertNonHydratedInstance(hydrationParentFiber, fiber);\n      isHydrating = false;\n      hydrationParentFiber = fiber;\n      return;\n    } // We matched the next one, we'll now assume that the first one was\n    // superfluous and we'll delete it. Since we can't eagerly delete it\n    // we'll have to schedule a deletion. To do that, this node needs a dummy\n    // fiber associated with it.\n\n\n    deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);\n  }\n\n  hydrationParentFiber = fiber;\n  nextHydratableInstance = getFirstHydratableChild(nextInstance);\n}\n\nfunction prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {\n\n  var instance = fiber.stateNode;\n  var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component.\n\n  fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n  // is a new ref we mark this as an update.\n\n  if (updatePayload !== null) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction prepareToHydrateHostTextInstance(fiber) {\n\n  var textInstance = fiber.stateNode;\n  var textContent = fiber.memoizedProps;\n  var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);\n\n  {\n    if (shouldUpdate) {\n      // We assume that prepareToHydrateHostTextInstance is called in a context where the\n      // hydration parent is the parent host component of this host text.\n      var returnFiber = hydrationParentFiber;\n\n      if (returnFiber !== null) {\n        switch (returnFiber.tag) {\n          case HostRoot:\n            {\n              var parentContainer = returnFiber.stateNode.containerInfo;\n              didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);\n              break;\n            }\n\n          case HostComponent:\n            {\n              var parentType = returnFiber.type;\n              var parentProps = returnFiber.memoizedProps;\n              var parentInstance = returnFiber.stateNode;\n              didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);\n              break;\n            }\n        }\n      }\n    }\n  }\n\n  return shouldUpdate;\n}\n\nfunction skipPastDehydratedSuspenseInstance(fiber) {\n\n  var suspenseState = fiber.memoizedState;\n  var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;\n\n  if (!suspenseInstance) {\n    {\n      throw Error( \"Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);\n}\n\nfunction popToNextHostParent(fiber) {\n  var parent = fiber.return;\n\n  while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {\n    parent = parent.return;\n  }\n\n  hydrationParentFiber = parent;\n}\n\nfunction popHydrationState(fiber) {\n\n  if (fiber !== hydrationParentFiber) {\n    // We're deeper than the current hydration context, inside an inserted\n    // tree.\n    return false;\n  }\n\n  if (!isHydrating) {\n    // If we're not currently hydrating but we're in a hydration context, then\n    // we were an insertion and now need to pop up reenter hydration of our\n    // siblings.\n    popToNextHostParent(fiber);\n    isHydrating = true;\n    return false;\n  }\n\n  var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now.\n  // We only do this deeper than head and body since they tend to have random\n  // other nodes in them. We also ignore components with pure text content in\n  // side of them.\n  // TODO: Better heuristic.\n\n  if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {\n    var nextInstance = nextHydratableInstance;\n\n    while (nextInstance) {\n      deleteHydratableInstance(fiber, nextInstance);\n      nextInstance = getNextHydratableSibling(nextInstance);\n    }\n  }\n\n  popToNextHostParent(fiber);\n\n  if (fiber.tag === SuspenseComponent) {\n    nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);\n  } else {\n    nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;\n  }\n\n  return true;\n}\n\nfunction resetHydrationState() {\n\n  hydrationParentFiber = null;\n  nextHydratableInstance = null;\n  isHydrating = false;\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar didReceiveUpdate = false;\nvar didWarnAboutBadClass;\nvar didWarnAboutModulePatternComponent;\nvar didWarnAboutContextTypeOnFunctionComponent;\nvar didWarnAboutGetDerivedStateOnFunctionComponent;\nvar didWarnAboutFunctionRefs;\nvar didWarnAboutReassigningProps;\nvar didWarnAboutRevealOrder;\nvar didWarnAboutTailOptions;\n\n{\n  didWarnAboutBadClass = {};\n  didWarnAboutModulePatternComponent = {};\n  didWarnAboutContextTypeOnFunctionComponent = {};\n  didWarnAboutGetDerivedStateOnFunctionComponent = {};\n  didWarnAboutFunctionRefs = {};\n  didWarnAboutReassigningProps = false;\n  didWarnAboutRevealOrder = {};\n  didWarnAboutTailOptions = {};\n}\n\nfunction reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime) {\n  if (current === null) {\n    // If this is a fresh new component that hasn't been rendered yet, we\n    // won't update its child set by applying minimal side-effects. Instead,\n    // we will add them all to the child before it gets rendered. That means\n    // we can optimize this reconciliation pass by not tracking side-effects.\n    workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  } else {\n    // If the current child is the same as the work in progress, it means that\n    // we haven't yet started any work on these children. Therefore, we use\n    // the clone algorithm to create a copy of all the current children.\n    // If we had any progressed work already, that is invalid at this point so\n    // let's throw it out.\n    workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);\n  }\n}\n\nfunction forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime) {\n  // This function is fork of reconcileChildren. It's used in cases where we\n  // want to reconcile without matching against the existing set. This has the\n  // effect of all current children being unmounted; even if the type and key\n  // are the same, the old child is unmounted and a new child is created.\n  //\n  // To do this, we're going to go through the reconcile algorithm twice. In\n  // the first pass, we schedule a deletion for all the current children by\n  // passing null.\n  workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we\n  // pass null in place of where we usually pass the current child set. This has\n  // the effect of remounting all children regardless of whether their\n  // identities match.\n\n  workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n}\n\nfunction updateForwardRef(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  // TODO: current can be non-null here even if the component\n  // hasn't yet mounted. This happens after the first render suspends.\n  // We'll need to figure out if this is fine or can cause issues.\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  }\n\n  var render = Component.render;\n  var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent\n\n  var nextChildren;\n  prepareToReadContext(workInProgress, renderExpirationTime);\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n\n    if ( workInProgress.mode & StrictMode) {\n      // Only double-render components with Hooks\n      if (workInProgress.memoizedState !== null) {\n        nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n      }\n    }\n\n    setIsRendering(false);\n  }\n\n  if (current !== null && !didReceiveUpdate) {\n    bailoutHooks(current, workInProgress, renderExpirationTime);\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n  if (current === null) {\n    var type = Component.type;\n\n    if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.\n    Component.defaultProps === undefined) {\n      var resolvedType = type;\n\n      {\n        resolvedType = resolveFunctionForHotReloading(type);\n      } // If this is a plain function component without default props,\n      // and with only the default shallow comparison, we upgrade it\n      // to a SimpleMemoComponent to allow fast path updates.\n\n\n      workInProgress.tag = SimpleMemoComponent;\n      workInProgress.type = resolvedType;\n\n      {\n        validateFunctionComponentInDev(workInProgress, type);\n      }\n\n      return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime);\n    }\n\n    {\n      var innerPropTypes = type.propTypes;\n\n      if (innerPropTypes) {\n        // Inner memo component props aren't currently validated in createElement.\n        // We could move it there, but we'd still need this for lazy code path.\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(type), getCurrentFiberStackInDev);\n      }\n    }\n\n    var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);\n    child.ref = workInProgress.ref;\n    child.return = workInProgress;\n    workInProgress.child = child;\n    return child;\n  }\n\n  {\n    var _type = Component.type;\n    var _innerPropTypes = _type.propTypes;\n\n    if (_innerPropTypes) {\n      // Inner memo component props aren't currently validated in createElement.\n      // We could move it there, but we'd still need this for lazy code path.\n      checkPropTypes(_innerPropTypes, nextProps, // Resolved props\n      'prop', getComponentName(_type), getCurrentFiberStackInDev);\n    }\n  }\n\n  var currentChild = current.child; // This is always exactly one child\n\n  if (updateExpirationTime < renderExpirationTime) {\n    // This will be the props with resolved defaultProps,\n    // unlike current.memoizedProps which will be the unresolved ones.\n    var prevProps = currentChild.memoizedProps; // Default to shallow comparison\n\n    var compare = Component.compare;\n    compare = compare !== null ? compare : shallowEqual;\n\n    if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    }\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  var newChild = createWorkInProgress(currentChild, nextProps);\n  newChild.ref = workInProgress.ref;\n  newChild.return = workInProgress;\n  workInProgress.child = newChild;\n  return newChild;\n}\n\nfunction updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n  // TODO: current can be non-null here even if the component\n  // hasn't yet mounted. This happens when the inner render suspends.\n  // We'll need to figure out if this is fine or can cause issues.\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var outerMemoType = workInProgress.elementType;\n\n      if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {\n        // We warn when you define propTypes on lazy()\n        // so let's just skip over it to find memo() outer wrapper.\n        // Inner props for memo are validated later.\n        outerMemoType = refineResolvedLazyComponent(outerMemoType);\n      }\n\n      var outerPropTypes = outerMemoType && outerMemoType.propTypes;\n\n      if (outerPropTypes) {\n        checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)\n        'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);\n      } // Inner propTypes will be validated in the function component path.\n\n    }\n  }\n\n  if (current !== null) {\n    var prevProps = current.memoizedProps;\n\n    if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.\n     workInProgress.type === current.type )) {\n      didReceiveUpdate = false;\n\n      if (updateExpirationTime < renderExpirationTime) {\n        // The pending update priority was cleared at the beginning of\n        // beginWork. We're about to bail out, but there might be additional\n        // updates at a lower priority. Usually, the priority level of the\n        // remaining updates is accumlated during the evaluation of the\n        // component (i.e. when processing the update queue). But since since\n        // we're bailing out early *without* evaluating the component, we need\n        // to account for it here, too. Reset to the value of the current fiber.\n        // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,\n        // because a MemoComponent fiber does not have hooks or an update queue;\n        // rather, it wraps around an inner component, which may or may not\n        // contains hooks.\n        // TODO: Move the reset at in beginWork out of the common path so that\n        // this is no longer necessary.\n        workInProgress.expirationTime = current.expirationTime;\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    }\n  }\n\n  return updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime);\n}\n\nfunction updateFragment(current, workInProgress, renderExpirationTime) {\n  var nextChildren = workInProgress.pendingProps;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateMode(current, workInProgress, renderExpirationTime) {\n  var nextChildren = workInProgress.pendingProps.children;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateProfiler(current, workInProgress, renderExpirationTime) {\n  {\n    workInProgress.effectTag |= Update;\n  }\n\n  var nextProps = workInProgress.pendingProps;\n  var nextChildren = nextProps.children;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction markRef(current, workInProgress) {\n  var ref = workInProgress.ref;\n\n  if (current === null && ref !== null || current !== null && current.ref !== ref) {\n    // Schedule a Ref effect\n    workInProgress.effectTag |= Ref;\n  }\n}\n\nfunction updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  }\n\n  var context;\n\n  {\n    var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);\n    context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  var nextChildren;\n  prepareToReadContext(workInProgress, renderExpirationTime);\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n\n    if ( workInProgress.mode & StrictMode) {\n      // Only double-render components with Hooks\n      if (workInProgress.memoizedState !== null) {\n        nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n      }\n    }\n\n    setIsRendering(false);\n  }\n\n  if (current !== null && !didReceiveUpdate) {\n    bailoutHooks(current, workInProgress, renderExpirationTime);\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateClassComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  } // Push context providers early to prevent context stack mismatches.\n  // During mounting we don't know the child context yet as the instance doesn't exist.\n  // We will invalidate the child context in finishClassComponent() right after rendering.\n\n\n  var hasContext;\n\n  if (isContextProvider(Component)) {\n    hasContext = true;\n    pushContextProvider(workInProgress);\n  } else {\n    hasContext = false;\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var instance = workInProgress.stateNode;\n  var shouldUpdate;\n\n  if (instance === null) {\n    if (current !== null) {\n      // A class component without an instance only mounts if it suspended\n      // inside a non-concurrent tree, in an inconsistent state. We want to\n      // treat it like a new mount, even though an empty version of it already\n      // committed. Disconnect the alternate pointers.\n      current.alternate = null;\n      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n      workInProgress.effectTag |= Placement;\n    } // In the initial pass we might need to construct the instance.\n\n\n    constructClassInstance(workInProgress, Component, nextProps);\n    mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n    shouldUpdate = true;\n  } else if (current === null) {\n    // In a resume, we'll already have an instance we can reuse.\n    shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n  } else {\n    shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderExpirationTime);\n  }\n\n  var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);\n\n  {\n    var inst = workInProgress.stateNode;\n\n    if (inst.props !== nextProps) {\n      if (!didWarnAboutReassigningProps) {\n        error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component');\n      }\n\n      didWarnAboutReassigningProps = true;\n    }\n  }\n\n  return nextUnitOfWork;\n}\n\nfunction finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {\n  // Refs should update even if shouldComponentUpdate returns false\n  markRef(current, workInProgress);\n  var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n  if (!shouldUpdate && !didCaptureError) {\n    // Context providers should defer to sCU for rendering\n    if (hasContext) {\n      invalidateContextProvider(workInProgress, Component, false);\n    }\n\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  }\n\n  var instance = workInProgress.stateNode; // Rerender\n\n  ReactCurrentOwner$1.current = workInProgress;\n  var nextChildren;\n\n  if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {\n    // If we captured an error, but getDerivedStateFromError is not defined,\n    // unmount all the children. componentDidCatch will schedule an update to\n    // re-render a fallback. This is temporary until we migrate everyone to\n    // the new API.\n    // TODO: Warn in a future release.\n    nextChildren = null;\n\n    {\n      stopProfilerTimerIfRunning();\n    }\n  } else {\n    {\n      setIsRendering(true);\n      nextChildren = instance.render();\n\n      if ( workInProgress.mode & StrictMode) {\n        instance.render();\n      }\n\n      setIsRendering(false);\n    }\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n\n  if (current !== null && didCaptureError) {\n    // If we're recovering from an error, reconcile without reusing any of\n    // the existing children. Conceptually, the normal children and the children\n    // that are shown on error are two different sets, so we shouldn't reuse\n    // normal children even if their identities match.\n    forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime);\n  } else {\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  } // Memoize state using the values we just used to render.\n  // TODO: Restructure so we never read values from the instance.\n\n\n  workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.\n\n  if (hasContext) {\n    invalidateContextProvider(workInProgress, Component, true);\n  }\n\n  return workInProgress.child;\n}\n\nfunction pushHostRootContext(workInProgress) {\n  var root = workInProgress.stateNode;\n\n  if (root.pendingContext) {\n    pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);\n  } else if (root.context) {\n    // Should always be set\n    pushTopLevelContextObject(workInProgress, root.context, false);\n  }\n\n  pushHostContainer(workInProgress, root.containerInfo);\n}\n\nfunction updateHostRoot(current, workInProgress, renderExpirationTime) {\n  pushHostRootContext(workInProgress);\n  var updateQueue = workInProgress.updateQueue;\n\n  if (!(current !== null && updateQueue !== null)) {\n    {\n      throw Error( \"If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  var nextProps = workInProgress.pendingProps;\n  var prevState = workInProgress.memoizedState;\n  var prevChildren = prevState !== null ? prevState.element : null;\n  cloneUpdateQueue(current, workInProgress);\n  processUpdateQueue(workInProgress, nextProps, null, renderExpirationTime);\n  var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  var nextChildren = nextState.element;\n\n  if (nextChildren === prevChildren) {\n    // If the state is the same as before, that's a bailout because we had\n    // no work that expires at this time.\n    resetHydrationState();\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  }\n\n  var root = workInProgress.stateNode;\n\n  if (root.hydrate && enterHydrationState(workInProgress)) {\n    // If we don't have any current children this might be the first pass.\n    // We always try to hydrate. If this isn't a hydration pass there won't\n    // be any children to hydrate which is effectively the same thing as\n    // not hydrating.\n    var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n    workInProgress.child = child;\n    var node = child;\n\n    while (node) {\n      // Mark each child as hydrating. This is a fast path to know whether this\n      // tree is part of a hydrating tree. This is used to determine if a child\n      // node has fully mounted yet, and for scheduling event replaying.\n      // Conceptually this is similar to Placement in that a new subtree is\n      // inserted into the React tree here. It just happens to not need DOM\n      // mutations because it already exists.\n      node.effectTag = node.effectTag & ~Placement | Hydrating;\n      node = node.sibling;\n    }\n  } else {\n    // Otherwise reset hydration state in case we aborted and resumed another\n    // root.\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    resetHydrationState();\n  }\n\n  return workInProgress.child;\n}\n\nfunction updateHostComponent(current, workInProgress, renderExpirationTime) {\n  pushHostContext(workInProgress);\n\n  if (current === null) {\n    tryToClaimNextHydratableInstance(workInProgress);\n  }\n\n  var type = workInProgress.type;\n  var nextProps = workInProgress.pendingProps;\n  var prevProps = current !== null ? current.memoizedProps : null;\n  var nextChildren = nextProps.children;\n  var isDirectTextChild = shouldSetTextContent(type, nextProps);\n\n  if (isDirectTextChild) {\n    // We special case a direct text child of a host node. This is a common\n    // case. We won't handle it as a reified child. We will instead handle\n    // this in the host environment that also has access to this prop. That\n    // avoids allocating another HostText fiber and traversing it.\n    nextChildren = null;\n  } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {\n    // If we're switching from a direct text child to a normal child, or to\n    // empty, we need to schedule the text content to be reset.\n    workInProgress.effectTag |= ContentReset;\n  }\n\n  markRef(current, workInProgress); // Check the host config to see if the children are offscreen/hidden.\n\n  if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) {\n    {\n      markSpawnedWork(Never);\n    } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n    workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n    return null;\n  }\n\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateHostText(current, workInProgress) {\n  if (current === null) {\n    tryToClaimNextHydratableInstance(workInProgress);\n  } // Nothing to do here. This is terminal. We'll do the completion step\n  // immediately after.\n\n\n  return null;\n}\n\nfunction mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {\n  if (_current !== null) {\n    // A lazy component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  }\n\n  var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet.\n  // Cancel and resume right after we know the tag.\n\n  cancelWorkTimer(workInProgress);\n  var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type.\n\n  workInProgress.type = Component;\n  var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);\n  startWorkTimer(workInProgress);\n  var resolvedProps = resolveDefaultProps(Component, props);\n  var child;\n\n  switch (resolvedTag) {\n    case FunctionComponent:\n      {\n        {\n          validateFunctionComponentInDev(workInProgress, Component);\n          workInProgress.type = Component = resolveFunctionForHotReloading(Component);\n        }\n\n        child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case ClassComponent:\n      {\n        {\n          workInProgress.type = Component = resolveClassForHotReloading(Component);\n        }\n\n        child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case ForwardRef:\n      {\n        {\n          workInProgress.type = Component = resolveForwardRefForHotReloading(Component);\n        }\n\n        child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case MemoComponent:\n      {\n        {\n          if (workInProgress.type !== workInProgress.elementType) {\n            var outerPropTypes = Component.propTypes;\n\n            if (outerPropTypes) {\n              checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only\n              'prop', getComponentName(Component), getCurrentFiberStackInDev);\n            }\n          }\n        }\n\n        child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too\n        updateExpirationTime, renderExpirationTime);\n        return child;\n      }\n  }\n\n  var hint = '';\n\n  {\n    if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {\n      hint = ' Did you wrap a component in React.lazy() more than once?';\n    }\n  } // This message intentionally doesn't mention ForwardRef or MemoComponent\n  // because the fact that it's a separate type of work is an\n  // implementation detail.\n\n\n  {\n    {\n      throw Error( \"Element type is invalid. Received a promise that resolves to: \" + Component + \". Lazy element type must resolve to a class or function.\" + hint );\n    }\n  }\n}\n\nfunction mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {\n  if (_current !== null) {\n    // An incomplete component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  } // Promote the fiber to a class and try rendering again.\n\n\n  workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`\n  // Push context providers early to prevent context stack mismatches.\n  // During mounting we don't know the child context yet as the instance doesn't exist.\n  // We will invalidate the child context in finishClassComponent() right after rendering.\n\n  var hasContext;\n\n  if (isContextProvider(Component)) {\n    hasContext = true;\n    pushContextProvider(workInProgress);\n  } else {\n    hasContext = false;\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  constructClassInstance(workInProgress, Component, nextProps);\n  mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n  return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n}\n\nfunction mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {\n  if (_current !== null) {\n    // An indeterminate component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  }\n\n  var props = workInProgress.pendingProps;\n  var context;\n\n  {\n    var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);\n    context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var value;\n\n  {\n    if (Component.prototype && typeof Component.prototype.render === 'function') {\n      var componentName = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutBadClass[componentName]) {\n        error(\"The <%s /> component appears to have a render method, but doesn't extend React.Component. \" + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);\n\n        didWarnAboutBadClass[componentName] = true;\n      }\n    }\n\n    if (workInProgress.mode & StrictMode) {\n      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);\n    }\n\n    setIsRendering(true);\n    ReactCurrentOwner$1.current = workInProgress;\n    value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n    setIsRendering(false);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n\n  if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {\n    {\n      var _componentName = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutModulePatternComponent[_componentName]) {\n        error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + \"If you can't use a class try assigning the prototype on the function as a workaround. \" + \"`%s.prototype = React.Component.prototype`. Don't use an arrow function since it \" + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);\n\n        didWarnAboutModulePatternComponent[_componentName] = true;\n      }\n    } // Proceed under the assumption that this is a class instance\n\n\n    workInProgress.tag = ClassComponent; // Throw out any hooks that were used.\n\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.\n    // During mounting we don't know the child context yet as the instance doesn't exist.\n    // We will invalidate the child context in finishClassComponent() right after rendering.\n\n    var hasContext = false;\n\n    if (isContextProvider(Component)) {\n      hasContext = true;\n      pushContextProvider(workInProgress);\n    } else {\n      hasContext = false;\n    }\n\n    workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;\n    initializeUpdateQueue(workInProgress);\n    var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n\n    if (typeof getDerivedStateFromProps === 'function') {\n      applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);\n    }\n\n    adoptClassInstance(workInProgress, value);\n    mountClassInstance(workInProgress, Component, props, renderExpirationTime);\n    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n  } else {\n    // Proceed under the assumption that this is a function component\n    workInProgress.tag = FunctionComponent;\n\n    {\n\n      if ( workInProgress.mode & StrictMode) {\n        // Only double-render components with Hooks\n        if (workInProgress.memoizedState !== null) {\n          value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n        }\n      }\n    }\n\n    reconcileChildren(null, workInProgress, value, renderExpirationTime);\n\n    {\n      validateFunctionComponentInDev(workInProgress, Component);\n    }\n\n    return workInProgress.child;\n  }\n}\n\nfunction validateFunctionComponentInDev(workInProgress, Component) {\n  {\n    if (Component) {\n      if (Component.childContextTypes) {\n        error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');\n      }\n    }\n\n    if (workInProgress.ref !== null) {\n      var info = '';\n      var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n      if (ownerName) {\n        info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n      }\n\n      var warningKey = ownerName || workInProgress._debugID || '';\n      var debugSource = workInProgress._debugSource;\n\n      if (debugSource) {\n        warningKey = debugSource.fileName + ':' + debugSource.lineNumber;\n      }\n\n      if (!didWarnAboutFunctionRefs[warningKey]) {\n        didWarnAboutFunctionRefs[warningKey] = true;\n\n        error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);\n      }\n    }\n\n    if (typeof Component.getDerivedStateFromProps === 'function') {\n      var _componentName2 = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) {\n        error('%s: Function components do not support getDerivedStateFromProps.', _componentName2);\n\n        didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true;\n      }\n    }\n\n    if (typeof Component.contextType === 'object' && Component.contextType !== null) {\n      var _componentName3 = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) {\n        error('%s: Function components do not support contextType.', _componentName3);\n\n        didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true;\n      }\n    }\n  }\n}\n\nvar SUSPENDED_MARKER = {\n  dehydrated: null,\n  retryTime: NoWork\n};\n\nfunction shouldRemainOnFallback(suspenseContext, current, workInProgress) {\n  // If the context is telling us that we should show a fallback, and we're not\n  // already showing content, then we should show the fallback instead.\n  return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current === null || current.memoizedState !== null);\n}\n\nfunction updateSuspenseComponent(current, workInProgress, renderExpirationTime) {\n  var mode = workInProgress.mode;\n  var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.\n\n  {\n    if (shouldSuspend(workInProgress)) {\n      workInProgress.effectTag |= DidCapture;\n    }\n  }\n\n  var suspenseContext = suspenseStackCursor.current;\n  var nextDidTimeout = false;\n  var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n  if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {\n    // Something in this boundary's subtree already suspended. Switch to\n    // rendering the fallback children.\n    nextDidTimeout = true;\n    workInProgress.effectTag &= ~DidCapture;\n  } else {\n    // Attempting the main content\n    if (current === null || current.memoizedState !== null) {\n      // This is a new mount or this boundary is already showing a fallback state.\n      // Mark this subtree context as having at least one invisible parent that could\n      // handle the fallback state.\n      // Boundaries without fallbacks or should be avoided are not considered since\n      // they cannot handle preferred fallback states.\n      if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) {\n        suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);\n      }\n    }\n  }\n\n  suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n  pushSuspenseContext(workInProgress, suspenseContext); // This next part is a bit confusing. If the children timeout, we switch to\n  // showing the fallback children in place of the \"primary\" children.\n  // However, we don't want to delete the primary children because then their\n  // state will be lost (both the React state and the host state, e.g.\n  // uncontrolled form inputs). Instead we keep them mounted and hide them.\n  // Both the fallback children AND the primary children are rendered at the\n  // same time. Once the primary children are un-suspended, we can delete\n  // the fallback children — don't need to preserve their state.\n  //\n  // The two sets of children are siblings in the host environment, but\n  // semantically, for purposes of reconciliation, they are two separate sets.\n  // So we store them using two fragment fibers.\n  //\n  // However, we want to avoid allocating extra fibers for every placeholder.\n  // They're only necessary when the children time out, because that's the\n  // only time when both sets are mounted.\n  //\n  // So, the extra fragment fibers are only used if the children time out.\n  // Otherwise, we render the primary children directly. This requires some\n  // custom reconciliation logic to preserve the state of the primary\n  // children. It's essentially a very basic form of re-parenting.\n\n  if (current === null) {\n    // If we're currently hydrating, try to hydrate this boundary.\n    // But only if this has a fallback.\n    if (nextProps.fallback !== undefined) {\n      tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.\n    } // This is the initial mount. This branch is pretty simple because there's\n    // no previous state that needs to be preserved.\n\n\n    if (nextDidTimeout) {\n      // Mount separate fragments for primary and fallback children.\n      var nextFallbackChildren = nextProps.fallback;\n      var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);\n      primaryChildFragment.return = workInProgress;\n\n      if ((workInProgress.mode & BlockingMode) === NoMode) {\n        // Outside of blocking mode, we commit the effects from the\n        // partially completed, timed-out tree, too.\n        var progressedState = workInProgress.memoizedState;\n        var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;\n        primaryChildFragment.child = progressedPrimaryChild;\n        var progressedChild = progressedPrimaryChild;\n\n        while (progressedChild !== null) {\n          progressedChild.return = primaryChildFragment;\n          progressedChild = progressedChild.sibling;\n        }\n      }\n\n      var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);\n      fallbackChildFragment.return = workInProgress;\n      primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the\n      // fallback children.\n\n      workInProgress.memoizedState = SUSPENDED_MARKER;\n      workInProgress.child = primaryChildFragment;\n      return fallbackChildFragment;\n    } else {\n      // Mount the primary children without an intermediate fragment fiber.\n      var nextPrimaryChildren = nextProps.children;\n      workInProgress.memoizedState = null;\n      return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);\n    }\n  } else {\n    // This is an update. This branch is more complicated because we need to\n    // ensure the state of the primary children is preserved.\n    var prevState = current.memoizedState;\n\n    if (prevState !== null) {\n      // wrapped in a fragment fiber.\n\n\n      var currentPrimaryChildFragment = current.child;\n      var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;\n\n      if (nextDidTimeout) {\n        // Still timed out. Reuse the current primary children by cloning\n        // its fragment. We're going to skip over these entirely.\n        var _nextFallbackChildren2 = nextProps.fallback;\n\n        var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps);\n\n        _primaryChildFragment2.return = workInProgress;\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var _progressedState = workInProgress.memoizedState;\n\n          var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;\n\n          if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {\n            _primaryChildFragment2.child = _progressedPrimaryChild;\n            var _progressedChild2 = _progressedPrimaryChild;\n\n            while (_progressedChild2 !== null) {\n              _progressedChild2.return = _primaryChildFragment2;\n              _progressedChild2 = _progressedChild2.sibling;\n            }\n          }\n        } // Because primaryChildFragment is a new fiber that we're inserting as the\n        // parent of a new tree, we need to set its treeBaseDuration.\n\n\n        if ( workInProgress.mode & ProfileMode) {\n          // treeBaseDuration is the sum of all the child tree base durations.\n          var _treeBaseDuration = 0;\n          var _hiddenChild = _primaryChildFragment2.child;\n\n          while (_hiddenChild !== null) {\n            _treeBaseDuration += _hiddenChild.treeBaseDuration;\n            _hiddenChild = _hiddenChild.sibling;\n          }\n\n          _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;\n        } // Clone the fallback child fragment, too. These we'll continue\n        // working on.\n\n\n        var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2);\n\n        _fallbackChildFragment2.return = workInProgress;\n        _primaryChildFragment2.sibling = _fallbackChildFragment2;\n        _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = _primaryChildFragment2;\n        return _fallbackChildFragment2;\n      } else {\n        // No longer suspended. Switch back to showing the primary children,\n        // and remove the intermediate fragment fiber.\n        var _nextPrimaryChildren = nextProps.children;\n        var currentPrimaryChild = currentPrimaryChildFragment.child;\n        var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback\n        // children. Wait until the complete phase, after we've confirmed the\n        // fallback is no longer needed.\n        // TODO: Would it be better to store the fallback fragment on\n        // the stateNode?\n        // Continue rendering the children, like we normally do.\n\n        workInProgress.memoizedState = null;\n        return workInProgress.child = primaryChild;\n      }\n    } else {\n      // The current tree has not already timed out. That means the primary\n      // children are not wrapped in a fragment fiber.\n      var _currentPrimaryChild = current.child;\n\n      if (nextDidTimeout) {\n        // Timed out. Wrap the children in a fragment fiber to keep them\n        // separate from the fallback children.\n        var _nextFallbackChildren3 = nextProps.fallback;\n\n        var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't\n        // going to render this fragment.\n        null, mode, NoWork, null);\n\n        _primaryChildFragment3.return = workInProgress;\n        _primaryChildFragment3.child = _currentPrimaryChild;\n\n        if (_currentPrimaryChild !== null) {\n          _currentPrimaryChild.return = _primaryChildFragment3;\n        } // Even though we're creating a new fiber, there are no new children,\n        // because we're reusing an already mounted tree. So we don't need to\n        // schedule a placement.\n        // primaryChildFragment.effectTag |= Placement;\n\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var _progressedState2 = workInProgress.memoizedState;\n\n          var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;\n\n          _primaryChildFragment3.child = _progressedPrimaryChild2;\n          var _progressedChild3 = _progressedPrimaryChild2;\n\n          while (_progressedChild3 !== null) {\n            _progressedChild3.return = _primaryChildFragment3;\n            _progressedChild3 = _progressedChild3.sibling;\n          }\n        } // Because primaryChildFragment is a new fiber that we're inserting as the\n        // parent of a new tree, we need to set its treeBaseDuration.\n\n\n        if ( workInProgress.mode & ProfileMode) {\n          // treeBaseDuration is the sum of all the child tree base durations.\n          var _treeBaseDuration2 = 0;\n          var _hiddenChild2 = _primaryChildFragment3.child;\n\n          while (_hiddenChild2 !== null) {\n            _treeBaseDuration2 += _hiddenChild2.treeBaseDuration;\n            _hiddenChild2 = _hiddenChild2.sibling;\n          }\n\n          _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2;\n        } // Create a fragment from the fallback children, too.\n\n\n        var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null);\n\n        _fallbackChildFragment3.return = workInProgress;\n        _primaryChildFragment3.sibling = _fallbackChildFragment3;\n        _fallbackChildFragment3.effectTag |= Placement;\n        _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = _primaryChildFragment3;\n        return _fallbackChildFragment3;\n      } else {\n        // Still haven't timed out. Continue rendering the children, like we\n        // normally do.\n        workInProgress.memoizedState = null;\n        var _nextPrimaryChildren2 = nextProps.children;\n        return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);\n      }\n    }\n  }\n}\n\nfunction scheduleWorkOnFiber(fiber, renderExpirationTime) {\n  if (fiber.expirationTime < renderExpirationTime) {\n    fiber.expirationTime = renderExpirationTime;\n  }\n\n  var alternate = fiber.alternate;\n\n  if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n    alternate.expirationTime = renderExpirationTime;\n  }\n\n  scheduleWorkOnParentPath(fiber.return, renderExpirationTime);\n}\n\nfunction propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) {\n  // Mark any Suspense boundaries with fallbacks as having work to do.\n  // If they were previously forced into fallbacks, they may now be able\n  // to unblock.\n  var node = firstChild;\n\n  while (node !== null) {\n    if (node.tag === SuspenseComponent) {\n      var state = node.memoizedState;\n\n      if (state !== null) {\n        scheduleWorkOnFiber(node, renderExpirationTime);\n      }\n    } else if (node.tag === SuspenseListComponent) {\n      // If the tail is hidden there might not be an Suspense boundaries\n      // to schedule work on. In this case we have to schedule it on the\n      // list itself.\n      // We don't have to traverse to the children of the list since\n      // the list will propagate the change when it rerenders.\n      scheduleWorkOnFiber(node, renderExpirationTime);\n    } else if (node.child !== null) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === workInProgress) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === workInProgress) {\n        return;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction findLastContentRow(firstChild) {\n  // This is going to find the last row among these children that is already\n  // showing content on the screen, as opposed to being in fallback state or\n  // new. If a row has multiple Suspense boundaries, any of them being in the\n  // fallback state, counts as the whole row being in a fallback state.\n  // Note that the \"rows\" will be workInProgress, but any nested children\n  // will still be current since we haven't rendered them yet. The mounted\n  // order may not be the same as the new order. We use the new order.\n  var row = firstChild;\n  var lastContentRow = null;\n\n  while (row !== null) {\n    var currentRow = row.alternate; // New rows can't be content rows.\n\n    if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n      lastContentRow = row;\n    }\n\n    row = row.sibling;\n  }\n\n  return lastContentRow;\n}\n\nfunction validateRevealOrder(revealOrder) {\n  {\n    if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {\n      didWarnAboutRevealOrder[revealOrder] = true;\n\n      if (typeof revealOrder === 'string') {\n        switch (revealOrder.toLowerCase()) {\n          case 'together':\n          case 'forwards':\n          case 'backwards':\n            {\n              error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase \"%s\" instead.', revealOrder, revealOrder.toLowerCase());\n\n              break;\n            }\n\n          case 'forward':\n          case 'backward':\n            {\n              error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use \"%ss\" instead.', revealOrder, revealOrder.toLowerCase());\n\n              break;\n            }\n\n          default:\n            error('\"%s\" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n\n            break;\n        }\n      } else {\n        error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n      }\n    }\n  }\n}\n\nfunction validateTailOptions(tailMode, revealOrder) {\n  {\n    if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {\n      if (tailMode !== 'collapsed' && tailMode !== 'hidden') {\n        didWarnAboutTailOptions[tailMode] = true;\n\n        error('\"%s\" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean \"collapsed\" or \"hidden\"?', tailMode);\n      } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {\n        didWarnAboutTailOptions[tailMode] = true;\n\n        error('<SuspenseList tail=\"%s\" /> is only valid if revealOrder is ' + '\"forwards\" or \"backwards\". ' + 'Did you mean to specify revealOrder=\"forwards\"?', tailMode);\n      }\n    }\n  }\n}\n\nfunction validateSuspenseListNestedChild(childSlot, index) {\n  {\n    var isArray = Array.isArray(childSlot);\n    var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function';\n\n    if (isArray || isIterable) {\n      var type = isArray ? 'array' : 'iterable';\n\n      error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);\n\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction validateSuspenseListChildren(children, revealOrder) {\n  {\n    if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {\n      if (Array.isArray(children)) {\n        for (var i = 0; i < children.length; i++) {\n          if (!validateSuspenseListNestedChild(children[i], i)) {\n            return;\n          }\n        }\n      } else {\n        var iteratorFn = getIteratorFn(children);\n\n        if (typeof iteratorFn === 'function') {\n          var childrenIterator = iteratorFn.call(children);\n\n          if (childrenIterator) {\n            var step = childrenIterator.next();\n            var _i = 0;\n\n            for (; !step.done; step = childrenIterator.next()) {\n              if (!validateSuspenseListNestedChild(step.value, _i)) {\n                return;\n              }\n\n              _i++;\n            }\n          }\n        } else {\n          error('A single row was passed to a <SuspenseList revealOrder=\"%s\" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);\n        }\n      }\n    }\n  }\n}\n\nfunction initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) {\n  var renderState = workInProgress.memoizedState;\n\n  if (renderState === null) {\n    workInProgress.memoizedState = {\n      isBackwards: isBackwards,\n      rendering: null,\n      renderingStartTime: 0,\n      last: lastContentRow,\n      tail: tail,\n      tailExpiration: 0,\n      tailMode: tailMode,\n      lastEffect: lastEffectBeforeRendering\n    };\n  } else {\n    // We can reuse the existing object from previous renders.\n    renderState.isBackwards = isBackwards;\n    renderState.rendering = null;\n    renderState.renderingStartTime = 0;\n    renderState.last = lastContentRow;\n    renderState.tail = tail;\n    renderState.tailExpiration = 0;\n    renderState.tailMode = tailMode;\n    renderState.lastEffect = lastEffectBeforeRendering;\n  }\n} // This can end up rendering this component multiple passes.\n// The first pass splits the children fibers into two sets. A head and tail.\n// We first render the head. If anything is in fallback state, we do another\n// pass through beginWork to rerender all children (including the tail) with\n// the force suspend context. If the first render didn't have anything in\n// in fallback state. Then we render each row in the tail one-by-one.\n// That happens in the completeWork phase without going back to beginWork.\n\n\nfunction updateSuspenseListComponent(current, workInProgress, renderExpirationTime) {\n  var nextProps = workInProgress.pendingProps;\n  var revealOrder = nextProps.revealOrder;\n  var tailMode = nextProps.tail;\n  var newChildren = nextProps.children;\n  validateRevealOrder(revealOrder);\n  validateTailOptions(tailMode, revealOrder);\n  validateSuspenseListChildren(newChildren, revealOrder);\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  var suspenseContext = suspenseStackCursor.current;\n  var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);\n\n  if (shouldForceFallback) {\n    suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n    workInProgress.effectTag |= DidCapture;\n  } else {\n    var didSuspendBefore = current !== null && (current.effectTag & DidCapture) !== NoEffect;\n\n    if (didSuspendBefore) {\n      // If we previously forced a fallback, we need to schedule work\n      // on any nested boundaries to let them know to try to render\n      // again. This is the same as context updating.\n      propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime);\n    }\n\n    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n  }\n\n  pushSuspenseContext(workInProgress, suspenseContext);\n\n  if ((workInProgress.mode & BlockingMode) === NoMode) {\n    // Outside of blocking mode, SuspenseList doesn't work so we just\n    // use make it a noop by treating it as the default revealOrder.\n    workInProgress.memoizedState = null;\n  } else {\n    switch (revealOrder) {\n      case 'forwards':\n        {\n          var lastContentRow = findLastContentRow(workInProgress.child);\n          var tail;\n\n          if (lastContentRow === null) {\n            // The whole list is part of the tail.\n            // TODO: We could fast path by just rendering the tail now.\n            tail = workInProgress.child;\n            workInProgress.child = null;\n          } else {\n            // Disconnect the tail rows after the content row.\n            // We're going to render them separately later.\n            tail = lastContentRow.sibling;\n            lastContentRow.sibling = null;\n          }\n\n          initSuspenseListRenderState(workInProgress, false, // isBackwards\n          tail, lastContentRow, tailMode, workInProgress.lastEffect);\n          break;\n        }\n\n      case 'backwards':\n        {\n          // We're going to find the first row that has existing content.\n          // At the same time we're going to reverse the list of everything\n          // we pass in the meantime. That's going to be our tail in reverse\n          // order.\n          var _tail = null;\n          var row = workInProgress.child;\n          workInProgress.child = null;\n\n          while (row !== null) {\n            var currentRow = row.alternate; // New rows can't be content rows.\n\n            if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n              // This is the beginning of the main content.\n              workInProgress.child = row;\n              break;\n            }\n\n            var nextRow = row.sibling;\n            row.sibling = _tail;\n            _tail = row;\n            row = nextRow;\n          } // TODO: If workInProgress.child is null, we can continue on the tail immediately.\n\n\n          initSuspenseListRenderState(workInProgress, true, // isBackwards\n          _tail, null, // last\n          tailMode, workInProgress.lastEffect);\n          break;\n        }\n\n      case 'together':\n        {\n          initSuspenseListRenderState(workInProgress, false, // isBackwards\n          null, // tail\n          null, // last\n          undefined, workInProgress.lastEffect);\n          break;\n        }\n\n      default:\n        {\n          // The default reveal order is the same as not having\n          // a boundary.\n          workInProgress.memoizedState = null;\n        }\n    }\n  }\n\n  return workInProgress.child;\n}\n\nfunction updatePortalComponent(current, workInProgress, renderExpirationTime) {\n  pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n  var nextChildren = workInProgress.pendingProps;\n\n  if (current === null) {\n    // Portals are special because we don't append the children during mount\n    // but at commit. Therefore we need to track insertions which the normal\n    // flow doesn't do during mount. This doesn't happen at the root because\n    // the root always starts with a \"current\" with a null child.\n    // TODO: Consider unifying this with how the root works.\n    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  } else {\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  }\n\n  return workInProgress.child;\n}\n\nfunction updateContextProvider(current, workInProgress, renderExpirationTime) {\n  var providerType = workInProgress.type;\n  var context = providerType._context;\n  var newProps = workInProgress.pendingProps;\n  var oldProps = workInProgress.memoizedProps;\n  var newValue = newProps.value;\n\n  {\n    var providerPropTypes = workInProgress.type.propTypes;\n\n    if (providerPropTypes) {\n      checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);\n    }\n  }\n\n  pushProvider(workInProgress, newValue);\n\n  if (oldProps !== null) {\n    var oldValue = oldProps.value;\n    var changedBits = calculateChangedBits(context, newValue, oldValue);\n\n    if (changedBits === 0) {\n      // No change. Bailout early if children are the same.\n      if (oldProps.children === newProps.children && !hasContextChanged()) {\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    } else {\n      // The context value changed. Search for matching consumers and schedule\n      // them to update.\n      propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);\n    }\n  }\n\n  var newChildren = newProps.children;\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nvar hasWarnedAboutUsingContextAsConsumer = false;\n\nfunction updateContextConsumer(current, workInProgress, renderExpirationTime) {\n  var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In\n  // DEV mode, we create a separate object for Context.Consumer that acts\n  // like a proxy to Context. This proxy object adds unnecessary code in PROD\n  // so we use the old behaviour (Context.Consumer references Context) to\n  // reduce size and overhead. The separate object references context via\n  // a property called \"_context\", which also gives us the ability to check\n  // in DEV mode if this property exists or not and warn if it does not.\n\n  {\n    if (context._context === undefined) {\n      // This may be because it's a Context (rather than a Consumer).\n      // Or it may be because it's older React where they're the same thing.\n      // We only want to warn if we're sure it's a new React.\n      if (context !== context.Consumer) {\n        if (!hasWarnedAboutUsingContextAsConsumer) {\n          hasWarnedAboutUsingContextAsConsumer = true;\n\n          error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n        }\n      }\n    } else {\n      context = context._context;\n    }\n  }\n\n  var newProps = workInProgress.pendingProps;\n  var render = newProps.children;\n\n  {\n    if (typeof render !== 'function') {\n      error('A context consumer was rendered with multiple children, or a child ' + \"that isn't a function. A context consumer expects a single child \" + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');\n    }\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var newValue = readContext(context, newProps.unstable_observedBits);\n  var newChildren;\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    newChildren = render(newValue);\n    setIsRendering(false);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction markWorkInProgressReceivedUpdate() {\n  didReceiveUpdate = true;\n}\n\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime) {\n  cancelWorkTimer(workInProgress);\n\n  if (current !== null) {\n    // Reuse previous dependencies\n    workInProgress.dependencies = current.dependencies;\n  }\n\n  {\n    // Don't update \"base\" render times for bailouts.\n    stopProfilerTimerIfRunning();\n  }\n\n  var updateExpirationTime = workInProgress.expirationTime;\n\n  if (updateExpirationTime !== NoWork) {\n    markUnprocessedUpdateTime(updateExpirationTime);\n  } // Check if the children have any pending work.\n\n\n  var childExpirationTime = workInProgress.childExpirationTime;\n\n  if (childExpirationTime < renderExpirationTime) {\n    // The children don't have any work either. We can skip them.\n    // TODO: Once we add back resuming, we should check if the children are\n    // a work-in-progress set. If so, we need to transfer their effects.\n    return null;\n  } else {\n    // This fiber doesn't have work, but its subtree does. Clone the child\n    // fibers and continue.\n    cloneChildFibers(current, workInProgress);\n    return workInProgress.child;\n  }\n}\n\nfunction remountFiber(current, oldWorkInProgress, newWorkInProgress) {\n  {\n    var returnFiber = oldWorkInProgress.return;\n\n    if (returnFiber === null) {\n      throw new Error('Cannot swap the root fiber.');\n    } // Disconnect from the old current.\n    // It will get deleted.\n\n\n    current.alternate = null;\n    oldWorkInProgress.alternate = null; // Connect to the new tree.\n\n    newWorkInProgress.index = oldWorkInProgress.index;\n    newWorkInProgress.sibling = oldWorkInProgress.sibling;\n    newWorkInProgress.return = oldWorkInProgress.return;\n    newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.\n\n    if (oldWorkInProgress === returnFiber.child) {\n      returnFiber.child = newWorkInProgress;\n    } else {\n      var prevSibling = returnFiber.child;\n\n      if (prevSibling === null) {\n        throw new Error('Expected parent to have a child.');\n      }\n\n      while (prevSibling.sibling !== oldWorkInProgress) {\n        prevSibling = prevSibling.sibling;\n\n        if (prevSibling === null) {\n          throw new Error('Expected to find the previous sibling.');\n        }\n      }\n\n      prevSibling.sibling = newWorkInProgress;\n    } // Delete the old fiber and place the new one.\n    // Since the old fiber is disconnected, we have to schedule it manually.\n\n\n    var last = returnFiber.lastEffect;\n\n    if (last !== null) {\n      last.nextEffect = current;\n      returnFiber.lastEffect = current;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = current;\n    }\n\n    current.nextEffect = null;\n    current.effectTag = Deletion;\n    newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber.\n\n    return newWorkInProgress;\n  }\n}\n\nfunction beginWork(current, workInProgress, renderExpirationTime) {\n  var updateExpirationTime = workInProgress.expirationTime;\n\n  {\n    if (workInProgress._debugNeedsRemount && current !== null) {\n      // This will restart the begin phase with a new fiber.\n      return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime));\n    }\n  }\n\n  if (current !== null) {\n    var oldProps = current.memoizedProps;\n    var newProps = workInProgress.pendingProps;\n\n    if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:\n     workInProgress.type !== current.type )) {\n      // If props or context changed, mark the fiber as having performed work.\n      // This may be unset if the props are determined to be equal later (memo).\n      didReceiveUpdate = true;\n    } else if (updateExpirationTime < renderExpirationTime) {\n      didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering\n      // the begin phase. There's still some bookkeeping we that needs to be done\n      // in this optimized path, mostly pushing stuff onto the stack.\n\n      switch (workInProgress.tag) {\n        case HostRoot:\n          pushHostRootContext(workInProgress);\n          resetHydrationState();\n          break;\n\n        case HostComponent:\n          pushHostContext(workInProgress);\n\n          if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) {\n            {\n              markSpawnedWork(Never);\n            } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n            workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n            return null;\n          }\n\n          break;\n\n        case ClassComponent:\n          {\n            var Component = workInProgress.type;\n\n            if (isContextProvider(Component)) {\n              pushContextProvider(workInProgress);\n            }\n\n            break;\n          }\n\n        case HostPortal:\n          pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n          break;\n\n        case ContextProvider:\n          {\n            var newValue = workInProgress.memoizedProps.value;\n            pushProvider(workInProgress, newValue);\n            break;\n          }\n\n        case Profiler:\n          {\n            // Profiler should only call onRender when one of its descendants actually rendered.\n            var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n            if (hasChildWork) {\n              workInProgress.effectTag |= Update;\n            }\n          }\n\n          break;\n\n        case SuspenseComponent:\n          {\n            var state = workInProgress.memoizedState;\n\n            if (state !== null) {\n              // whether to retry the primary children, or to skip over it and\n              // go straight to the fallback. Check the priority of the primary\n              // child fragment.\n\n\n              var primaryChildFragment = workInProgress.child;\n              var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;\n\n              if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {\n                // The primary children have pending work. Use the normal path\n                // to attempt to render the primary children again.\n                return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n              } else {\n                pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient\n                // priority. Bailout.\n\n                var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n\n                if (child !== null) {\n                  // The fallback children have pending work. Skip over the\n                  // primary children and work on the fallback.\n                  return child.sibling;\n                } else {\n                  return null;\n                }\n              }\n            } else {\n              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));\n            }\n\n            break;\n          }\n\n        case SuspenseListComponent:\n          {\n            var didSuspendBefore = (current.effectTag & DidCapture) !== NoEffect;\n\n            var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n            if (didSuspendBefore) {\n              if (_hasChildWork) {\n                // If something was in fallback state last time, and we have all the\n                // same children then we're still in progressive loading state.\n                // Something might get unblocked by state updates or retries in the\n                // tree which will affect the tail. So we need to use the normal\n                // path to compute the correct tail.\n                return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n              } // If none of the children had any work, that means that none of\n              // them got retried so they'll still be blocked in the same way\n              // as before. We can fast bail out.\n\n\n              workInProgress.effectTag |= DidCapture;\n            } // If nothing suspended before and we're rendering the same children,\n            // then the tail doesn't matter. Anything new that suspends will work\n            // in the \"together\" mode, so we can continue from the state we had.\n\n\n            var renderState = workInProgress.memoizedState;\n\n            if (renderState !== null) {\n              // Reset to the \"together\" mode in case we've started a different\n              // update in the past but didn't complete it.\n              renderState.rendering = null;\n              renderState.tail = null;\n            }\n\n            pushSuspenseContext(workInProgress, suspenseStackCursor.current);\n\n            if (_hasChildWork) {\n              break;\n            } else {\n              // If none of the children had any work, that means that none of\n              // them got retried so they'll still be blocked in the same way\n              // as before. We can fast bail out.\n              return null;\n            }\n          }\n      }\n\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    } else {\n      // An update was scheduled on this fiber, but there are no new props\n      // nor legacy context. Set this to false. If an update queue or context\n      // consumer produces a changed value, it will set this to true. Otherwise,\n      // the component will assume the children have not changed and bail out.\n      didReceiveUpdate = false;\n    }\n  } else {\n    didReceiveUpdate = false;\n  } // Before entering the begin phase, clear pending update priority.\n  // TODO: This assumes that we're about to evaluate the component and process\n  // the update queue. However, there's an exception: SimpleMemoComponent\n  // sometimes bails out later in the begin phase. This indicates that we should\n  // move this assignment out of the common path and into each branch.\n\n\n  workInProgress.expirationTime = NoWork;\n\n  switch (workInProgress.tag) {\n    case IndeterminateComponent:\n      {\n        return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderExpirationTime);\n      }\n\n    case LazyComponent:\n      {\n        var elementType = workInProgress.elementType;\n        return mountLazyComponent(current, workInProgress, elementType, updateExpirationTime, renderExpirationTime);\n      }\n\n    case FunctionComponent:\n      {\n        var _Component = workInProgress.type;\n        var unresolvedProps = workInProgress.pendingProps;\n        var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);\n        return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderExpirationTime);\n      }\n\n    case ClassComponent:\n      {\n        var _Component2 = workInProgress.type;\n        var _unresolvedProps = workInProgress.pendingProps;\n\n        var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);\n\n        return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderExpirationTime);\n      }\n\n    case HostRoot:\n      return updateHostRoot(current, workInProgress, renderExpirationTime);\n\n    case HostComponent:\n      return updateHostComponent(current, workInProgress, renderExpirationTime);\n\n    case HostText:\n      return updateHostText(current, workInProgress);\n\n    case SuspenseComponent:\n      return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n\n    case HostPortal:\n      return updatePortalComponent(current, workInProgress, renderExpirationTime);\n\n    case ForwardRef:\n      {\n        var type = workInProgress.type;\n        var _unresolvedProps2 = workInProgress.pendingProps;\n\n        var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);\n\n        return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderExpirationTime);\n      }\n\n    case Fragment:\n      return updateFragment(current, workInProgress, renderExpirationTime);\n\n    case Mode:\n      return updateMode(current, workInProgress, renderExpirationTime);\n\n    case Profiler:\n      return updateProfiler(current, workInProgress, renderExpirationTime);\n\n    case ContextProvider:\n      return updateContextProvider(current, workInProgress, renderExpirationTime);\n\n    case ContextConsumer:\n      return updateContextConsumer(current, workInProgress, renderExpirationTime);\n\n    case MemoComponent:\n      {\n        var _type2 = workInProgress.type;\n        var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.\n\n        var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);\n\n        {\n          if (workInProgress.type !== workInProgress.elementType) {\n            var outerPropTypes = _type2.propTypes;\n\n            if (outerPropTypes) {\n              checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only\n              'prop', getComponentName(_type2), getCurrentFiberStackInDev);\n            }\n          }\n        }\n\n        _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);\n        return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);\n      }\n\n    case SimpleMemoComponent:\n      {\n        return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);\n      }\n\n    case IncompleteClassComponent:\n      {\n        var _Component3 = workInProgress.type;\n        var _unresolvedProps4 = workInProgress.pendingProps;\n\n        var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);\n\n        return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);\n      }\n\n    case SuspenseListComponent:\n      {\n        return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n      }\n  }\n\n  {\n    {\n      throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction markUpdate(workInProgress) {\n  // Tag the fiber with an update effect. This turns a Placement into\n  // a PlacementAndUpdate.\n  workInProgress.effectTag |= Update;\n}\n\nfunction markRef$1(workInProgress) {\n  workInProgress.effectTag |= Ref;\n}\n\nvar appendAllChildren;\nvar updateHostContainer;\nvar updateHostComponent$1;\nvar updateHostText$1;\n\n{\n  // Mutation mode\n  appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {\n    // We only have the top Fiber that was created but we need recurse down its\n    // children to find all the terminal nodes.\n    var node = workInProgress.child;\n\n    while (node !== null) {\n      if (node.tag === HostComponent || node.tag === HostText) {\n        appendInitialChild(parent, node.stateNode);\n      } else if (node.tag === HostPortal) ; else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === workInProgress) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === workInProgress) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  };\n\n  updateHostContainer = function (workInProgress) {// Noop\n  };\n\n  updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {\n    // If we have an alternate, that means this is an update and we need to\n    // schedule a side-effect to do the updates.\n    var oldProps = current.memoizedProps;\n\n    if (oldProps === newProps) {\n      // In mutation mode, this is sufficient for a bailout because\n      // we won't touch this node even if children changed.\n      return;\n    } // If we get updated because one of our children updated, we don't\n    // have newProps so we'll have to reuse them.\n    // TODO: Split the update API as separate for the props vs. children.\n    // Even better would be if children weren't special cased at all tho.\n\n\n    var instance = workInProgress.stateNode;\n    var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host\n    // component is hitting the resume path. Figure out why. Possibly\n    // related to `hidden`.\n\n    var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.\n\n    workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n    // is a new ref we mark this as an update. All the work is done in commitWork.\n\n    if (updatePayload) {\n      markUpdate(workInProgress);\n    }\n  };\n\n  updateHostText$1 = function (current, workInProgress, oldText, newText) {\n    // If the text differs, mark it as an update. All the work in done in commitWork.\n    if (oldText !== newText) {\n      markUpdate(workInProgress);\n    }\n  };\n}\n\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n  switch (renderState.tailMode) {\n    case 'hidden':\n      {\n        // Any insertions at the end of the tail list after this point\n        // should be invisible. If there are already mounted boundaries\n        // anything before them are not considered for collapsing.\n        // Therefore we need to go through the whole tail to find if\n        // there are any.\n        var tailNode = renderState.tail;\n        var lastTailNode = null;\n\n        while (tailNode !== null) {\n          if (tailNode.alternate !== null) {\n            lastTailNode = tailNode;\n          }\n\n          tailNode = tailNode.sibling;\n        } // Next we're simply going to delete all insertions after the\n        // last rendered item.\n\n\n        if (lastTailNode === null) {\n          // All remaining items in the tail are insertions.\n          renderState.tail = null;\n        } else {\n          // Detach the insertion after the last node that was already\n          // inserted.\n          lastTailNode.sibling = null;\n        }\n\n        break;\n      }\n\n    case 'collapsed':\n      {\n        // Any insertions at the end of the tail list after this point\n        // should be invisible. If there are already mounted boundaries\n        // anything before them are not considered for collapsing.\n        // Therefore we need to go through the whole tail to find if\n        // there are any.\n        var _tailNode = renderState.tail;\n        var _lastTailNode = null;\n\n        while (_tailNode !== null) {\n          if (_tailNode.alternate !== null) {\n            _lastTailNode = _tailNode;\n          }\n\n          _tailNode = _tailNode.sibling;\n        } // Next we're simply going to delete all insertions after the\n        // last rendered item.\n\n\n        if (_lastTailNode === null) {\n          // All remaining items in the tail are insertions.\n          if (!hasRenderedATailFallback && renderState.tail !== null) {\n            // We suspended during the head. We want to show at least one\n            // row at the tail. So we'll keep on and cut off the rest.\n            renderState.tail.sibling = null;\n          } else {\n            renderState.tail = null;\n          }\n        } else {\n          // Detach the insertion after the last node that was already\n          // inserted.\n          _lastTailNode.sibling = null;\n        }\n\n        break;\n      }\n  }\n}\n\nfunction completeWork(current, workInProgress, renderExpirationTime) {\n  var newProps = workInProgress.pendingProps;\n\n  switch (workInProgress.tag) {\n    case IndeterminateComponent:\n    case LazyComponent:\n    case SimpleMemoComponent:\n    case FunctionComponent:\n    case ForwardRef:\n    case Fragment:\n    case Mode:\n    case Profiler:\n    case ContextConsumer:\n    case MemoComponent:\n      return null;\n\n    case ClassComponent:\n      {\n        var Component = workInProgress.type;\n\n        if (isContextProvider(Component)) {\n          popContext(workInProgress);\n        }\n\n        return null;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(workInProgress);\n        popTopLevelContextObject(workInProgress);\n        var fiberRoot = workInProgress.stateNode;\n\n        if (fiberRoot.pendingContext) {\n          fiberRoot.context = fiberRoot.pendingContext;\n          fiberRoot.pendingContext = null;\n        }\n\n        if (current === null || current.child === null) {\n          // If we hydrated, pop so that we can delete any remaining children\n          // that weren't hydrated.\n          var wasHydrated = popHydrationState(workInProgress);\n\n          if (wasHydrated) {\n            // If we hydrated, then we'll need to schedule an update for\n            // the commit side-effects on the root.\n            markUpdate(workInProgress);\n          }\n        }\n\n        updateHostContainer(workInProgress);\n        return null;\n      }\n\n    case HostComponent:\n      {\n        popHostContext(workInProgress);\n        var rootContainerInstance = getRootHostContainer();\n        var type = workInProgress.type;\n\n        if (current !== null && workInProgress.stateNode != null) {\n          updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);\n\n          if (current.ref !== workInProgress.ref) {\n            markRef$1(workInProgress);\n          }\n        } else {\n          if (!newProps) {\n            if (!(workInProgress.stateNode !== null)) {\n              {\n                throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n              }\n            } // This can happen when we abort work.\n\n\n            return null;\n          }\n\n          var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context\n          // \"stack\" as the parent. Then append children as we go in beginWork\n          // or completeWork depending on whether we want to add them top->down or\n          // bottom->up. Top->down is faster in IE11.\n\n          var _wasHydrated = popHydrationState(workInProgress);\n\n          if (_wasHydrated) {\n            // TODO: Move this and createInstance step into the beginPhase\n            // to consolidate.\n            if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {\n              // If changes to the hydrated node need to be applied at the\n              // commit-phase we mark this as such.\n              markUpdate(workInProgress);\n            }\n          } else {\n            var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);\n            appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners\n\n            workInProgress.stateNode = instance;\n            // (eg DOM renderer supports auto-focus for certain elements).\n            // Make sure such renderers get scheduled for later work.\n\n\n            if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {\n              markUpdate(workInProgress);\n            }\n          }\n\n          if (workInProgress.ref !== null) {\n            // If there is a ref on a host node we need to schedule a callback\n            markRef$1(workInProgress);\n          }\n        }\n\n        return null;\n      }\n\n    case HostText:\n      {\n        var newText = newProps;\n\n        if (current && workInProgress.stateNode != null) {\n          var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need\n          // to schedule a side-effect to do the updates.\n\n          updateHostText$1(current, workInProgress, oldText, newText);\n        } else {\n          if (typeof newText !== 'string') {\n            if (!(workInProgress.stateNode !== null)) {\n              {\n                throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n              }\n            } // This can happen when we abort work.\n\n          }\n\n          var _rootContainerInstance = getRootHostContainer();\n\n          var _currentHostContext = getHostContext();\n\n          var _wasHydrated2 = popHydrationState(workInProgress);\n\n          if (_wasHydrated2) {\n            if (prepareToHydrateHostTextInstance(workInProgress)) {\n              markUpdate(workInProgress);\n            }\n          } else {\n            workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);\n          }\n        }\n\n        return null;\n      }\n\n    case SuspenseComponent:\n      {\n        popSuspenseContext(workInProgress);\n        var nextState = workInProgress.memoizedState;\n\n        if ((workInProgress.effectTag & DidCapture) !== NoEffect) {\n          // Something suspended. Re-render with the fallback children.\n          workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list.\n\n          return workInProgress;\n        }\n\n        var nextDidTimeout = nextState !== null;\n        var prevDidTimeout = false;\n\n        if (current === null) {\n          if (workInProgress.memoizedProps.fallback !== undefined) {\n            popHydrationState(workInProgress);\n          }\n        } else {\n          var prevState = current.memoizedState;\n          prevDidTimeout = prevState !== null;\n\n          if (!nextDidTimeout && prevState !== null) {\n            // We just switched from the fallback to the normal children.\n            // Delete the fallback.\n            // TODO: Would it be better to store the fallback fragment on\n            // the stateNode during the begin phase?\n            var currentFallbackChild = current.child.sibling;\n\n            if (currentFallbackChild !== null) {\n              // Deletions go at the beginning of the return fiber's effect list\n              var first = workInProgress.firstEffect;\n\n              if (first !== null) {\n                workInProgress.firstEffect = currentFallbackChild;\n                currentFallbackChild.nextEffect = first;\n              } else {\n                workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;\n                currentFallbackChild.nextEffect = null;\n              }\n\n              currentFallbackChild.effectTag = Deletion;\n            }\n          }\n        }\n\n        if (nextDidTimeout && !prevDidTimeout) {\n          // If this subtreee is running in blocking mode we can suspend,\n          // otherwise we won't suspend.\n          // TODO: This will still suspend a synchronous tree if anything\n          // in the concurrent tree already suspended during this render.\n          // This is a known bug.\n          if ((workInProgress.mode & BlockingMode) !== NoMode) {\n            // TODO: Move this back to throwException because this is too late\n            // if this is a large tree which is common for initial loads. We\n            // don't know if we should restart a render or not until we get\n            // this marker, and this is too late.\n            // If this render already had a ping or lower pri updates,\n            // and this is the first time we know we're going to suspend we\n            // should be able to immediately restart from within throwException.\n            var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true;\n\n            if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {\n              // If this was in an invisible tree or a new render, then showing\n              // this boundary is ok.\n              renderDidSuspend();\n            } else {\n              // Otherwise, we're going to have to hide content so we should\n              // suspend for longer if possible.\n              renderDidSuspendDelayIfPossible();\n            }\n          }\n        }\n\n        {\n          // TODO: Only schedule updates if these values are non equal, i.e. it changed.\n          if (nextDidTimeout || prevDidTimeout) {\n            // If this boundary just timed out, schedule an effect to attach a\n            // retry listener to the promise. This flag is also used to hide the\n            // primary children. In mutation mode, we also need the flag to\n            // *unhide* children that were previously hidden, so check if this\n            // is currently timed out, too.\n            workInProgress.effectTag |= Update;\n          }\n        }\n\n        return null;\n      }\n\n    case HostPortal:\n      popHostContainer(workInProgress);\n      updateHostContainer(workInProgress);\n      return null;\n\n    case ContextProvider:\n      // Pop provider fiber\n      popProvider(workInProgress);\n      return null;\n\n    case IncompleteClassComponent:\n      {\n        // Same as class component case. I put it down here so that the tags are\n        // sequential to ensure this switch is compiled to a jump table.\n        var _Component = workInProgress.type;\n\n        if (isContextProvider(_Component)) {\n          popContext(workInProgress);\n        }\n\n        return null;\n      }\n\n    case SuspenseListComponent:\n      {\n        popSuspenseContext(workInProgress);\n        var renderState = workInProgress.memoizedState;\n\n        if (renderState === null) {\n          // We're running in the default, \"independent\" mode.\n          // We don't do anything in this mode.\n          return null;\n        }\n\n        var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect;\n        var renderedTail = renderState.rendering;\n\n        if (renderedTail === null) {\n          // We just rendered the head.\n          if (!didSuspendAlready) {\n            // This is the first pass. We need to figure out if anything is still\n            // suspended in the rendered set.\n            // If new content unsuspended, but there's still some content that\n            // didn't. Then we need to do a second pass that forces everything\n            // to keep showing their fallbacks.\n            // We might be suspended if something in this render pass suspended, or\n            // something in the previous committed pass suspended. Otherwise,\n            // there's no chance so we can skip the expensive call to\n            // findFirstSuspended.\n            var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect);\n\n            if (!cannotBeSuspended) {\n              var row = workInProgress.child;\n\n              while (row !== null) {\n                var suspended = findFirstSuspended(row);\n\n                if (suspended !== null) {\n                  didSuspendAlready = true;\n                  workInProgress.effectTag |= DidCapture;\n                  cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as\n                  // part of the second pass. In that case nothing will subscribe to\n                  // its thennables. Instead, we'll transfer its thennables to the\n                  // SuspenseList so that it can retry if they resolve.\n                  // There might be multiple of these in the list but since we're\n                  // going to wait for all of them anyway, it doesn't really matter\n                  // which ones gets to ping. In theory we could get clever and keep\n                  // track of how many dependencies remain but it gets tricky because\n                  // in the meantime, we can add/remove/change items and dependencies.\n                  // We might bail out of the loop before finding any but that\n                  // doesn't matter since that means that the other boundaries that\n                  // we did find already has their listeners attached.\n\n                  var newThennables = suspended.updateQueue;\n\n                  if (newThennables !== null) {\n                    workInProgress.updateQueue = newThennables;\n                    workInProgress.effectTag |= Update;\n                  } // Rerender the whole list, but this time, we'll force fallbacks\n                  // to stay in place.\n                  // Reset the effect list before doing the second pass since that's now invalid.\n\n\n                  if (renderState.lastEffect === null) {\n                    workInProgress.firstEffect = null;\n                  }\n\n                  workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state.\n\n                  resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately\n                  // rerender the children.\n\n                  pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));\n                  return workInProgress.child;\n                }\n\n                row = row.sibling;\n              }\n            }\n          } else {\n            cutOffTailIfNeeded(renderState, false);\n          } // Next we're going to render the tail.\n\n        } else {\n          // Append the rendered row to the child list.\n          if (!didSuspendAlready) {\n            var _suspended = findFirstSuspended(renderedTail);\n\n            if (_suspended !== null) {\n              workInProgress.effectTag |= DidCapture;\n              didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't\n              // get lost if this row ends up dropped during a second pass.\n\n              var _newThennables = _suspended.updateQueue;\n\n              if (_newThennables !== null) {\n                workInProgress.updateQueue = _newThennables;\n                workInProgress.effectTag |= Update;\n              }\n\n              cutOffTailIfNeeded(renderState, true); // This might have been modified.\n\n              if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) {\n                // We need to delete the row we just rendered.\n                // Reset the effect list to what it was before we rendered this\n                // child. The nested children have already appended themselves.\n                var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point.\n\n                if (lastEffect !== null) {\n                  lastEffect.nextEffect = null;\n                } // We're done.\n\n\n                return null;\n              }\n            } else if ( // The time it took to render last row is greater than time until\n            // the expiration.\n            now() * 2 - renderState.renderingStartTime > renderState.tailExpiration && renderExpirationTime > Never) {\n              // We have now passed our CPU deadline and we'll just give up further\n              // attempts to render the main content and only render fallbacks.\n              // The assumption is that this is usually faster.\n              workInProgress.effectTag |= DidCapture;\n              didSuspendAlready = true;\n              cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this\n              // to get it started back up to attempt the next item. If we can show\n              // them, then they really have the same priority as this render.\n              // So we'll pick it back up the very next render pass once we've had\n              // an opportunity to yield for paint.\n\n              var nextPriority = renderExpirationTime - 1;\n              workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority;\n\n              {\n                markSpawnedWork(nextPriority);\n              }\n            }\n          }\n\n          if (renderState.isBackwards) {\n            // The effect list of the backwards tail will have been added\n            // to the end. This breaks the guarantee that life-cycles fire in\n            // sibling order but that isn't a strong guarantee promised by React.\n            // Especially since these might also just pop in during future commits.\n            // Append to the beginning of the list.\n            renderedTail.sibling = workInProgress.child;\n            workInProgress.child = renderedTail;\n          } else {\n            var previousSibling = renderState.last;\n\n            if (previousSibling !== null) {\n              previousSibling.sibling = renderedTail;\n            } else {\n              workInProgress.child = renderedTail;\n            }\n\n            renderState.last = renderedTail;\n          }\n        }\n\n        if (renderState.tail !== null) {\n          // We still have tail rows to render.\n          if (renderState.tailExpiration === 0) {\n            // Heuristic for how long we're willing to spend rendering rows\n            // until we just give up and show what we have so far.\n            var TAIL_EXPIRATION_TIMEOUT_MS = 500;\n            renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; // TODO: This is meant to mimic the train model or JND but this\n            // is a per component value. It should really be since the start\n            // of the total render or last commit. Consider using something like\n            // globalMostRecentFallbackTime. That doesn't account for being\n            // suspended for part of the time or when it's a new render.\n            // It should probably use a global start time value instead.\n          } // Pop a row.\n\n\n          var next = renderState.tail;\n          renderState.rendering = next;\n          renderState.tail = next.sibling;\n          renderState.lastEffect = workInProgress.lastEffect;\n          renderState.renderingStartTime = now();\n          next.sibling = null; // Restore the context.\n          // TODO: We can probably just avoid popping it instead and only\n          // setting it the first time we go from not suspended to suspended.\n\n          var suspenseContext = suspenseStackCursor.current;\n\n          if (didSuspendAlready) {\n            suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n          } else {\n            suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n          }\n\n          pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.\n\n          return next;\n        }\n\n        return null;\n      }\n  }\n\n  {\n    {\n      throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction unwindWork(workInProgress, renderExpirationTime) {\n  switch (workInProgress.tag) {\n    case ClassComponent:\n      {\n        var Component = workInProgress.type;\n\n        if (isContextProvider(Component)) {\n          popContext(workInProgress);\n        }\n\n        var effectTag = workInProgress.effectTag;\n\n        if (effectTag & ShouldCapture) {\n          workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;\n          return workInProgress;\n        }\n\n        return null;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(workInProgress);\n        popTopLevelContextObject(workInProgress);\n        var _effectTag = workInProgress.effectTag;\n\n        if (!((_effectTag & DidCapture) === NoEffect)) {\n          {\n            throw Error( \"The root failed to unmount after an error. This is likely a bug in React. Please file an issue.\" );\n          }\n        }\n\n        workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;\n        return workInProgress;\n      }\n\n    case HostComponent:\n      {\n        // TODO: popHydrationState\n        popHostContext(workInProgress);\n        return null;\n      }\n\n    case SuspenseComponent:\n      {\n        popSuspenseContext(workInProgress);\n\n        var _effectTag2 = workInProgress.effectTag;\n\n        if (_effectTag2 & ShouldCapture) {\n          workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.\n\n          return workInProgress;\n        }\n\n        return null;\n      }\n\n    case SuspenseListComponent:\n      {\n        popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been\n        // caught by a nested boundary. If not, it should bubble through.\n\n        return null;\n      }\n\n    case HostPortal:\n      popHostContainer(workInProgress);\n      return null;\n\n    case ContextProvider:\n      popProvider(workInProgress);\n      return null;\n\n    default:\n      return null;\n  }\n}\n\nfunction unwindInterruptedWork(interruptedWork) {\n  switch (interruptedWork.tag) {\n    case ClassComponent:\n      {\n        var childContextTypes = interruptedWork.type.childContextTypes;\n\n        if (childContextTypes !== null && childContextTypes !== undefined) {\n          popContext(interruptedWork);\n        }\n\n        break;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(interruptedWork);\n        popTopLevelContextObject(interruptedWork);\n        break;\n      }\n\n    case HostComponent:\n      {\n        popHostContext(interruptedWork);\n        break;\n      }\n\n    case HostPortal:\n      popHostContainer(interruptedWork);\n      break;\n\n    case SuspenseComponent:\n      popSuspenseContext(interruptedWork);\n      break;\n\n    case SuspenseListComponent:\n      popSuspenseContext(interruptedWork);\n      break;\n\n    case ContextProvider:\n      popProvider(interruptedWork);\n      break;\n  }\n}\n\nfunction createCapturedValue(value, source) {\n  // If the value is an error, call this function immediately after it is thrown\n  // so the stack is accurate.\n  return {\n    value: value,\n    source: source,\n    stack: getStackByFiberInDevAndProd(source)\n  };\n}\n\nfunction logCapturedError(capturedError) {\n\n  var error = capturedError.error;\n\n  {\n    var componentName = capturedError.componentName,\n        componentStack = capturedError.componentStack,\n        errorBoundaryName = capturedError.errorBoundaryName,\n        errorBoundaryFound = capturedError.errorBoundaryFound,\n        willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling\n    // `preventDefault()` in window `error` handler.\n    // We record this information as an expando on the error.\n\n    if (error != null && error._suppressLogging) {\n      if (errorBoundaryFound && willRetry) {\n        // The error is recoverable and was silenced.\n        // Ignore it and don't print the stack addendum.\n        // This is handy for testing error boundaries without noise.\n        return;\n      } // The error is fatal. Since the silencing might have\n      // been accidental, we'll surface it anyway.\n      // However, the browser would have silenced the original error\n      // so we'll print it first, and then print the stack addendum.\n\n\n      console['error'](error); // Don't transform to our wrapper\n      // For a more detailed description of this block, see:\n      // https://github.com/facebook/react/pull/13384\n    }\n\n    var componentNameMessage = componentName ? \"The above error occurred in the <\" + componentName + \"> component:\" : 'The above error occurred in one of your React components:';\n    var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.\n\n    if (errorBoundaryFound && errorBoundaryName) {\n      if (willRetry) {\n        errorBoundaryMessage = \"React will try to recreate this component tree from scratch \" + (\"using the error boundary you provided, \" + errorBoundaryName + \".\");\n      } else {\n        errorBoundaryMessage = \"This error was initially handled by the error boundary \" + errorBoundaryName + \".\\n\" + \"Recreating the tree from scratch failed so React will unmount the tree.\";\n      }\n    } else {\n      errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';\n    }\n\n    var combinedMessage = \"\" + componentNameMessage + componentStack + \"\\n\\n\" + (\"\" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.\n    // We don't include the original error message and JS stack because the browser\n    // has already printed it. Even if the application swallows the error, it is still\n    // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.\n\n    console['error'](combinedMessage); // Don't transform to our wrapper\n  }\n}\n\nvar didWarnAboutUndefinedSnapshotBeforeUpdate = null;\n\n{\n  didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();\n}\n\nvar PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;\nfunction logError(boundary, errorInfo) {\n  var source = errorInfo.source;\n  var stack = errorInfo.stack;\n\n  if (stack === null && source !== null) {\n    stack = getStackByFiberInDevAndProd(source);\n  }\n\n  var capturedError = {\n    componentName: source !== null ? getComponentName(source.type) : null,\n    componentStack: stack !== null ? stack : '',\n    error: errorInfo.value,\n    errorBoundary: null,\n    errorBoundaryName: null,\n    errorBoundaryFound: false,\n    willRetry: false\n  };\n\n  if (boundary !== null && boundary.tag === ClassComponent) {\n    capturedError.errorBoundary = boundary.stateNode;\n    capturedError.errorBoundaryName = getComponentName(boundary.type);\n    capturedError.errorBoundaryFound = true;\n    capturedError.willRetry = true;\n  }\n\n  try {\n    logCapturedError(capturedError);\n  } catch (e) {\n    // This method must not throw, or React internal state will get messed up.\n    // If console.error is overridden, or logCapturedError() shows a dialog that throws,\n    // we want to report this error outside of the normal stack as a last resort.\n    // https://github.com/facebook/react/issues/13188\n    setTimeout(function () {\n      throw e;\n    });\n  }\n}\n\nvar callComponentWillUnmountWithTimer = function (current, instance) {\n  startPhaseTimer(current, 'componentWillUnmount');\n  instance.props = current.memoizedProps;\n  instance.state = current.memoizedState;\n  instance.componentWillUnmount();\n  stopPhaseTimer();\n}; // Capture errors so they don't interrupt unmounting.\n\n\nfunction safelyCallComponentWillUnmount(current, instance) {\n  {\n    invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance);\n\n    if (hasCaughtError()) {\n      var unmountError = clearCaughtError();\n      captureCommitPhaseError(current, unmountError);\n    }\n  }\n}\n\nfunction safelyDetachRef(current) {\n  var ref = current.ref;\n\n  if (ref !== null) {\n    if (typeof ref === 'function') {\n      {\n        invokeGuardedCallback(null, ref, null, null);\n\n        if (hasCaughtError()) {\n          var refError = clearCaughtError();\n          captureCommitPhaseError(current, refError);\n        }\n      }\n    } else {\n      ref.current = null;\n    }\n  }\n}\n\nfunction safelyCallDestroy(current, destroy) {\n  {\n    invokeGuardedCallback(null, destroy, null);\n\n    if (hasCaughtError()) {\n      var error = clearCaughtError();\n      captureCommitPhaseError(current, error);\n    }\n  }\n}\n\nfunction commitBeforeMutationLifeCycles(current, finishedWork) {\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        return;\n      }\n\n    case ClassComponent:\n      {\n        if (finishedWork.effectTag & Snapshot) {\n          if (current !== null) {\n            var prevProps = current.memoizedProps;\n            var prevState = current.memoizedState;\n            startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');\n            var instance = finishedWork.stateNode; // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);\n\n            {\n              var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;\n\n              if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {\n                didWarnSet.add(finishedWork.type);\n\n                error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));\n              }\n            }\n\n            instance.__reactInternalSnapshotBeforeUpdate = snapshot;\n            stopPhaseTimer();\n          }\n        }\n\n        return;\n      }\n\n    case HostRoot:\n    case HostComponent:\n    case HostText:\n    case HostPortal:\n    case IncompleteClassComponent:\n      // Nothing to do for these component types\n      return;\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction commitHookEffectListUnmount(tag, finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n  if (lastEffect !== null) {\n    var firstEffect = lastEffect.next;\n    var effect = firstEffect;\n\n    do {\n      if ((effect.tag & tag) === tag) {\n        // Unmount\n        var destroy = effect.destroy;\n        effect.destroy = undefined;\n\n        if (destroy !== undefined) {\n          destroy();\n        }\n      }\n\n      effect = effect.next;\n    } while (effect !== firstEffect);\n  }\n}\n\nfunction commitHookEffectListMount(tag, finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n  if (lastEffect !== null) {\n    var firstEffect = lastEffect.next;\n    var effect = firstEffect;\n\n    do {\n      if ((effect.tag & tag) === tag) {\n        // Mount\n        var create = effect.create;\n        effect.destroy = create();\n\n        {\n          var destroy = effect.destroy;\n\n          if (destroy !== undefined && typeof destroy !== 'function') {\n            var addendum = void 0;\n\n            if (destroy === null) {\n              addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';\n            } else if (typeof destroy.then === 'function') {\n              addendum = '\\n\\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\\n\\n' + 'useEffect(() => {\\n' + '  async function fetchData() {\\n' + '    // You can await here\\n' + '    const response = await MyAPI.getData(someId);\\n' + '    // ...\\n' + '  }\\n' + '  fetchData();\\n' + \"}, [someId]); // Or [] if effect doesn't need props or state\\n\\n\" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';\n            } else {\n              addendum = ' You returned: ' + destroy;\n            }\n\n            error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));\n          }\n        }\n      }\n\n      effect = effect.next;\n    } while (effect !== firstEffect);\n  }\n}\n\nfunction commitPassiveHookEffects(finishedWork) {\n  if ((finishedWork.effectTag & Passive) !== NoEffect) {\n    switch (finishedWork.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          // TODO (#17945) We should call all passive destroy functions (for all fibers)\n          // before calling any create functions. The current approach only serializes\n          // these for a single fiber.\n          commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork);\n          commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);\n          break;\n        }\n    }\n  }\n}\n\nfunction commitLifeCycles(finishedRoot, current, finishedWork, committedExpirationTime) {\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        // At this point layout effects have already been destroyed (during mutation phase).\n        // This is done to prevent sibling component effects from interfering with each other,\n        // e.g. a destroy function in one component should never override a ref set\n        // by a create function in another component during the same commit.\n        commitHookEffectListMount(Layout | HasEffect, finishedWork);\n\n        return;\n      }\n\n    case ClassComponent:\n      {\n        var instance = finishedWork.stateNode;\n\n        if (finishedWork.effectTag & Update) {\n          if (current === null) {\n            startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            instance.componentDidMount();\n            stopPhaseTimer();\n          } else {\n            var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);\n            var prevState = current.memoizedState;\n            startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);\n            stopPhaseTimer();\n          }\n        }\n\n        var updateQueue = finishedWork.updateQueue;\n\n        if (updateQueue !== null) {\n          {\n            if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n              if (instance.props !== finishedWork.memoizedProps) {\n                error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n              }\n\n              if (instance.state !== finishedWork.memoizedState) {\n                error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n              }\n            }\n          } // We could update instance props and state here,\n          // but instead we rely on them being set during last render.\n          // TODO: revisit this when we implement resuming.\n\n\n          commitUpdateQueue(finishedWork, updateQueue, instance);\n        }\n\n        return;\n      }\n\n    case HostRoot:\n      {\n        var _updateQueue = finishedWork.updateQueue;\n\n        if (_updateQueue !== null) {\n          var _instance = null;\n\n          if (finishedWork.child !== null) {\n            switch (finishedWork.child.tag) {\n              case HostComponent:\n                _instance = getPublicInstance(finishedWork.child.stateNode);\n                break;\n\n              case ClassComponent:\n                _instance = finishedWork.child.stateNode;\n                break;\n            }\n          }\n\n          commitUpdateQueue(finishedWork, _updateQueue, _instance);\n        }\n\n        return;\n      }\n\n    case HostComponent:\n      {\n        var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted\n        // (eg DOM renderer may schedule auto-focus for inputs and form controls).\n        // These effects should only be committed when components are first mounted,\n        // aka when there is no current/alternate.\n\n        if (current === null && finishedWork.effectTag & Update) {\n          var type = finishedWork.type;\n          var props = finishedWork.memoizedProps;\n          commitMount(_instance2, type, props);\n        }\n\n        return;\n      }\n\n    case HostText:\n      {\n        // We have no life-cycles associated with text.\n        return;\n      }\n\n    case HostPortal:\n      {\n        // We have no life-cycles associated with portals.\n        return;\n      }\n\n    case Profiler:\n      {\n        {\n          var onRender = finishedWork.memoizedProps.onRender;\n\n          if (typeof onRender === 'function') {\n            {\n              onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);\n            }\n          }\n        }\n\n        return;\n      }\n\n    case SuspenseComponent:\n      {\n        commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n        return;\n      }\n\n    case SuspenseListComponent:\n    case IncompleteClassComponent:\n    case FundamentalComponent:\n    case ScopeComponent:\n      return;\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction hideOrUnhideAllChildren(finishedWork, isHidden) {\n  {\n    // We only have the top Fiber that was inserted but we need to recurse down its\n    // children to find all the terminal nodes.\n    var node = finishedWork;\n\n    while (true) {\n      if (node.tag === HostComponent) {\n        var instance = node.stateNode;\n\n        if (isHidden) {\n          hideInstance(instance);\n        } else {\n          unhideInstance(node.stateNode, node.memoizedProps);\n        }\n      } else if (node.tag === HostText) {\n        var _instance3 = node.stateNode;\n\n        if (isHidden) {\n          hideTextInstance(_instance3);\n        } else {\n          unhideTextInstance(_instance3, node.memoizedProps);\n        }\n      } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) {\n        // Found a nested Suspense component that timed out. Skip over the\n        // primary child fragment, which should remain hidden.\n        var fallbackChildFragment = node.child.sibling;\n        fallbackChildFragment.return = node;\n        node = fallbackChildFragment;\n        continue;\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === finishedWork) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === finishedWork) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n}\n\nfunction commitAttachRef(finishedWork) {\n  var ref = finishedWork.ref;\n\n  if (ref !== null) {\n    var instance = finishedWork.stateNode;\n    var instanceToUse;\n\n    switch (finishedWork.tag) {\n      case HostComponent:\n        instanceToUse = getPublicInstance(instance);\n        break;\n\n      default:\n        instanceToUse = instance;\n    } // Moved outside to ensure DCE works with this flag\n\n    if (typeof ref === 'function') {\n      ref(instanceToUse);\n    } else {\n      {\n        if (!ref.hasOwnProperty('current')) {\n          error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));\n        }\n      }\n\n      ref.current = instanceToUse;\n    }\n  }\n}\n\nfunction commitDetachRef(current) {\n  var currentRef = current.ref;\n\n  if (currentRef !== null) {\n    if (typeof currentRef === 'function') {\n      currentRef(null);\n    } else {\n      currentRef.current = null;\n    }\n  }\n} // User-originating errors (lifecycles and refs) should not interrupt\n// deletion, so don't let them throw. Host-originating errors should\n// interrupt deletion, so it's okay\n\n\nfunction commitUnmount(finishedRoot, current, renderPriorityLevel) {\n  onCommitUnmount(current);\n\n  switch (current.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case MemoComponent:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        var updateQueue = current.updateQueue;\n\n        if (updateQueue !== null) {\n          var lastEffect = updateQueue.lastEffect;\n\n          if (lastEffect !== null) {\n            var firstEffect = lastEffect.next;\n\n            {\n              // When the owner fiber is deleted, the destroy function of a passive\n              // effect hook is called during the synchronous commit phase. This is\n              // a concession to implementation complexity. Calling it in the\n              // passive effect phase (like they usually are, when dependencies\n              // change during an update) would require either traversing the\n              // children of the deleted fiber again, or including unmount effects\n              // as part of the fiber effect list.\n              //\n              // Because this is during the sync commit phase, we need to change\n              // the priority.\n              //\n              // TODO: Reconsider this implementation trade off.\n              var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel;\n              runWithPriority$1(priorityLevel, function () {\n                var effect = firstEffect;\n\n                do {\n                  var _destroy = effect.destroy;\n\n                  if (_destroy !== undefined) {\n                    safelyCallDestroy(current, _destroy);\n                  }\n\n                  effect = effect.next;\n                } while (effect !== firstEffect);\n              });\n            }\n          }\n        }\n\n        return;\n      }\n\n    case ClassComponent:\n      {\n        safelyDetachRef(current);\n        var instance = current.stateNode;\n\n        if (typeof instance.componentWillUnmount === 'function') {\n          safelyCallComponentWillUnmount(current, instance);\n        }\n\n        return;\n      }\n\n    case HostComponent:\n      {\n\n        safelyDetachRef(current);\n        return;\n      }\n\n    case HostPortal:\n      {\n        // TODO: this is recursive.\n        // We are also not using this parent because\n        // the portal will get pushed immediately.\n        {\n          unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n        }\n\n        return;\n      }\n\n    case FundamentalComponent:\n      {\n\n        return;\n      }\n\n    case DehydratedFragment:\n      {\n\n        return;\n      }\n\n    case ScopeComponent:\n      {\n\n        return;\n      }\n  }\n}\n\nfunction commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) {\n  // While we're inside a removed host node we don't want to call\n  // removeChild on the inner nodes because they're removed by the top\n  // call anyway. We also want to call componentWillUnmount on all\n  // composites before this host node is removed from the tree. Therefore\n  // we do an inner loop while we're still inside the host node.\n  var node = root;\n\n  while (true) {\n    commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes.\n    // Skip portals because commitUnmount() currently visits them recursively.\n\n    if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above.\n    // If we don't use mutation we drill down into portals here instead.\n     node.tag !== HostPortal)) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === root) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === root) {\n        return;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction detachFiber(current) {\n  var alternate = current.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we\n  // should clear the child pointer of the parent alternate to let this\n  // get GC:ed but we don't know which for sure which parent is the current\n  // one so we'll settle for GC:ing the subtree of this child. This child\n  // itself will be GC:ed when the parent updates the next time.\n\n  current.return = null;\n  current.child = null;\n  current.memoizedState = null;\n  current.updateQueue = null;\n  current.dependencies = null;\n  current.alternate = null;\n  current.firstEffect = null;\n  current.lastEffect = null;\n  current.pendingProps = null;\n  current.memoizedProps = null;\n  current.stateNode = null;\n\n  if (alternate !== null) {\n    detachFiber(alternate);\n  }\n}\n\nfunction getHostParentFiber(fiber) {\n  var parent = fiber.return;\n\n  while (parent !== null) {\n    if (isHostParent(parent)) {\n      return parent;\n    }\n\n    parent = parent.return;\n  }\n\n  {\n    {\n      throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction isHostParent(fiber) {\n  return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;\n}\n\nfunction getHostSibling(fiber) {\n  // We're going to search forward into the tree until we find a sibling host\n  // node. Unfortunately, if multiple insertions are done in a row we have to\n  // search past them. This leads to exponential search for the next sibling.\n  // TODO: Find a more efficient way to do this.\n  var node = fiber;\n\n  siblings: while (true) {\n    // If we didn't find anything, let's try the next sibling.\n    while (node.sibling === null) {\n      if (node.return === null || isHostParent(node.return)) {\n        // If we pop out of the root or hit the parent the fiber we are the\n        // last sibling.\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n\n    while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {\n      // If it is not host node and, we might have a host node inside it.\n      // Try to search down until we find one.\n      if (node.effectTag & Placement) {\n        // If we don't have a child, try the siblings instead.\n        continue siblings;\n      } // If we don't have a child, try the siblings instead.\n      // We also skip portals because they are not part of this host tree.\n\n\n      if (node.child === null || node.tag === HostPortal) {\n        continue siblings;\n      } else {\n        node.child.return = node;\n        node = node.child;\n      }\n    } // Check if this host node is stable or about to be placed.\n\n\n    if (!(node.effectTag & Placement)) {\n      // Found it!\n      return node.stateNode;\n    }\n  }\n}\n\nfunction commitPlacement(finishedWork) {\n\n\n  var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.\n\n  var parent;\n  var isContainer;\n  var parentStateNode = parentFiber.stateNode;\n\n  switch (parentFiber.tag) {\n    case HostComponent:\n      parent = parentStateNode;\n      isContainer = false;\n      break;\n\n    case HostRoot:\n      parent = parentStateNode.containerInfo;\n      isContainer = true;\n      break;\n\n    case HostPortal:\n      parent = parentStateNode.containerInfo;\n      isContainer = true;\n      break;\n\n    case FundamentalComponent:\n\n    // eslint-disable-next-line-no-fallthrough\n\n    default:\n      {\n        {\n          throw Error( \"Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n  }\n\n  if (parentFiber.effectTag & ContentReset) {\n    // Reset the text content of the parent before doing any insertions\n    resetTextContent(parent); // Clear ContentReset from the effect tag\n\n    parentFiber.effectTag &= ~ContentReset;\n  }\n\n  var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its\n  // children to find all the terminal nodes.\n\n  if (isContainer) {\n    insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent);\n  } else {\n    insertOrAppendPlacementNode(finishedWork, before, parent);\n  }\n}\n\nfunction insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n  var tag = node.tag;\n  var isHost = tag === HostComponent || tag === HostText;\n\n  if (isHost || enableFundamentalAPI ) {\n    var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n    if (before) {\n      insertInContainerBefore(parent, stateNode, before);\n    } else {\n      appendChildToContainer(parent, stateNode);\n    }\n  } else if (tag === HostPortal) ; else {\n    var child = node.child;\n\n    if (child !== null) {\n      insertOrAppendPlacementNodeIntoContainer(child, before, parent);\n      var sibling = child.sibling;\n\n      while (sibling !== null) {\n        insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);\n        sibling = sibling.sibling;\n      }\n    }\n  }\n}\n\nfunction insertOrAppendPlacementNode(node, before, parent) {\n  var tag = node.tag;\n  var isHost = tag === HostComponent || tag === HostText;\n\n  if (isHost || enableFundamentalAPI ) {\n    var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n    if (before) {\n      insertBefore(parent, stateNode, before);\n    } else {\n      appendChild(parent, stateNode);\n    }\n  } else if (tag === HostPortal) ; else {\n    var child = node.child;\n\n    if (child !== null) {\n      insertOrAppendPlacementNode(child, before, parent);\n      var sibling = child.sibling;\n\n      while (sibling !== null) {\n        insertOrAppendPlacementNode(sibling, before, parent);\n        sibling = sibling.sibling;\n      }\n    }\n  }\n}\n\nfunction unmountHostComponents(finishedRoot, current, renderPriorityLevel) {\n  // We only have the top Fiber that was deleted but we need to recurse down its\n  // children to find all the terminal nodes.\n  var node = current; // Each iteration, currentParent is populated with node's host parent if not\n  // currentParentIsValid.\n\n  var currentParentIsValid = false; // Note: these two variables *must* always be updated together.\n\n  var currentParent;\n  var currentParentIsContainer;\n\n  while (true) {\n    if (!currentParentIsValid) {\n      var parent = node.return;\n\n      findParent: while (true) {\n        if (!(parent !== null)) {\n          {\n            throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var parentStateNode = parent.stateNode;\n\n        switch (parent.tag) {\n          case HostComponent:\n            currentParent = parentStateNode;\n            currentParentIsContainer = false;\n            break findParent;\n\n          case HostRoot:\n            currentParent = parentStateNode.containerInfo;\n            currentParentIsContainer = true;\n            break findParent;\n\n          case HostPortal:\n            currentParent = parentStateNode.containerInfo;\n            currentParentIsContainer = true;\n            break findParent;\n\n        }\n\n        parent = parent.return;\n      }\n\n      currentParentIsValid = true;\n    }\n\n    if (node.tag === HostComponent || node.tag === HostText) {\n      commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the\n      // node from the tree.\n\n      if (currentParentIsContainer) {\n        removeChildFromContainer(currentParent, node.stateNode);\n      } else {\n        removeChild(currentParent, node.stateNode);\n      } // Don't visit children because we already visited them.\n\n    } else if (node.tag === HostPortal) {\n      if (node.child !== null) {\n        // When we go into a portal, it becomes the parent to remove from.\n        // We will reassign it back when we pop the portal on the way up.\n        currentParent = node.stateNode.containerInfo;\n        currentParentIsContainer = true; // Visit children because portals might contain host components.\n\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n    } else {\n      commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below.\n\n      if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n    }\n\n    if (node === current) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === current) {\n        return;\n      }\n\n      node = node.return;\n\n      if (node.tag === HostPortal) {\n        // When we go out of the portal, we need to restore the parent.\n        // Since we don't keep a stack of them, we will search for it.\n        currentParentIsValid = false;\n      }\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction commitDeletion(finishedRoot, current, renderPriorityLevel) {\n  {\n    // Recursively delete all host nodes from the parent.\n    // Detach refs and call componentWillUnmount() on the whole subtree.\n    unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n  }\n\n  detachFiber(current);\n}\n\nfunction commitWork(current, finishedWork) {\n\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case MemoComponent:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        // Layout effects are destroyed during the mutation phase so that all\n        // destroy functions for all fibers are called before any create functions.\n        // This prevents sibling component effects from interfering with each other,\n        // e.g. a destroy function in one component should never override a ref set\n        // by a create function in another component during the same commit.\n        commitHookEffectListUnmount(Layout | HasEffect, finishedWork);\n        return;\n      }\n\n    case ClassComponent:\n      {\n        return;\n      }\n\n    case HostComponent:\n      {\n        var instance = finishedWork.stateNode;\n\n        if (instance != null) {\n          // Commit the work prepared earlier.\n          var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n          // as the newProps. The updatePayload will contain the real change in\n          // this case.\n\n          var oldProps = current !== null ? current.memoizedProps : newProps;\n          var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.\n\n          var updatePayload = finishedWork.updateQueue;\n          finishedWork.updateQueue = null;\n\n          if (updatePayload !== null) {\n            commitUpdate(instance, updatePayload, type, oldProps, newProps);\n          }\n        }\n\n        return;\n      }\n\n    case HostText:\n      {\n        if (!(finishedWork.stateNode !== null)) {\n          {\n            throw Error( \"This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var textInstance = finishedWork.stateNode;\n        var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n        // as the newProps. The updatePayload will contain the real change in\n        // this case.\n\n        var oldText = current !== null ? current.memoizedProps : newText;\n        commitTextUpdate(textInstance, oldText, newText);\n        return;\n      }\n\n    case HostRoot:\n      {\n        {\n          var _root = finishedWork.stateNode;\n\n          if (_root.hydrate) {\n            // We've just hydrated. No need to hydrate again.\n            _root.hydrate = false;\n            commitHydratedContainer(_root.containerInfo);\n          }\n        }\n\n        return;\n      }\n\n    case Profiler:\n      {\n        return;\n      }\n\n    case SuspenseComponent:\n      {\n        commitSuspenseComponent(finishedWork);\n        attachSuspenseRetryListeners(finishedWork);\n        return;\n      }\n\n    case SuspenseListComponent:\n      {\n        attachSuspenseRetryListeners(finishedWork);\n        return;\n      }\n\n    case IncompleteClassComponent:\n      {\n        return;\n      }\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction commitSuspenseComponent(finishedWork) {\n  var newState = finishedWork.memoizedState;\n  var newDidTimeout;\n  var primaryChildParent = finishedWork;\n\n  if (newState === null) {\n    newDidTimeout = false;\n  } else {\n    newDidTimeout = true;\n    primaryChildParent = finishedWork.child;\n    markCommitTimeOfFallback();\n  }\n\n  if ( primaryChildParent !== null) {\n    hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);\n  }\n}\n\nfunction commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n\n  var newState = finishedWork.memoizedState;\n\n  if (newState === null) {\n    var current = finishedWork.alternate;\n\n    if (current !== null) {\n      var prevState = current.memoizedState;\n\n      if (prevState !== null) {\n        var suspenseInstance = prevState.dehydrated;\n\n        if (suspenseInstance !== null) {\n          commitHydratedSuspenseInstance(suspenseInstance);\n        }\n      }\n    }\n  }\n}\n\nfunction attachSuspenseRetryListeners(finishedWork) {\n  // If this boundary just timed out, then it will have a set of thenables.\n  // For each thenable, attach a listener so that when it resolves, React\n  // attempts to re-render the boundary in the primary (pre-timeout) state.\n  var thenables = finishedWork.updateQueue;\n\n  if (thenables !== null) {\n    finishedWork.updateQueue = null;\n    var retryCache = finishedWork.stateNode;\n\n    if (retryCache === null) {\n      retryCache = finishedWork.stateNode = new PossiblyWeakSet();\n    }\n\n    thenables.forEach(function (thenable) {\n      // Memoize using the boundary fiber to prevent redundant listeners.\n      var retry = resolveRetryThenable.bind(null, finishedWork, thenable);\n\n      if (!retryCache.has(thenable)) {\n        {\n          if (thenable.__reactDoNotTraceInteractions !== true) {\n            retry = tracing.unstable_wrap(retry);\n          }\n        }\n\n        retryCache.add(thenable);\n        thenable.then(retry, retry);\n      }\n    });\n  }\n}\n\nfunction commitResetTextContent(current) {\n\n  resetTextContent(current.stateNode);\n}\n\nvar PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;\n\nfunction createRootErrorUpdate(fiber, errorInfo, expirationTime) {\n  var update = createUpdate(expirationTime, null); // Unmount the root by rendering null.\n\n  update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  update.payload = {\n    element: null\n  };\n  var error = errorInfo.value;\n\n  update.callback = function () {\n    onUncaughtError(error);\n    logError(fiber, errorInfo);\n  };\n\n  return update;\n}\n\nfunction createClassErrorUpdate(fiber, errorInfo, expirationTime) {\n  var update = createUpdate(expirationTime, null);\n  update.tag = CaptureUpdate;\n  var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n\n  if (typeof getDerivedStateFromError === 'function') {\n    var error$1 = errorInfo.value;\n\n    update.payload = function () {\n      logError(fiber, errorInfo);\n      return getDerivedStateFromError(error$1);\n    };\n  }\n\n  var inst = fiber.stateNode;\n\n  if (inst !== null && typeof inst.componentDidCatch === 'function') {\n    update.callback = function callback() {\n      {\n        markFailedErrorBoundaryForHotReloading(fiber);\n      }\n\n      if (typeof getDerivedStateFromError !== 'function') {\n        // To preserve the preexisting retry behavior of error boundaries,\n        // we keep track of which ones already failed during this batch.\n        // This gets reset before we yield back to the browser.\n        // TODO: Warn in strict mode if getDerivedStateFromError is\n        // not defined.\n        markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined\n\n        logError(fiber, errorInfo);\n      }\n\n      var error$1 = errorInfo.value;\n      var stack = errorInfo.stack;\n      this.componentDidCatch(error$1, {\n        componentStack: stack !== null ? stack : ''\n      });\n\n      {\n        if (typeof getDerivedStateFromError !== 'function') {\n          // If componentDidCatch is the only error boundary method defined,\n          // then it needs to call setState to recover from errors.\n          // If no state update is scheduled then the boundary will swallow the error.\n          if (fiber.expirationTime !== Sync) {\n            error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown');\n          }\n        }\n      }\n    };\n  } else {\n    update.callback = function () {\n      markFailedErrorBoundaryForHotReloading(fiber);\n    };\n  }\n\n  return update;\n}\n\nfunction attachPingListener(root, renderExpirationTime, thenable) {\n  // Attach a listener to the promise to \"ping\" the root and retry. But\n  // only if one does not already exist for the current render expiration\n  // time (which acts like a \"thread ID\" here).\n  var pingCache = root.pingCache;\n  var threadIDs;\n\n  if (pingCache === null) {\n    pingCache = root.pingCache = new PossiblyWeakMap$1();\n    threadIDs = new Set();\n    pingCache.set(thenable, threadIDs);\n  } else {\n    threadIDs = pingCache.get(thenable);\n\n    if (threadIDs === undefined) {\n      threadIDs = new Set();\n      pingCache.set(thenable, threadIDs);\n    }\n  }\n\n  if (!threadIDs.has(renderExpirationTime)) {\n    // Memoize using the thread ID to prevent redundant listeners.\n    threadIDs.add(renderExpirationTime);\n    var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);\n    thenable.then(ping, ping);\n  }\n}\n\nfunction throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {\n  // The source fiber did not complete.\n  sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid.\n\n  sourceFiber.firstEffect = sourceFiber.lastEffect = null;\n\n  if (value !== null && typeof value === 'object' && typeof value.then === 'function') {\n    // This is a thenable.\n    var thenable = value;\n\n    if ((sourceFiber.mode & BlockingMode) === NoMode) {\n      // Reset the memoizedState to what it was before we attempted\n      // to render it.\n      var currentSource = sourceFiber.alternate;\n\n      if (currentSource) {\n        sourceFiber.updateQueue = currentSource.updateQueue;\n        sourceFiber.memoizedState = currentSource.memoizedState;\n        sourceFiber.expirationTime = currentSource.expirationTime;\n      } else {\n        sourceFiber.updateQueue = null;\n        sourceFiber.memoizedState = null;\n      }\n    }\n\n    var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view.\n\n    var _workInProgress = returnFiber;\n\n    do {\n      if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) {\n        // Found the nearest boundary.\n        // Stash the promise on the boundary fiber. If the boundary times out, we'll\n        // attach another listener to flip the boundary back to its normal state.\n        var thenables = _workInProgress.updateQueue;\n\n        if (thenables === null) {\n          var updateQueue = new Set();\n          updateQueue.add(thenable);\n          _workInProgress.updateQueue = updateQueue;\n        } else {\n          thenables.add(thenable);\n        } // If the boundary is outside of blocking mode, we should *not*\n        // suspend the commit. Pretend as if the suspended component rendered\n        // null and keep rendering. In the commit phase, we'll schedule a\n        // subsequent synchronous update to re-render the Suspense.\n        //\n        // Note: It doesn't matter whether the component that suspended was\n        // inside a blocking mode tree. If the Suspense is outside of it, we\n        // should *not* suspend the commit.\n\n\n        if ((_workInProgress.mode & BlockingMode) === NoMode) {\n          _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete.\n          // But we shouldn't call any lifecycle methods or callbacks. Remove\n          // all lifecycle effect tags.\n\n          sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);\n\n          if (sourceFiber.tag === ClassComponent) {\n            var currentSourceFiber = sourceFiber.alternate;\n\n            if (currentSourceFiber === null) {\n              // This is a new mount. Change the tag so it's not mistaken for a\n              // completed class component. For example, we should not call\n              // componentWillUnmount if it is deleted.\n              sourceFiber.tag = IncompleteClassComponent;\n            } else {\n              // When we try rendering again, we should not reuse the current fiber,\n              // since it's known to be in an inconsistent state. Use a force update to\n              // prevent a bail out.\n              var update = createUpdate(Sync, null);\n              update.tag = ForceUpdate;\n              enqueueUpdate(sourceFiber, update);\n            }\n          } // The source fiber did not complete. Mark it with Sync priority to\n          // indicate that it still has pending work.\n\n\n          sourceFiber.expirationTime = Sync; // Exit without suspending.\n\n          return;\n        } // Confirmed that the boundary is in a concurrent mode tree. Continue\n        // with the normal suspend path.\n        //\n        // After this we'll use a set of heuristics to determine whether this\n        // render pass will run to completion or restart or \"suspend\" the commit.\n        // The actual logic for this is spread out in different places.\n        //\n        // This first principle is that if we're going to suspend when we complete\n        // a root, then we should also restart if we get an update or ping that\n        // might unsuspend it, and vice versa. The only reason to suspend is\n        // because you think you might want to restart before committing. However,\n        // it doesn't make sense to restart only while in the period we're suspended.\n        //\n        // Restarting too aggressively is also not good because it starves out any\n        // intermediate loading state. So we use heuristics to determine when.\n        // Suspense Heuristics\n        //\n        // If nothing threw a Promise or all the same fallbacks are already showing,\n        // then don't suspend/restart.\n        //\n        // If this is an initial render of a new tree of Suspense boundaries and\n        // those trigger a fallback, then don't suspend/restart. We want to ensure\n        // that we can show the initial loading state as quickly as possible.\n        //\n        // If we hit a \"Delayed\" case, such as when we'd switch from content back into\n        // a fallback, then we should always suspend/restart. SuspenseConfig applies to\n        // this case. If none is defined, JND is used instead.\n        //\n        // If we're already showing a fallback and it gets \"retried\", allowing us to show\n        // another level, but there's still an inner boundary that would show a fallback,\n        // then we suspend/restart for 500ms since the last time we showed a fallback\n        // anywhere in the tree. This effectively throttles progressive loading into a\n        // consistent train of commits. This also gives us an opportunity to restart to\n        // get to the completed state slightly earlier.\n        //\n        // If there's ambiguity due to batching it's resolved in preference of:\n        // 1) \"delayed\", 2) \"initial render\", 3) \"retry\".\n        //\n        // We want to ensure that a \"busy\" state doesn't get force committed. We want to\n        // ensure that new initial loading states can commit as soon as possible.\n\n\n        attachPingListener(root, renderExpirationTime, thenable);\n        _workInProgress.effectTag |= ShouldCapture;\n        _workInProgress.expirationTime = renderExpirationTime;\n        return;\n      } // This boundary already captured during this render. Continue to the next\n      // boundary.\n\n\n      _workInProgress = _workInProgress.return;\n    } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode.\n    // TODO: Use invariant so the message is stripped in prod?\n\n\n    value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\\n' + '\\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));\n  } // We didn't find a boundary that could handle this type of exception. Start\n  // over and traverse parent path again, this time treating the exception\n  // as an error.\n\n\n  renderDidError();\n  value = createCapturedValue(value, sourceFiber);\n  var workInProgress = returnFiber;\n\n  do {\n    switch (workInProgress.tag) {\n      case HostRoot:\n        {\n          var _errorInfo = value;\n          workInProgress.effectTag |= ShouldCapture;\n          workInProgress.expirationTime = renderExpirationTime;\n\n          var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);\n\n          enqueueCapturedUpdate(workInProgress, _update);\n          return;\n        }\n\n      case ClassComponent:\n        // Capture and retry\n        var errorInfo = value;\n        var ctor = workInProgress.type;\n        var instance = workInProgress.stateNode;\n\n        if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {\n          workInProgress.effectTag |= ShouldCapture;\n          workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state\n\n          var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);\n\n          enqueueCapturedUpdate(workInProgress, _update2);\n          return;\n        }\n\n        break;\n    }\n\n    workInProgress = workInProgress.return;\n  } while (workInProgress !== null);\n}\n\nvar ceil = Math.ceil;\nvar ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,\n    ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,\n    IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing;\nvar NoContext =\n/*                    */\n0;\nvar BatchedContext =\n/*               */\n1;\nvar EventContext =\n/*                 */\n2;\nvar DiscreteEventContext =\n/*         */\n4;\nvar LegacyUnbatchedContext =\n/*       */\n8;\nvar RenderContext =\n/*                */\n16;\nvar CommitContext =\n/*                */\n32;\nvar RootIncomplete = 0;\nvar RootFatalErrored = 1;\nvar RootErrored = 2;\nvar RootSuspended = 3;\nvar RootSuspendedWithDelay = 4;\nvar RootCompleted = 5;\n// Describes where we are in the React execution stack\nvar executionContext = NoContext; // The root we're working on\n\nvar workInProgressRoot = null; // The fiber we're working on\n\nvar workInProgress = null; // The expiration time we're rendering\n\nvar renderExpirationTime$1 = NoWork; // Whether to root completed, errored, suspended, etc.\n\nvar workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown\n\nvar workInProgressRootFatalError = null; // Most recent event time among processed updates during this render.\n// This is conceptually a time stamp but expressed in terms of an ExpirationTime\n// because we deal mostly with expiration times in the hot path, so this avoids\n// the conversion happening in the hot path.\n\nvar workInProgressRootLatestProcessedExpirationTime = Sync;\nvar workInProgressRootLatestSuspenseTimeout = Sync;\nvar workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only\n// includes unprocessed updates, not work in bailed out children.\n\nvar workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately.\n// This flag determines if it might be worthwhile to restart if an opportunity\n// happens latere.\n\nvar workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train\n// model where we don't commit new loading states in too quick succession.\n\nvar globalMostRecentFallbackTime = 0;\nvar FALLBACK_THROTTLE_MS = 500;\nvar nextEffect = null;\nvar hasUncaughtError = false;\nvar firstUncaughtError = null;\nvar legacyErrorBoundariesThatAlreadyFailed = null;\nvar rootDoesHavePassiveEffects = false;\nvar rootWithPendingPassiveEffects = null;\nvar pendingPassiveEffectsRenderPriority = NoPriority;\nvar pendingPassiveEffectsExpirationTime = NoWork;\nvar rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates\n\nvar NESTED_UPDATE_LIMIT = 50;\nvar nestedUpdateCount = 0;\nvar rootWithNestedUpdates = null;\nvar NESTED_PASSIVE_UPDATE_LIMIT = 50;\nvar nestedPassiveUpdateCount = 0;\nvar interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times\n// during the commit phase. This enables them to be traced across components\n// that spawn new work during render. E.g. hidden boundaries, suspended SSR\n// hydration or SuspenseList.\n\nvar spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start\n// time). However, if two updates are scheduled within the same event, we\n// should treat their start times as simultaneous, even if the actual clock\n// time has advanced between the first and second call.\n// In other words, because expiration times determine how updates are batched,\n// we want all updates of like priority that occur within the same event to\n// receive the same expiration time. Otherwise we get tearing.\n\nvar currentEventTime = NoWork;\nfunction requestCurrentTimeForUpdate() {\n  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n    // We're inside React, so it's fine to read the actual time.\n    return msToExpirationTime(now());\n  } // We're not inside React, so we may be in the middle of a browser event.\n\n\n  if (currentEventTime !== NoWork) {\n    // Use the same start time for all updates until we enter React again.\n    return currentEventTime;\n  } // This is the first update since React yielded. Compute a new start time.\n\n\n  currentEventTime = msToExpirationTime(now());\n  return currentEventTime;\n}\nfunction getCurrentTime() {\n  return msToExpirationTime(now());\n}\nfunction computeExpirationForFiber(currentTime, fiber, suspenseConfig) {\n  var mode = fiber.mode;\n\n  if ((mode & BlockingMode) === NoMode) {\n    return Sync;\n  }\n\n  var priorityLevel = getCurrentPriorityLevel();\n\n  if ((mode & ConcurrentMode) === NoMode) {\n    return priorityLevel === ImmediatePriority ? Sync : Batched;\n  }\n\n  if ((executionContext & RenderContext) !== NoContext) {\n    // Use whatever time we're already rendering\n    // TODO: Should there be a way to opt out, like with `runWithPriority`?\n    return renderExpirationTime$1;\n  }\n\n  var expirationTime;\n\n  if (suspenseConfig !== null) {\n    // Compute an expiration time based on the Suspense timeout.\n    expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n  } else {\n    // Compute an expiration time based on the Scheduler priority.\n    switch (priorityLevel) {\n      case ImmediatePriority:\n        expirationTime = Sync;\n        break;\n\n      case UserBlockingPriority$1:\n        // TODO: Rename this to computeUserBlockingExpiration\n        expirationTime = computeInteractiveExpiration(currentTime);\n        break;\n\n      case NormalPriority:\n      case LowPriority:\n        // TODO: Handle LowPriority\n        // TODO: Rename this to... something better.\n        expirationTime = computeAsyncExpiration(currentTime);\n        break;\n\n      case IdlePriority:\n        expirationTime = Idle;\n        break;\n\n      default:\n        {\n          {\n            throw Error( \"Expected a valid priority level\" );\n          }\n        }\n\n    }\n  } // If we're in the middle of rendering a tree, do not update at the same\n  // expiration time that is already rendering.\n  // TODO: We shouldn't have to do this if the update is on a different root.\n  // Refactor computeExpirationForFiber + scheduleUpdate so we have access to\n  // the root when we check for this condition.\n\n\n  if (workInProgressRoot !== null && expirationTime === renderExpirationTime$1) {\n    // This is a trick to move this update into a separate batch\n    expirationTime -= 1;\n  }\n\n  return expirationTime;\n}\nfunction scheduleUpdateOnFiber(fiber, expirationTime) {\n  checkForNestedUpdates();\n  warnAboutRenderPhaseUpdatesInDEV(fiber);\n  var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime);\n\n  if (root === null) {\n    warnAboutUpdateOnUnmountedFiberInDEV(fiber);\n    return;\n  }\n\n  checkForInterruption(fiber, expirationTime);\n  recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the\n  // priority as an argument to that function and this one.\n\n  var priorityLevel = getCurrentPriorityLevel();\n\n  if (expirationTime === Sync) {\n    if ( // Check if we're inside unbatchedUpdates\n    (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering\n    (executionContext & (RenderContext | CommitContext)) === NoContext) {\n      // Register pending interactions on the root to avoid losing traced interaction data.\n      schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed\n      // root inside of batchedUpdates should be synchronous, but layout updates\n      // should be deferred until the end of the batch.\n\n      performSyncWorkOnRoot(root);\n    } else {\n      ensureRootIsScheduled(root);\n      schedulePendingInteractions(root, expirationTime);\n\n      if (executionContext === NoContext) {\n        // Flush the synchronous work now, unless we're already working or inside\n        // a batch. This is intentionally inside scheduleUpdateOnFiber instead of\n        // scheduleCallbackForFiber to preserve the ability to schedule a callback\n        // without immediately flushing it. We only do this for user-initiated\n        // updates, to preserve historical behavior of legacy mode.\n        flushSyncCallbackQueue();\n      }\n    }\n  } else {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, expirationTime);\n  }\n\n  if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered\n  // discrete, even inside a discrete event.\n  priorityLevel === UserBlockingPriority$1 || priorityLevel === ImmediatePriority)) {\n    // This is the result of a discrete event. Track the lowest priority\n    // discrete update per root so we can flush them early, if needed.\n    if (rootsWithPendingDiscreteUpdates === null) {\n      rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]);\n    } else {\n      var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root);\n\n      if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) {\n        rootsWithPendingDiscreteUpdates.set(root, expirationTime);\n      }\n    }\n  }\n}\nvar scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending\n// work without treating it as a typical update that originates from an event;\n// e.g. retrying a Suspense boundary isn't an update, but it does schedule work\n// on a fiber.\n\nfunction markUpdateTimeFromFiberToRoot(fiber, expirationTime) {\n  // Update the source fiber's expiration time\n  if (fiber.expirationTime < expirationTime) {\n    fiber.expirationTime = expirationTime;\n  }\n\n  var alternate = fiber.alternate;\n\n  if (alternate !== null && alternate.expirationTime < expirationTime) {\n    alternate.expirationTime = expirationTime;\n  } // Walk the parent path to the root and update the child expiration time.\n\n\n  var node = fiber.return;\n  var root = null;\n\n  if (node === null && fiber.tag === HostRoot) {\n    root = fiber.stateNode;\n  } else {\n    while (node !== null) {\n      alternate = node.alternate;\n\n      if (node.childExpirationTime < expirationTime) {\n        node.childExpirationTime = expirationTime;\n\n        if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n          alternate.childExpirationTime = expirationTime;\n        }\n      } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n        alternate.childExpirationTime = expirationTime;\n      }\n\n      if (node.return === null && node.tag === HostRoot) {\n        root = node.stateNode;\n        break;\n      }\n\n      node = node.return;\n    }\n  }\n\n  if (root !== null) {\n    if (workInProgressRoot === root) {\n      // Received an update to a tree that's in the middle of rendering. Mark\n      // that's unprocessed work on this root.\n      markUnprocessedUpdateTime(expirationTime);\n\n      if (workInProgressRootExitStatus === RootSuspendedWithDelay) {\n        // The root already suspended with a delay, which means this render\n        // definitely won't finish. Since we have a new update, let's mark it as\n        // suspended now, right before marking the incoming update. This has the\n        // effect of interrupting the current render and switching to the update.\n        // TODO: This happens to work when receiving an update during the render\n        // phase, because of the trick inside computeExpirationForFiber to\n        // subtract 1 from `renderExpirationTime` to move it into a\n        // separate bucket. But we should probably model it with an exception,\n        // using the same mechanism we use to force hydration of a subtree.\n        // TODO: This does not account for low pri updates that were already\n        // scheduled before the root started rendering. Need to track the next\n        // pending expiration time (perhaps by backtracking the return path) and\n        // then trigger a restart in the `renderDidSuspendDelayIfPossible` path.\n        markRootSuspendedAtTime(root, renderExpirationTime$1);\n      }\n    } // Mark that the root has a pending update.\n\n\n    markRootUpdatedAtTime(root, expirationTime);\n  }\n\n  return root;\n}\n\nfunction getNextRootExpirationTimeToWorkOn(root) {\n  // Determines the next expiration time that the root should render, taking\n  // into account levels that may be suspended, or levels that may have\n  // received a ping.\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime !== NoWork) {\n    return lastExpiredTime;\n  } // \"Pending\" refers to any update that hasn't committed yet, including if it\n  // suspended. The \"suspended\" range is therefore a subset.\n\n\n  var firstPendingTime = root.firstPendingTime;\n\n  if (!isRootSuspendedAtTime(root, firstPendingTime)) {\n    // The highest priority pending time is not suspended. Let's work on that.\n    return firstPendingTime;\n  } // If the first pending time is suspended, check if there's a lower priority\n  // pending level that we know about. Or check if we received a ping. Work\n  // on whichever is higher priority.\n\n\n  var lastPingedTime = root.lastPingedTime;\n  var nextKnownPendingLevel = root.nextKnownPendingLevel;\n  var nextLevel = lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel;\n\n  if ( nextLevel <= Idle && firstPendingTime !== nextLevel) {\n    // Don't work on Idle/Never priority unless everything else is committed.\n    return NoWork;\n  }\n\n  return nextLevel;\n} // Use this function to schedule a task for a root. There's only one task per\n// root; if a task was already scheduled, we'll check to make sure the\n// expiration time of the existing task is the same as the expiration time of\n// the next level that the root has work on. This function is called on every\n// update, and right before exiting a task.\n\n\nfunction ensureRootIsScheduled(root) {\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime !== NoWork) {\n    // Special case: Expired work should flush synchronously.\n    root.callbackExpirationTime = Sync;\n    root.callbackPriority = ImmediatePriority;\n    root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n    return;\n  }\n\n  var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n  var existingCallbackNode = root.callbackNode;\n\n  if (expirationTime === NoWork) {\n    // There's nothing to work on.\n    if (existingCallbackNode !== null) {\n      root.callbackNode = null;\n      root.callbackExpirationTime = NoWork;\n      root.callbackPriority = NoPriority;\n    }\n\n    return;\n  } // TODO: If this is an update, we already read the current time. Pass the\n  // time as an argument.\n\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and\n  // expiration time. Otherwise, we'll cancel it and schedule a new one.\n\n  if (existingCallbackNode !== null) {\n    var existingCallbackPriority = root.callbackPriority;\n    var existingCallbackExpirationTime = root.callbackExpirationTime;\n\n    if ( // Callback must have the exact same expiration time.\n    existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority.\n    existingCallbackPriority >= priorityLevel) {\n      // Existing callback is sufficient.\n      return;\n    } // Need to schedule a new task.\n    // TODO: Instead of scheduling a new task, we should be able to change the\n    // priority of the existing one.\n\n\n    cancelCallback(existingCallbackNode);\n  }\n\n  root.callbackExpirationTime = expirationTime;\n  root.callbackPriority = priorityLevel;\n  var callbackNode;\n\n  if (expirationTime === Sync) {\n    // Sync React callbacks are scheduled on a special internal queue\n    callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n  } else {\n    callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects\n    // ordering because tasks are processed in timeout order.\n    {\n      timeout: expirationTimeToMs(expirationTime) - now()\n    });\n  }\n\n  root.callbackNode = callbackNode;\n} // This is the entry point for every concurrent task, i.e. anything that\n// goes through Scheduler.\n\n\nfunction performConcurrentWorkOnRoot(root, didTimeout) {\n  // Since we know we're in a React event, we can clear the current\n  // event time. The next update will compute a new event time.\n  currentEventTime = NoWork;\n\n  if (didTimeout) {\n    // The render task took too long to complete. Mark the current time as\n    // expired to synchronously render all expired work in a single batch.\n    var currentTime = requestCurrentTimeForUpdate();\n    markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback.\n\n    ensureRootIsScheduled(root);\n    return null;\n  } // Determine the next expiration time to work on, using the fields stored\n  // on the root.\n\n\n  var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n\n  if (expirationTime !== NoWork) {\n    var originalCallbackNode = root.callbackNode;\n\n    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n      {\n        throw Error( \"Should not already be working.\" );\n      }\n    }\n\n    flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n    // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n      prepareFreshStack(root, expirationTime);\n      startWorkOnPendingInteractions(root, expirationTime);\n    } // If we have a work-in-progress fiber, it means there's still work to do\n    // in this root.\n\n\n    if (workInProgress !== null) {\n      var prevExecutionContext = executionContext;\n      executionContext |= RenderContext;\n      var prevDispatcher = pushDispatcher();\n      var prevInteractions = pushInteractions(root);\n      startWorkLoopTimer(workInProgress);\n\n      do {\n        try {\n          workLoopConcurrent();\n          break;\n        } catch (thrownValue) {\n          handleError(root, thrownValue);\n        }\n      } while (true);\n\n      resetContextDependencies();\n      executionContext = prevExecutionContext;\n      popDispatcher(prevDispatcher);\n\n      {\n        popInteractions(prevInteractions);\n      }\n\n      if (workInProgressRootExitStatus === RootFatalErrored) {\n        var fatalError = workInProgressRootFatalError;\n        stopInterruptedWorkLoopTimer();\n        prepareFreshStack(root, expirationTime);\n        markRootSuspendedAtTime(root, expirationTime);\n        ensureRootIsScheduled(root);\n        throw fatalError;\n      }\n\n      if (workInProgress !== null) {\n        // There's still work left over. Exit without committing.\n        stopInterruptedWorkLoopTimer();\n      } else {\n        // We now have a consistent tree. The next step is either to commit it,\n        // or, if something suspended, wait to commit it after a timeout.\n        stopFinishedWorkLoopTimer();\n        var finishedWork = root.finishedWork = root.current.alternate;\n        root.finishedExpirationTime = expirationTime;\n        finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime);\n      }\n\n      ensureRootIsScheduled(root);\n\n      if (root.callbackNode === originalCallbackNode) {\n        // The task node scheduled for this root is the same one that's\n        // currently executed. Need to return a continuation.\n        return performConcurrentWorkOnRoot.bind(null, root);\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) {\n  // Set this to null to indicate there's no in-progress render.\n  workInProgressRoot = null;\n\n  switch (exitStatus) {\n    case RootIncomplete:\n    case RootFatalErrored:\n      {\n        {\n          {\n            throw Error( \"Root did not complete. This is a bug in React.\" );\n          }\n        }\n      }\n    // Flow knows about invariant, so it complains if I add a break\n    // statement, but eslint doesn't know about invariant, so it complains\n    // if I do. eslint-disable-next-line no-fallthrough\n\n    case RootErrored:\n      {\n        // If this was an async render, the error may have happened due to\n        // a mutation in a concurrent event. Try rendering one more time,\n        // synchronously, to see if the error goes away. If there are\n        // lower priority updates, let's include those, too, in case they\n        // fix the inconsistency. Render at Idle to include all updates.\n        // If it was Idle or Never or some not-yet-invented time, render\n        // at that time.\n        markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous\n        // and therefore not hit this path again.\n\n        break;\n      }\n\n    case RootSuspended:\n      {\n        markRootSuspendedAtTime(root, expirationTime);\n        var lastSuspendedTime = root.lastSuspendedTime;\n\n        if (expirationTime === lastSuspendedTime) {\n          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n        } // We have an acceptable loading state. We need to figure out if we\n        // should immediately commit it or wait a bit.\n        // If we have processed new updates during this render, we may now\n        // have a new loading state ready. We want to ensure that we commit\n        // that as soon as possible.\n\n\n        var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync;\n\n        if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current)) {\n          // If we have not processed any new updates during this pass, then\n          // this is either a retry of an existing fallback state or a\n          // hidden tree. Hidden trees shouldn't be batched with other work\n          // and after that's fixed it can only be a retry. We're going to\n          // throttle committing retries so that we don't show too many\n          // loading states too quickly.\n          var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.\n\n          if (msUntilTimeout > 10) {\n            if (workInProgressRootHasPendingPing) {\n              var lastPingedTime = root.lastPingedTime;\n\n              if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) {\n                // This render was pinged but we didn't get to restart\n                // earlier so try restarting now instead.\n                root.lastPingedTime = expirationTime;\n                prepareFreshStack(root, expirationTime);\n                break;\n              }\n            }\n\n            var nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n            if (nextTime !== NoWork && nextTime !== expirationTime) {\n              // There's additional work on this root.\n              break;\n            }\n\n            if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) {\n              // We should prefer to render the fallback of at the last\n              // suspended level. Ping the last suspended level to try\n              // rendering it again.\n              root.lastPingedTime = lastSuspendedTime;\n              break;\n            } // The render is suspended, it hasn't timed out, and there's no\n            // lower priority work to do. Instead of committing the fallback\n            // immediately, wait for more data to arrive.\n\n\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);\n            break;\n          }\n        } // The work expired. Commit immediately.\n\n\n        commitRoot(root);\n        break;\n      }\n\n    case RootSuspendedWithDelay:\n      {\n        markRootSuspendedAtTime(root, expirationTime);\n        var _lastSuspendedTime = root.lastSuspendedTime;\n\n        if (expirationTime === _lastSuspendedTime) {\n          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n        }\n\n        if ( // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current)) {\n          // We're suspended in a state that should be avoided. We'll try to\n          // avoid committing it for as long as the timeouts let us.\n          if (workInProgressRootHasPendingPing) {\n            var _lastPingedTime = root.lastPingedTime;\n\n            if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) {\n              // This render was pinged but we didn't get to restart earlier\n              // so try restarting now instead.\n              root.lastPingedTime = expirationTime;\n              prepareFreshStack(root, expirationTime);\n              break;\n            }\n          }\n\n          var _nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n          if (_nextTime !== NoWork && _nextTime !== expirationTime) {\n            // There's additional work on this root.\n            break;\n          }\n\n          if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) {\n            // We should prefer to render the fallback of at the last\n            // suspended level. Ping the last suspended level to try\n            // rendering it again.\n            root.lastPingedTime = _lastSuspendedTime;\n            break;\n          }\n\n          var _msUntilTimeout;\n\n          if (workInProgressRootLatestSuspenseTimeout !== Sync) {\n            // We have processed a suspense config whose expiration time we\n            // can use as the timeout.\n            _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now();\n          } else if (workInProgressRootLatestProcessedExpirationTime === Sync) {\n            // This should never normally happen because only new updates\n            // cause delayed states, so we should have processed something.\n            // However, this could also happen in an offscreen tree.\n            _msUntilTimeout = 0;\n          } else {\n            // If we don't have a suspense config, we're going to use a\n            // heuristic to determine how long we can suspend.\n            var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime);\n            var currentTimeMs = now();\n            var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs;\n            var timeElapsed = currentTimeMs - eventTimeMs;\n\n            if (timeElapsed < 0) {\n              // We get this wrong some time since we estimate the time.\n              timeElapsed = 0;\n            }\n\n            _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the\n            // event time is exact instead of inferred from expiration time\n            // we don't need this.\n\n            if (timeUntilExpirationMs < _msUntilTimeout) {\n              _msUntilTimeout = timeUntilExpirationMs;\n            }\n          } // Don't bother with a very short suspense time.\n\n\n          if (_msUntilTimeout > 10) {\n            // The render is suspended, it hasn't timed out, and there's no\n            // lower priority work to do. Instead of committing the fallback\n            // immediately, wait for more data to arrive.\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);\n            break;\n          }\n        } // The work expired. Commit immediately.\n\n\n        commitRoot(root);\n        break;\n      }\n\n    case RootCompleted:\n      {\n        // The work completed. Ready to commit.\n        if ( // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) {\n          // If we have exceeded the minimum loading delay, which probably\n          // means we have shown a spinner already, we might have to suspend\n          // a bit longer to ensure that the spinner is shown for\n          // enough time.\n          var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig);\n\n          if (_msUntilTimeout2 > 10) {\n            markRootSuspendedAtTime(root, expirationTime);\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2);\n            break;\n          }\n        }\n\n        commitRoot(root);\n        break;\n      }\n\n    default:\n      {\n        {\n          {\n            throw Error( \"Unknown root exit status.\" );\n          }\n        }\n      }\n  }\n} // This is the entry point for synchronous tasks that don't go\n// through Scheduler\n\n\nfunction performSyncWorkOnRoot(root) {\n  // Check if there's expired work on this root. Otherwise, render at Sync.\n  var lastExpiredTime = root.lastExpiredTime;\n  var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync;\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Should not already be working.\" );\n    }\n  }\n\n  flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n  // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n  if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n    prepareFreshStack(root, expirationTime);\n    startWorkOnPendingInteractions(root, expirationTime);\n  } // If we have a work-in-progress fiber, it means there's still work to do\n  // in this root.\n\n\n  if (workInProgress !== null) {\n    var prevExecutionContext = executionContext;\n    executionContext |= RenderContext;\n    var prevDispatcher = pushDispatcher();\n    var prevInteractions = pushInteractions(root);\n    startWorkLoopTimer(workInProgress);\n\n    do {\n      try {\n        workLoopSync();\n        break;\n      } catch (thrownValue) {\n        handleError(root, thrownValue);\n      }\n    } while (true);\n\n    resetContextDependencies();\n    executionContext = prevExecutionContext;\n    popDispatcher(prevDispatcher);\n\n    {\n      popInteractions(prevInteractions);\n    }\n\n    if (workInProgressRootExitStatus === RootFatalErrored) {\n      var fatalError = workInProgressRootFatalError;\n      stopInterruptedWorkLoopTimer();\n      prepareFreshStack(root, expirationTime);\n      markRootSuspendedAtTime(root, expirationTime);\n      ensureRootIsScheduled(root);\n      throw fatalError;\n    }\n\n    if (workInProgress !== null) {\n      // This is a sync render, so we should have finished the whole tree.\n      {\n        {\n          throw Error( \"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n    } else {\n      // We now have a consistent tree. Because this is a sync render, we\n      // will commit it even if something suspended.\n      stopFinishedWorkLoopTimer();\n      root.finishedWork = root.current.alternate;\n      root.finishedExpirationTime = expirationTime;\n      finishSyncRender(root);\n    } // Before exiting, make sure there's a callback scheduled for the next\n    // pending level.\n\n\n    ensureRootIsScheduled(root);\n  }\n\n  return null;\n}\n\nfunction finishSyncRender(root) {\n  // Set this to null to indicate there's no in-progress render.\n  workInProgressRoot = null;\n  commitRoot(root);\n}\nfunction flushDiscreteUpdates() {\n  // TODO: Should be able to flush inside batchedUpdates, but not inside `act`.\n  // However, `act` uses `batchedUpdates`, so there's no way to distinguish\n  // those two cases. Need to fix this before exposing flushDiscreteUpdates\n  // as a public API.\n  if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) {\n    {\n      if ((executionContext & RenderContext) !== NoContext) {\n        error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.');\n      }\n    } // We're already rendering, so we can't synchronously flush pending work.\n    // This is probably a nested event dispatch triggered by a lifecycle/effect,\n    // like `el.focus()`. Exit.\n\n\n    return;\n  }\n\n  flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that\n  // they fire before the next serial event.\n\n  flushPassiveEffects();\n}\nfunction syncUpdates(fn, a, b, c) {\n  return runWithPriority$1(ImmediatePriority, fn.bind(null, a, b, c));\n}\n\nfunction flushPendingDiscreteUpdates() {\n  if (rootsWithPendingDiscreteUpdates !== null) {\n    // For each root with pending discrete updates, schedule a callback to\n    // immediately flush them.\n    var roots = rootsWithPendingDiscreteUpdates;\n    rootsWithPendingDiscreteUpdates = null;\n    roots.forEach(function (expirationTime, root) {\n      markRootExpiredAtTime(root, expirationTime);\n      ensureRootIsScheduled(root);\n    }); // Now flush the immediate queue.\n\n    flushSyncCallbackQueue();\n  }\n}\n\nfunction batchedUpdates$1(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext |= BatchedContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction batchedEventUpdates$1(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext |= EventContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction discreteUpdates$1(fn, a, b, c, d) {\n  var prevExecutionContext = executionContext;\n  executionContext |= DiscreteEventContext;\n\n  try {\n    // Should this\n    return runWithPriority$1(UserBlockingPriority$1, fn.bind(null, a, b, c, d));\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction unbatchedUpdates(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext &= ~BatchedContext;\n  executionContext |= LegacyUnbatchedContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction flushSync(fn, a) {\n  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n    {\n      {\n        throw Error( \"flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.\" );\n      }\n    }\n  }\n\n  var prevExecutionContext = executionContext;\n  executionContext |= BatchedContext;\n\n  try {\n    return runWithPriority$1(ImmediatePriority, fn.bind(null, a));\n  } finally {\n    executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.\n    // Note that this will happen even if batchedUpdates is higher up\n    // the stack.\n\n    flushSyncCallbackQueue();\n  }\n}\n\nfunction prepareFreshStack(root, expirationTime) {\n  root.finishedWork = null;\n  root.finishedExpirationTime = NoWork;\n  var timeoutHandle = root.timeoutHandle;\n\n  if (timeoutHandle !== noTimeout) {\n    // The root previous suspended and scheduled a timeout to commit a fallback\n    // state. Now that we have additional work, cancel the timeout.\n    root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above\n\n    cancelTimeout(timeoutHandle);\n  }\n\n  if (workInProgress !== null) {\n    var interruptedWork = workInProgress.return;\n\n    while (interruptedWork !== null) {\n      unwindInterruptedWork(interruptedWork);\n      interruptedWork = interruptedWork.return;\n    }\n  }\n\n  workInProgressRoot = root;\n  workInProgress = createWorkInProgress(root.current, null);\n  renderExpirationTime$1 = expirationTime;\n  workInProgressRootExitStatus = RootIncomplete;\n  workInProgressRootFatalError = null;\n  workInProgressRootLatestProcessedExpirationTime = Sync;\n  workInProgressRootLatestSuspenseTimeout = Sync;\n  workInProgressRootCanSuspendUsingConfig = null;\n  workInProgressRootNextUnprocessedUpdateTime = NoWork;\n  workInProgressRootHasPendingPing = false;\n\n  {\n    spawnedWorkDuringRender = null;\n  }\n\n  {\n    ReactStrictModeWarnings.discardPendingWarnings();\n  }\n}\n\nfunction handleError(root, thrownValue) {\n  do {\n    try {\n      // Reset module-level state that was set during the render phase.\n      resetContextDependencies();\n      resetHooksAfterThrow();\n      resetCurrentFiber();\n\n      if (workInProgress === null || workInProgress.return === null) {\n        // Expected to be working on a non-root fiber. This is a fatal error\n        // because there's no ancestor that can handle it; the root is\n        // supposed to capture all errors that weren't caught by an error\n        // boundary.\n        workInProgressRootExitStatus = RootFatalErrored;\n        workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next\n        // sibling, or the parent if there are no siblings. But since the root\n        // has no siblings nor a parent, we set it to null. Usually this is\n        // handled by `completeUnitOfWork` or `unwindWork`, but since we're\n        // interntionally not calling those, we need set it here.\n        // TODO: Consider calling `unwindWork` to pop the contexts.\n\n        workInProgress = null;\n        return null;\n      }\n\n      if (enableProfilerTimer && workInProgress.mode & ProfileMode) {\n        // Record the time spent rendering before an error was thrown. This\n        // avoids inaccurate Profiler durations in the case of a\n        // suspended render.\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);\n      }\n\n      throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime$1);\n      workInProgress = completeUnitOfWork(workInProgress);\n    } catch (yetAnotherThrownValue) {\n      // Something in the return path also threw.\n      thrownValue = yetAnotherThrownValue;\n      continue;\n    } // Return to the normal work loop.\n\n\n    return;\n  } while (true);\n}\n\nfunction pushDispatcher(root) {\n  var prevDispatcher = ReactCurrentDispatcher$1.current;\n  ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;\n\n  if (prevDispatcher === null) {\n    // The React isomorphic package does not include a default dispatcher.\n    // Instead the first renderer will lazily attach one, in order to give\n    // nicer error messages.\n    return ContextOnlyDispatcher;\n  } else {\n    return prevDispatcher;\n  }\n}\n\nfunction popDispatcher(prevDispatcher) {\n  ReactCurrentDispatcher$1.current = prevDispatcher;\n}\n\nfunction pushInteractions(root) {\n  {\n    var prevInteractions = tracing.__interactionsRef.current;\n    tracing.__interactionsRef.current = root.memoizedInteractions;\n    return prevInteractions;\n  }\n}\n\nfunction popInteractions(prevInteractions) {\n  {\n    tracing.__interactionsRef.current = prevInteractions;\n  }\n}\n\nfunction markCommitTimeOfFallback() {\n  globalMostRecentFallbackTime = now();\n}\nfunction markRenderEventTimeAndConfig(expirationTime, suspenseConfig) {\n  if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) {\n    workInProgressRootLatestProcessedExpirationTime = expirationTime;\n  }\n\n  if (suspenseConfig !== null) {\n    if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) {\n      workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad.\n\n      workInProgressRootCanSuspendUsingConfig = suspenseConfig;\n    }\n  }\n}\nfunction markUnprocessedUpdateTime(expirationTime) {\n  if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) {\n    workInProgressRootNextUnprocessedUpdateTime = expirationTime;\n  }\n}\nfunction renderDidSuspend() {\n  if (workInProgressRootExitStatus === RootIncomplete) {\n    workInProgressRootExitStatus = RootSuspended;\n  }\n}\nfunction renderDidSuspendDelayIfPossible() {\n  if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) {\n    workInProgressRootExitStatus = RootSuspendedWithDelay;\n  } // Check if there's a lower priority update somewhere else in the tree.\n\n\n  if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) {\n    // Mark the current render as suspended, and then mark that there's a\n    // pending update.\n    // TODO: This should immediately interrupt the current render, instead\n    // of waiting until the next time we yield.\n    markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime$1);\n    markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime);\n  }\n}\nfunction renderDidError() {\n  if (workInProgressRootExitStatus !== RootCompleted) {\n    workInProgressRootExitStatus = RootErrored;\n  }\n} // Called during render to determine if anything has suspended.\n// Returns false if we're not sure.\n\nfunction renderHasNotSuspendedYet() {\n  // If something errored or completed, we can't really be sure,\n  // so those are false.\n  return workInProgressRootExitStatus === RootIncomplete;\n}\n\nfunction inferTimeFromExpirationTime(expirationTime) {\n  // We don't know exactly when the update was scheduled, but we can infer an\n  // approximate start time from the expiration time.\n  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n  return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;\n}\n\nfunction inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) {\n  // We don't know exactly when the update was scheduled, but we can infer an\n  // approximate start time from the expiration time by subtracting the timeout\n  // that was added to the event time.\n  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n  return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n} // The work loop is an extremely hot path. Tell Closure not to inline it.\n\n/** @noinline */\n\n\nfunction workLoopSync() {\n  // Already timed out, so perform work without checking if we need to yield.\n  while (workInProgress !== null) {\n    workInProgress = performUnitOfWork(workInProgress);\n  }\n}\n/** @noinline */\n\n\nfunction workLoopConcurrent() {\n  // Perform work until Scheduler asks us to yield\n  while (workInProgress !== null && !shouldYield()) {\n    workInProgress = performUnitOfWork(workInProgress);\n  }\n}\n\nfunction performUnitOfWork(unitOfWork) {\n  // The current, flushed, state of this fiber is the alternate. Ideally\n  // nothing should rely on this, but relying on it here means that we don't\n  // need an additional field on the work in progress.\n  var current = unitOfWork.alternate;\n  startWorkTimer(unitOfWork);\n  setCurrentFiber(unitOfWork);\n  var next;\n\n  if ( (unitOfWork.mode & ProfileMode) !== NoMode) {\n    startProfilerTimer(unitOfWork);\n    next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n    stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);\n  } else {\n    next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n  }\n\n  resetCurrentFiber();\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n\n  if (next === null) {\n    // If this doesn't spawn new work, complete the current work.\n    next = completeUnitOfWork(unitOfWork);\n  }\n\n  ReactCurrentOwner$2.current = null;\n  return next;\n}\n\nfunction completeUnitOfWork(unitOfWork) {\n  // Attempt to complete the current unit of work, then move to the next\n  // sibling. If there are no more siblings, return to the parent fiber.\n  workInProgress = unitOfWork;\n\n  do {\n    // The current, flushed, state of this fiber is the alternate. Ideally\n    // nothing should rely on this, but relying on it here means that we don't\n    // need an additional field on the work in progress.\n    var current = workInProgress.alternate;\n    var returnFiber = workInProgress.return; // Check if the work completed or if something threw.\n\n    if ((workInProgress.effectTag & Incomplete) === NoEffect) {\n      setCurrentFiber(workInProgress);\n      var next = void 0;\n\n      if ( (workInProgress.mode & ProfileMode) === NoMode) {\n        next = completeWork(current, workInProgress, renderExpirationTime$1);\n      } else {\n        startProfilerTimer(workInProgress);\n        next = completeWork(current, workInProgress, renderExpirationTime$1); // Update render duration assuming we didn't error.\n\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);\n      }\n\n      stopWorkTimer(workInProgress);\n      resetCurrentFiber();\n      resetChildExpirationTime(workInProgress);\n\n      if (next !== null) {\n        // Completing this fiber spawned new work. Work on that next.\n        return next;\n      }\n\n      if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete\n      (returnFiber.effectTag & Incomplete) === NoEffect) {\n        // Append all the effects of the subtree and this fiber onto the effect\n        // list of the parent. The completion order of the children affects the\n        // side-effect order.\n        if (returnFiber.firstEffect === null) {\n          returnFiber.firstEffect = workInProgress.firstEffect;\n        }\n\n        if (workInProgress.lastEffect !== null) {\n          if (returnFiber.lastEffect !== null) {\n            returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;\n          }\n\n          returnFiber.lastEffect = workInProgress.lastEffect;\n        } // If this fiber had side-effects, we append it AFTER the children's\n        // side-effects. We can perform certain side-effects earlier if needed,\n        // by doing multiple passes over the effect list. We don't want to\n        // schedule our own side-effect on our own list because if end up\n        // reusing children we'll schedule this effect onto itself since we're\n        // at the end.\n\n\n        var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect\n        // list. PerformedWork effect is read by React DevTools but shouldn't be\n        // committed.\n\n        if (effectTag > PerformedWork) {\n          if (returnFiber.lastEffect !== null) {\n            returnFiber.lastEffect.nextEffect = workInProgress;\n          } else {\n            returnFiber.firstEffect = workInProgress;\n          }\n\n          returnFiber.lastEffect = workInProgress;\n        }\n      }\n    } else {\n      // This fiber did not complete because something threw. Pop values off\n      // the stack without entering the complete phase. If this is a boundary,\n      // capture values if possible.\n      var _next = unwindWork(workInProgress); // Because this fiber did not complete, don't reset its expiration time.\n\n\n      if ( (workInProgress.mode & ProfileMode) !== NoMode) {\n        // Record the render duration for the fiber that errored.\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing.\n\n        var actualDuration = workInProgress.actualDuration;\n        var child = workInProgress.child;\n\n        while (child !== null) {\n          actualDuration += child.actualDuration;\n          child = child.sibling;\n        }\n\n        workInProgress.actualDuration = actualDuration;\n      }\n\n      if (_next !== null) {\n        // If completing this work spawned new work, do that next. We'll come\n        // back here again.\n        // Since we're restarting, remove anything that is not a host effect\n        // from the effect tag.\n        // TODO: The name stopFailedWorkTimer is misleading because Suspense\n        // also captures and restarts.\n        stopFailedWorkTimer(workInProgress);\n        _next.effectTag &= HostEffectMask;\n        return _next;\n      }\n\n      stopWorkTimer(workInProgress);\n\n      if (returnFiber !== null) {\n        // Mark the parent fiber as incomplete and clear its effect list.\n        returnFiber.firstEffect = returnFiber.lastEffect = null;\n        returnFiber.effectTag |= Incomplete;\n      }\n    }\n\n    var siblingFiber = workInProgress.sibling;\n\n    if (siblingFiber !== null) {\n      // If there is more work to do in this returnFiber, do that next.\n      return siblingFiber;\n    } // Otherwise, return to the parent\n\n\n    workInProgress = returnFiber;\n  } while (workInProgress !== null); // We've reached the root.\n\n\n  if (workInProgressRootExitStatus === RootIncomplete) {\n    workInProgressRootExitStatus = RootCompleted;\n  }\n\n  return null;\n}\n\nfunction getRemainingExpirationTime(fiber) {\n  var updateExpirationTime = fiber.expirationTime;\n  var childExpirationTime = fiber.childExpirationTime;\n  return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime;\n}\n\nfunction resetChildExpirationTime(completedWork) {\n  if (renderExpirationTime$1 !== Never && completedWork.childExpirationTime === Never) {\n    // The children of this component are hidden. Don't bubble their\n    // expiration times.\n    return;\n  }\n\n  var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time.\n\n  if ( (completedWork.mode & ProfileMode) !== NoMode) {\n    // In profiling mode, resetChildExpirationTime is also used to reset\n    // profiler durations.\n    var actualDuration = completedWork.actualDuration;\n    var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will\n    // only be updated if work is done on the fiber (i.e. it doesn't bailout).\n    // When work is done, it should bubble to the parent's actualDuration. If\n    // the fiber has not been cloned though, (meaning no work was done), then\n    // this value will reflect the amount of time spent working on a previous\n    // render. In that case it should not bubble. We determine whether it was\n    // cloned by comparing the child pointer.\n\n    var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child;\n    var child = completedWork.child;\n\n    while (child !== null) {\n      var childUpdateExpirationTime = child.expirationTime;\n      var childChildExpirationTime = child.childExpirationTime;\n\n      if (childUpdateExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = childUpdateExpirationTime;\n      }\n\n      if (childChildExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = childChildExpirationTime;\n      }\n\n      if (shouldBubbleActualDurations) {\n        actualDuration += child.actualDuration;\n      }\n\n      treeBaseDuration += child.treeBaseDuration;\n      child = child.sibling;\n    }\n\n    completedWork.actualDuration = actualDuration;\n    completedWork.treeBaseDuration = treeBaseDuration;\n  } else {\n    var _child = completedWork.child;\n\n    while (_child !== null) {\n      var _childUpdateExpirationTime = _child.expirationTime;\n      var _childChildExpirationTime = _child.childExpirationTime;\n\n      if (_childUpdateExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = _childUpdateExpirationTime;\n      }\n\n      if (_childChildExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = _childChildExpirationTime;\n      }\n\n      _child = _child.sibling;\n    }\n  }\n\n  completedWork.childExpirationTime = newChildExpirationTime;\n}\n\nfunction commitRoot(root) {\n  var renderPriorityLevel = getCurrentPriorityLevel();\n  runWithPriority$1(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel));\n  return null;\n}\n\nfunction commitRootImpl(root, renderPriorityLevel) {\n  do {\n    // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which\n    // means `flushPassiveEffects` will sometimes result in additional\n    // passive effects. So we need to keep flushing in a loop until there are\n    // no more pending effects.\n    // TODO: Might be better if `flushPassiveEffects` did not automatically\n    // flush synchronous work at the end, to avoid factoring hazards like this.\n    flushPassiveEffects();\n  } while (rootWithPendingPassiveEffects !== null);\n\n  flushRenderPhaseStrictModeWarningsInDEV();\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Should not already be working.\" );\n    }\n  }\n\n  var finishedWork = root.finishedWork;\n  var expirationTime = root.finishedExpirationTime;\n\n  if (finishedWork === null) {\n    return null;\n  }\n\n  root.finishedWork = null;\n  root.finishedExpirationTime = NoWork;\n\n  if (!(finishedWork !== root.current)) {\n    {\n      throw Error( \"Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  } // commitRoot never returns a continuation; it always finishes synchronously.\n  // So we can clear these now to allow a new callback to be scheduled.\n\n\n  root.callbackNode = null;\n  root.callbackExpirationTime = NoWork;\n  root.callbackPriority = NoPriority;\n  root.nextKnownPendingLevel = NoWork;\n  startCommitTimer(); // Update the first and last pending times on this root. The new first\n  // pending time is whatever is left on the root fiber.\n\n  var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork);\n  markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit);\n\n  if (root === workInProgressRoot) {\n    // We can reset these now that they are finished.\n    workInProgressRoot = null;\n    workInProgress = null;\n    renderExpirationTime$1 = NoWork;\n  } // This indicates that the last root we worked on is not the same one that\n  // we're committing now. This most commonly happens when a suspended root\n  // times out.\n  // Get the list of effects.\n\n\n  var firstEffect;\n\n  if (finishedWork.effectTag > PerformedWork) {\n    // A fiber's effect list consists only of its children, not itself. So if\n    // the root has an effect, we need to add it to the end of the list. The\n    // resulting list is the set that would belong to the root's parent, if it\n    // had one; that is, all the effects in the tree including the root.\n    if (finishedWork.lastEffect !== null) {\n      finishedWork.lastEffect.nextEffect = finishedWork;\n      firstEffect = finishedWork.firstEffect;\n    } else {\n      firstEffect = finishedWork;\n    }\n  } else {\n    // There is no effect on the root.\n    firstEffect = finishedWork.firstEffect;\n  }\n\n  if (firstEffect !== null) {\n    var prevExecutionContext = executionContext;\n    executionContext |= CommitContext;\n    var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles\n\n    ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass\n    // of the effect list for each phase: all mutation effects come before all\n    // layout effects, and so on.\n    // The first phase a \"before mutation\" phase. We use this phase to read the\n    // state of the host tree right before we mutate it. This is where\n    // getSnapshotBeforeUpdate is called.\n\n    startCommitSnapshotEffectsTimer();\n    prepareForCommit(root.containerInfo);\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitBeforeMutationEffects, null);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var error = clearCaughtError();\n          captureCommitPhaseError(nextEffect, error);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitSnapshotEffectsTimer();\n\n    {\n      // Mark the current commit time to be shared by all Profilers in this\n      // batch. This enables them to be grouped later.\n      recordCommitTime();\n    } // The next phase is the mutation phase, where we mutate the host tree.\n\n\n    startCommitHostEffectsTimer();\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error = clearCaughtError();\n\n          captureCommitPhaseError(nextEffect, _error);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitHostEffectsTimer();\n    resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after\n    // the mutation phase, so that the previous tree is still current during\n    // componentWillUnmount, but before the layout phase, so that the finished\n    // work is current during componentDidMount/Update.\n\n    root.current = finishedWork; // The next phase is the layout phase, where we call effects that read\n    // the host tree after it's been mutated. The idiomatic use case for this is\n    // layout, but class component lifecycles also fire here for legacy reasons.\n\n    startCommitLifeCyclesTimer();\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error2 = clearCaughtError();\n\n          captureCommitPhaseError(nextEffect, _error2);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitLifeCyclesTimer();\n    nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an\n    // opportunity to paint.\n\n    requestPaint();\n\n    {\n      popInteractions(prevInteractions);\n    }\n\n    executionContext = prevExecutionContext;\n  } else {\n    // No effects.\n    root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were\n    // no effects.\n    // TODO: Maybe there's a better way to report this.\n\n    startCommitSnapshotEffectsTimer();\n    stopCommitSnapshotEffectsTimer();\n\n    {\n      recordCommitTime();\n    }\n\n    startCommitHostEffectsTimer();\n    stopCommitHostEffectsTimer();\n    startCommitLifeCyclesTimer();\n    stopCommitLifeCyclesTimer();\n  }\n\n  stopCommitTimer();\n  var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;\n\n  if (rootDoesHavePassiveEffects) {\n    // This commit has passive effects. Stash a reference to them. But don't\n    // schedule a callback until after flushing layout work.\n    rootDoesHavePassiveEffects = false;\n    rootWithPendingPassiveEffects = root;\n    pendingPassiveEffectsExpirationTime = expirationTime;\n    pendingPassiveEffectsRenderPriority = renderPriorityLevel;\n  } else {\n    // We are done with the effect chain at this point so let's clear the\n    // nextEffect pointers to assist with GC. If we have passive effects, we'll\n    // clear this in flushPassiveEffects.\n    nextEffect = firstEffect;\n\n    while (nextEffect !== null) {\n      var nextNextEffect = nextEffect.nextEffect;\n      nextEffect.nextEffect = null;\n      nextEffect = nextNextEffect;\n    }\n  } // Check if there's remaining work on this root\n\n\n  var remainingExpirationTime = root.firstPendingTime;\n\n  if (remainingExpirationTime !== NoWork) {\n    {\n      if (spawnedWorkDuringRender !== null) {\n        var expirationTimes = spawnedWorkDuringRender;\n        spawnedWorkDuringRender = null;\n\n        for (var i = 0; i < expirationTimes.length; i++) {\n          scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions);\n        }\n      }\n\n      schedulePendingInteractions(root, remainingExpirationTime);\n    }\n  } else {\n    // If there's no remaining work, we can clear the set of already failed\n    // error boundaries.\n    legacyErrorBoundariesThatAlreadyFailed = null;\n  }\n\n  {\n    if (!rootDidHavePassiveEffects) {\n      // If there are no passive effects, then we can complete the pending interactions.\n      // Otherwise, we'll wait until after the passive effects are flushed.\n      // Wait to do this until after remaining work has been scheduled,\n      // so that we don't prematurely signal complete for interactions when there's e.g. hidden work.\n      finishPendingInteractions(root, expirationTime);\n    }\n  }\n\n  if (remainingExpirationTime === Sync) {\n    // Count the number of times the root synchronously re-renders without\n    // finishing. If there are too many, it indicates an infinite update loop.\n    if (root === rootWithNestedUpdates) {\n      nestedUpdateCount++;\n    } else {\n      nestedUpdateCount = 0;\n      rootWithNestedUpdates = root;\n    }\n  } else {\n    nestedUpdateCount = 0;\n  }\n\n  onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any\n  // additional work on this root is scheduled.\n\n  ensureRootIsScheduled(root);\n\n  if (hasUncaughtError) {\n    hasUncaughtError = false;\n    var _error3 = firstUncaughtError;\n    firstUncaughtError = null;\n    throw _error3;\n  }\n\n  if ((executionContext & LegacyUnbatchedContext) !== NoContext) {\n    // This is a legacy edge case. We just committed the initial mount of\n    // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired\n    // synchronously, but layout updates should be deferred until the end\n    // of the batch.\n    return null;\n  } // If layout work was scheduled, flush it now.\n\n\n  flushSyncCallbackQueue();\n  return null;\n}\n\nfunction commitBeforeMutationEffects() {\n  while (nextEffect !== null) {\n    var effectTag = nextEffect.effectTag;\n\n    if ((effectTag & Snapshot) !== NoEffect) {\n      setCurrentFiber(nextEffect);\n      recordEffect();\n      var current = nextEffect.alternate;\n      commitBeforeMutationLifeCycles(current, nextEffect);\n      resetCurrentFiber();\n    }\n\n    if ((effectTag & Passive) !== NoEffect) {\n      // If there are passive effects, schedule a callback to flush at\n      // the earliest opportunity.\n      if (!rootDoesHavePassiveEffects) {\n        rootDoesHavePassiveEffects = true;\n        scheduleCallback(NormalPriority, function () {\n          flushPassiveEffects();\n          return null;\n        });\n      }\n    }\n\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction commitMutationEffects(root, renderPriorityLevel) {\n  // TODO: Should probably move the bulk of this function to commitWork.\n  while (nextEffect !== null) {\n    setCurrentFiber(nextEffect);\n    var effectTag = nextEffect.effectTag;\n\n    if (effectTag & ContentReset) {\n      commitResetTextContent(nextEffect);\n    }\n\n    if (effectTag & Ref) {\n      var current = nextEffect.alternate;\n\n      if (current !== null) {\n        commitDetachRef(current);\n      }\n    } // The following switch statement is only concerned about placement,\n    // updates, and deletions. To avoid needing to add a case for every possible\n    // bitmap value, we remove the secondary effects from the effect tag and\n    // switch on that value.\n\n\n    var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating);\n\n    switch (primaryEffectTag) {\n      case Placement:\n        {\n          commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n          // inserted, before any life-cycles like componentDidMount gets called.\n          // TODO: findDOMNode doesn't rely on this any more but isMounted does\n          // and isMounted is deprecated anyway so we should be able to kill this.\n\n          nextEffect.effectTag &= ~Placement;\n          break;\n        }\n\n      case PlacementAndUpdate:\n        {\n          // Placement\n          commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n          // inserted, before any life-cycles like componentDidMount gets called.\n\n          nextEffect.effectTag &= ~Placement; // Update\n\n          var _current = nextEffect.alternate;\n          commitWork(_current, nextEffect);\n          break;\n        }\n\n      case Hydrating:\n        {\n          nextEffect.effectTag &= ~Hydrating;\n          break;\n        }\n\n      case HydratingAndUpdate:\n        {\n          nextEffect.effectTag &= ~Hydrating; // Update\n\n          var _current2 = nextEffect.alternate;\n          commitWork(_current2, nextEffect);\n          break;\n        }\n\n      case Update:\n        {\n          var _current3 = nextEffect.alternate;\n          commitWork(_current3, nextEffect);\n          break;\n        }\n\n      case Deletion:\n        {\n          commitDeletion(root, nextEffect, renderPriorityLevel);\n          break;\n        }\n    } // TODO: Only record a mutation effect if primaryEffectTag is non-zero.\n\n\n    recordEffect();\n    resetCurrentFiber();\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction commitLayoutEffects(root, committedExpirationTime) {\n  // TODO: Should probably move the bulk of this function to commitWork.\n  while (nextEffect !== null) {\n    setCurrentFiber(nextEffect);\n    var effectTag = nextEffect.effectTag;\n\n    if (effectTag & (Update | Callback)) {\n      recordEffect();\n      var current = nextEffect.alternate;\n      commitLifeCycles(root, current, nextEffect);\n    }\n\n    if (effectTag & Ref) {\n      recordEffect();\n      commitAttachRef(nextEffect);\n    }\n\n    resetCurrentFiber();\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction flushPassiveEffects() {\n  if (pendingPassiveEffectsRenderPriority !== NoPriority) {\n    var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority;\n    pendingPassiveEffectsRenderPriority = NoPriority;\n    return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl);\n  }\n}\n\nfunction flushPassiveEffectsImpl() {\n  if (rootWithPendingPassiveEffects === null) {\n    return false;\n  }\n\n  var root = rootWithPendingPassiveEffects;\n  var expirationTime = pendingPassiveEffectsExpirationTime;\n  rootWithPendingPassiveEffects = null;\n  pendingPassiveEffectsExpirationTime = NoWork;\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Cannot flush passive effects while already rendering.\" );\n    }\n  }\n\n  var prevExecutionContext = executionContext;\n  executionContext |= CommitContext;\n  var prevInteractions = pushInteractions(root);\n\n  {\n    // Note: This currently assumes there are no passive effects on the root fiber\n    // because the root is not part of its own effect list.\n    // This could change in the future.\n    var _effect2 = root.current.firstEffect;\n\n    while (_effect2 !== null) {\n      {\n        setCurrentFiber(_effect2);\n        invokeGuardedCallback(null, commitPassiveHookEffects, null, _effect2);\n\n        if (hasCaughtError()) {\n          if (!(_effect2 !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error5 = clearCaughtError();\n\n          captureCommitPhaseError(_effect2, _error5);\n        }\n\n        resetCurrentFiber();\n      }\n\n      var nextNextEffect = _effect2.nextEffect; // Remove nextEffect pointer to assist GC\n\n      _effect2.nextEffect = null;\n      _effect2 = nextNextEffect;\n    }\n  }\n\n  {\n    popInteractions(prevInteractions);\n    finishPendingInteractions(root, expirationTime);\n  }\n\n  executionContext = prevExecutionContext;\n  flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this\n  // exceeds the limit, we'll fire a warning.\n\n  nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1;\n  return true;\n}\n\nfunction isAlreadyFailedLegacyErrorBoundary(instance) {\n  return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);\n}\nfunction markLegacyErrorBoundaryAsFailed(instance) {\n  if (legacyErrorBoundariesThatAlreadyFailed === null) {\n    legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);\n  } else {\n    legacyErrorBoundariesThatAlreadyFailed.add(instance);\n  }\n}\n\nfunction prepareToThrowUncaughtError(error) {\n  if (!hasUncaughtError) {\n    hasUncaughtError = true;\n    firstUncaughtError = error;\n  }\n}\n\nvar onUncaughtError = prepareToThrowUncaughtError;\n\nfunction captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n  var errorInfo = createCapturedValue(error, sourceFiber);\n  var update = createRootErrorUpdate(rootFiber, errorInfo, Sync);\n  enqueueUpdate(rootFiber, update);\n  var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync);\n\n  if (root !== null) {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, Sync);\n  }\n}\n\nfunction captureCommitPhaseError(sourceFiber, error) {\n  if (sourceFiber.tag === HostRoot) {\n    // Error was thrown at the root. There is no parent, so the root\n    // itself should capture it.\n    captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n    return;\n  }\n\n  var fiber = sourceFiber.return;\n\n  while (fiber !== null) {\n    if (fiber.tag === HostRoot) {\n      captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);\n      return;\n    } else if (fiber.tag === ClassComponent) {\n      var ctor = fiber.type;\n      var instance = fiber.stateNode;\n\n      if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {\n        var errorInfo = createCapturedValue(error, sourceFiber);\n        var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync\n        Sync);\n        enqueueUpdate(fiber, update);\n        var root = markUpdateTimeFromFiberToRoot(fiber, Sync);\n\n        if (root !== null) {\n          ensureRootIsScheduled(root);\n          schedulePendingInteractions(root, Sync);\n        }\n\n        return;\n      }\n    }\n\n    fiber = fiber.return;\n  }\n}\nfunction pingSuspendedRoot(root, thenable, suspendedTime) {\n  var pingCache = root.pingCache;\n\n  if (pingCache !== null) {\n    // The thenable resolved, so we no longer need to memoize, because it will\n    // never be thrown again.\n    pingCache.delete(thenable);\n  }\n\n  if (workInProgressRoot === root && renderExpirationTime$1 === suspendedTime) {\n    // Received a ping at the same priority level at which we're currently\n    // rendering. We might want to restart this render. This should mirror\n    // the logic of whether or not a root suspends once it completes.\n    // TODO: If we're rendering sync either due to Sync, Batched or expired,\n    // we should probably never restart.\n    // If we're suspended with delay, we'll always suspend so we can always\n    // restart. If we're suspended without any updates, it might be a retry.\n    // If it's early in the retry we can restart. We can't know for sure\n    // whether we'll eventually process an update during this render pass,\n    // but it's somewhat unlikely that we get to a ping before that, since\n    // getting to the root most update is usually very fast.\n    if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {\n      // Restart from the root. Don't need to schedule a ping because\n      // we're already working on this tree.\n      prepareFreshStack(root, renderExpirationTime$1);\n    } else {\n      // Even though we can't restart right now, we might get an\n      // opportunity later. So we mark this render as having a ping.\n      workInProgressRootHasPendingPing = true;\n    }\n\n    return;\n  }\n\n  if (!isRootSuspendedAtTime(root, suspendedTime)) {\n    // The root is no longer suspended at this time.\n    return;\n  }\n\n  var lastPingedTime = root.lastPingedTime;\n\n  if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) {\n    // There's already a lower priority ping scheduled.\n    return;\n  } // Mark the time at which this ping was scheduled.\n\n\n  root.lastPingedTime = suspendedTime;\n\n  ensureRootIsScheduled(root);\n  schedulePendingInteractions(root, suspendedTime);\n}\n\nfunction retryTimedOutBoundary(boundaryFiber, retryTime) {\n  // The boundary fiber (a Suspense component or SuspenseList component)\n  // previously was rendered in its fallback state. One of the promises that\n  // suspended it has resolved, which means at least part of the tree was\n  // likely unblocked. Try rendering again, at a new expiration time.\n  if (retryTime === NoWork) {\n    var suspenseConfig = null; // Retries don't carry over the already committed update.\n\n    var currentTime = requestCurrentTimeForUpdate();\n    retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig);\n  } // TODO: Special case idle priority?\n\n\n  var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime);\n\n  if (root !== null) {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, retryTime);\n  }\n}\nfunction resolveRetryThenable(boundaryFiber, thenable) {\n  var retryTime = NoWork; // Default\n\n  var retryCache;\n\n  {\n    retryCache = boundaryFiber.stateNode;\n  }\n\n  if (retryCache !== null) {\n    // The thenable resolved, so we no longer need to memoize, because it will\n    // never be thrown again.\n    retryCache.delete(thenable);\n  }\n\n  retryTimedOutBoundary(boundaryFiber, retryTime);\n} // Computes the next Just Noticeable Difference (JND) boundary.\n// The theory is that a person can't tell the difference between small differences in time.\n// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable\n// difference in the experience. However, waiting for longer might mean that we can avoid\n// showing an intermediate loading state. The longer we have already waited, the harder it\n// is to tell small differences in time. Therefore, the longer we've already waited,\n// the longer we can wait additionally. At some point we have to give up though.\n// We pick a train model where the next boundary commits at a consistent schedule.\n// These particular numbers are vague estimates. We expect to adjust them based on research.\n\nfunction jnd(timeElapsed) {\n  return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;\n}\n\nfunction computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) {\n  var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0;\n\n  if (busyMinDurationMs <= 0) {\n    return 0;\n  }\n\n  var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire.\n\n  var currentTimeMs = now();\n  var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig);\n  var timeElapsed = currentTimeMs - eventTimeMs;\n\n  if (timeElapsed <= busyDelayMs) {\n    // If we haven't yet waited longer than the initial delay, we don't\n    // have to wait any additional time.\n    return 0;\n  }\n\n  var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`.\n\n  return msUntilTimeout;\n}\n\nfunction checkForNestedUpdates() {\n  if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {\n    nestedUpdateCount = 0;\n    rootWithNestedUpdates = null;\n\n    {\n      {\n        throw Error( \"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.\" );\n      }\n    }\n  }\n\n  {\n    if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {\n      nestedPassiveUpdateCount = 0;\n\n      error('Maximum update depth exceeded. This can happen when a component ' + \"calls setState inside useEffect, but useEffect either doesn't \" + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');\n    }\n  }\n}\n\nfunction flushRenderPhaseStrictModeWarningsInDEV() {\n  {\n    ReactStrictModeWarnings.flushLegacyContextWarning();\n\n    {\n      ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();\n    }\n  }\n}\n\nfunction stopFinishedWorkLoopTimer() {\n  var didCompleteRoot = true;\n  stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n  interruptedBy = null;\n}\n\nfunction stopInterruptedWorkLoopTimer() {\n  // TODO: Track which fiber caused the interruption.\n  var didCompleteRoot = false;\n  stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n  interruptedBy = null;\n}\n\nfunction checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) {\n  if ( workInProgressRoot !== null && updateExpirationTime > renderExpirationTime$1) {\n    interruptedBy = fiberThatReceivedUpdate;\n  }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = null;\n\nfunction warnAboutUpdateOnUnmountedFiberInDEV(fiber) {\n  {\n    var tag = fiber.tag;\n\n    if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) {\n      // Only warn for user-defined components, not internal ones like Suspense.\n      return;\n    }\n    // the problematic code almost always lies inside that component.\n\n\n    var componentName = getComponentName(fiber.type) || 'ReactComponent';\n\n    if (didWarnStateUpdateForUnmountedComponent !== null) {\n      if (didWarnStateUpdateForUnmountedComponent.has(componentName)) {\n        return;\n      }\n\n      didWarnStateUpdateForUnmountedComponent.add(componentName);\n    } else {\n      didWarnStateUpdateForUnmountedComponent = new Set([componentName]);\n    }\n\n    error(\"Can't perform a React state update on an unmounted component. This \" + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));\n  }\n}\n\nvar beginWork$1;\n\n{\n  var dummyFiber = null;\n\n  beginWork$1 = function (current, unitOfWork, expirationTime) {\n    // If a component throws an error, we replay it again in a synchronously\n    // dispatched event, so that the debugger will treat it as an uncaught\n    // error See ReactErrorUtils for more information.\n    // Before entering the begin phase, copy the work-in-progress onto a dummy\n    // fiber. If beginWork throws, we'll use this to reset the state.\n    var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);\n\n    try {\n      return beginWork(current, unitOfWork, expirationTime);\n    } catch (originalError) {\n      if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {\n        // Don't replay promises. Treat everything else like an error.\n        throw originalError;\n      } // Keep this code in sync with handleError; any changes here must have\n      // corresponding changes there.\n\n\n      resetContextDependencies();\n      resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the\n      // same fiber again.\n      // Unwind the failed stack frame\n\n      unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber.\n\n      assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);\n\n      if ( unitOfWork.mode & ProfileMode) {\n        // Reset the profiler timer.\n        startProfilerTimer(unitOfWork);\n      } // Run beginWork again.\n\n\n      invokeGuardedCallback(null, beginWork, null, current, unitOfWork, expirationTime);\n\n      if (hasCaughtError()) {\n        var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.\n        // Rethrow this error instead of the original one.\n\n        throw replayError;\n      } else {\n        // This branch is reachable if the render phase is impure.\n        throw originalError;\n      }\n    }\n  };\n}\n\nvar didWarnAboutUpdateInRender = false;\nvar didWarnAboutUpdateInRenderForAnotherComponent;\n\n{\n  didWarnAboutUpdateInRenderForAnotherComponent = new Set();\n}\n\nfunction warnAboutRenderPhaseUpdatesInDEV(fiber) {\n  {\n    if (isRendering && (executionContext & RenderContext) !== NoContext) {\n      switch (fiber.tag) {\n        case FunctionComponent:\n        case ForwardRef:\n        case SimpleMemoComponent:\n          {\n            var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.\n\n            var dedupeKey = renderingComponentName;\n\n            if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {\n              didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);\n              var setStateComponentName = getComponentName(fiber.type) || 'Unknown';\n\n              error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://fb.me/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);\n            }\n\n            break;\n          }\n\n        case ClassComponent:\n          {\n            if (!didWarnAboutUpdateInRender) {\n              error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');\n\n              didWarnAboutUpdateInRender = true;\n            }\n\n            break;\n          }\n      }\n    }\n  }\n} // a 'shared' variable that changes when act() opens/closes in tests.\n\n\nvar IsThisRendererActing = {\n  current: false\n};\nfunction warnIfNotScopedWithMatchingAct(fiber) {\n  {\n    if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) {\n      error(\"It looks like you're using the wrong act() around your test interactions.\\n\" + 'Be sure to use the matching version of act() corresponding to your renderer:\\n\\n' + '// for react-dom:\\n' + \"import {act} from 'react-dom/test-utils';\\n\" + '// ...\\n' + 'act(() => ...);\\n\\n' + '// for react-test-renderer:\\n' + \"import TestRenderer from 'react-test-renderer';\\n\" + 'const {act} = TestRenderer;\\n' + '// ...\\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\nfunction warnIfNotCurrentlyActingEffectsInDEV(fiber) {\n  {\n    if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n      error('An update to %s ran an effect, but was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\n\nfunction warnIfNotCurrentlyActingUpdatesInDEV(fiber) {\n  {\n    if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n      error('An update to %s inside a test was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\n\nvar warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler.\n\nvar didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked\n// scheduler is the actual recommendation. The alternative could be a testing build,\n// a new lib, or whatever; we dunno just yet. This message is for early adopters\n// to get their tests right.\n\nfunction warnIfUnmockedScheduler(fiber) {\n  {\n    if (didWarnAboutUnmockedScheduler === false && Scheduler.unstable_flushAllWithoutAsserting === undefined) {\n      if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) {\n        didWarnAboutUnmockedScheduler = true;\n\n        error('In Concurrent or Sync modes, the \"scheduler\" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \\n' + \"jest.mock('scheduler', () => require('scheduler/unstable_mock'));\\n\\n\" + 'For more info, visit https://fb.me/react-mock-scheduler');\n      }\n    }\n  }\n}\n\nfunction computeThreadID(root, expirationTime) {\n  // Interaction threads are unique per root and expiration time.\n  return expirationTime * 1000 + root.interactionThreadID;\n}\n\nfunction markSpawnedWork(expirationTime) {\n\n  if (spawnedWorkDuringRender === null) {\n    spawnedWorkDuringRender = [expirationTime];\n  } else {\n    spawnedWorkDuringRender.push(expirationTime);\n  }\n}\n\nfunction scheduleInteractions(root, expirationTime, interactions) {\n\n  if (interactions.size > 0) {\n    var pendingInteractionMap = root.pendingInteractionMap;\n    var pendingInteractions = pendingInteractionMap.get(expirationTime);\n\n    if (pendingInteractions != null) {\n      interactions.forEach(function (interaction) {\n        if (!pendingInteractions.has(interaction)) {\n          // Update the pending async work count for previously unscheduled interaction.\n          interaction.__count++;\n        }\n\n        pendingInteractions.add(interaction);\n      });\n    } else {\n      pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions.\n\n      interactions.forEach(function (interaction) {\n        interaction.__count++;\n      });\n    }\n\n    var subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null) {\n      var threadID = computeThreadID(root, expirationTime);\n      subscriber.onWorkScheduled(interactions, threadID);\n    }\n  }\n}\n\nfunction schedulePendingInteractions(root, expirationTime) {\n\n  scheduleInteractions(root, expirationTime, tracing.__interactionsRef.current);\n}\n\nfunction startWorkOnPendingInteractions(root, expirationTime) {\n  // we can accurately attribute time spent working on it, And so that cascading\n  // work triggered during the render phase will be associated with it.\n\n\n  var interactions = new Set();\n  root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n    if (scheduledExpirationTime >= expirationTime) {\n      scheduledInteractions.forEach(function (interaction) {\n        return interactions.add(interaction);\n      });\n    }\n  }); // Store the current set of interactions on the FiberRoot for a few reasons:\n  // We can re-use it in hot functions like performConcurrentWorkOnRoot()\n  // without having to recalculate it. We will also use it in commitWork() to\n  // pass to any Profiler onRender() hooks. This also provides DevTools with a\n  // way to access it when the onCommitRoot() hook is called.\n\n  root.memoizedInteractions = interactions;\n\n  if (interactions.size > 0) {\n    var subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null) {\n      var threadID = computeThreadID(root, expirationTime);\n\n      try {\n        subscriber.onWorkStarted(interactions, threadID);\n      } catch (error) {\n        // If the subscriber throws, rethrow it in a separate task\n        scheduleCallback(ImmediatePriority, function () {\n          throw error;\n        });\n      }\n    }\n  }\n}\n\nfunction finishPendingInteractions(root, committedExpirationTime) {\n\n  var earliestRemainingTimeAfterCommit = root.firstPendingTime;\n  var subscriber;\n\n  try {\n    subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null && root.memoizedInteractions.size > 0) {\n      var threadID = computeThreadID(root, committedExpirationTime);\n      subscriber.onWorkStopped(root.memoizedInteractions, threadID);\n    }\n  } catch (error) {\n    // If the subscriber throws, rethrow it in a separate task\n    scheduleCallback(ImmediatePriority, function () {\n      throw error;\n    });\n  } finally {\n    // Clear completed interactions from the pending Map.\n    // Unless the render was suspended or cascading work was scheduled,\n    // In which case– leave pending interactions until the subsequent render.\n    var pendingInteractionMap = root.pendingInteractionMap;\n    pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n      // Only decrement the pending interaction count if we're done.\n      // If there's still work at the current priority,\n      // That indicates that we are waiting for suspense data.\n      if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {\n        pendingInteractionMap.delete(scheduledExpirationTime);\n        scheduledInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber !== null && interaction.__count === 0) {\n            try {\n              subscriber.onInteractionScheduledWorkCompleted(interaction);\n            } catch (error) {\n              // If the subscriber throws, rethrow it in a separate task\n              scheduleCallback(ImmediatePriority, function () {\n                throw error;\n              });\n            }\n          }\n        });\n      }\n    });\n  }\n}\n\nvar onScheduleFiberRoot = null;\nvar onCommitFiberRoot = null;\nvar onCommitFiberUnmount = null;\nvar hasLoggedError = false;\nvar isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';\nfunction injectInternals(internals) {\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n    // No DevTools\n    return false;\n  }\n\n  var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n  if (hook.isDisabled) {\n    // This isn't a real property on the hook, but it can be set to opt out\n    // of DevTools integration and associated warnings and logs.\n    // https://github.com/facebook/react/issues/3877\n    return true;\n  }\n\n  if (!hook.supportsFiber) {\n    {\n      error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');\n    } // DevTools exists, even though it doesn't support Fiber.\n\n\n    return true;\n  }\n\n  try {\n    var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.\n\n    if (true) {\n      // Only used by Fast Refresh\n      if (typeof hook.onScheduleFiberRoot === 'function') {\n        onScheduleFiberRoot = function (root, children) {\n          try {\n            hook.onScheduleFiberRoot(rendererID, root, children);\n          } catch (err) {\n            if ( true && !hasLoggedError) {\n              hasLoggedError = true;\n\n              error('React instrumentation encountered an error: %s', err);\n            }\n          }\n        };\n      }\n    }\n\n    onCommitFiberRoot = function (root, expirationTime) {\n      try {\n        var didError = (root.current.effectTag & DidCapture) === DidCapture;\n\n        if (enableProfilerTimer) {\n          var currentTime = getCurrentTime();\n          var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);\n          hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError);\n        } else {\n          hook.onCommitFiberRoot(rendererID, root, undefined, didError);\n        }\n      } catch (err) {\n        if (true) {\n          if (!hasLoggedError) {\n            hasLoggedError = true;\n\n            error('React instrumentation encountered an error: %s', err);\n          }\n        }\n      }\n    };\n\n    onCommitFiberUnmount = function (fiber) {\n      try {\n        hook.onCommitFiberUnmount(rendererID, fiber);\n      } catch (err) {\n        if (true) {\n          if (!hasLoggedError) {\n            hasLoggedError = true;\n\n            error('React instrumentation encountered an error: %s', err);\n          }\n        }\n      }\n    };\n  } catch (err) {\n    // Catch all errors because it is unsafe to throw during initialization.\n    {\n      error('React instrumentation encountered an error: %s.', err);\n    }\n  } // DevTools exists\n\n\n  return true;\n}\nfunction onScheduleRoot(root, children) {\n  if (typeof onScheduleFiberRoot === 'function') {\n    onScheduleFiberRoot(root, children);\n  }\n}\nfunction onCommitRoot(root, expirationTime) {\n  if (typeof onCommitFiberRoot === 'function') {\n    onCommitFiberRoot(root, expirationTime);\n  }\n}\nfunction onCommitUnmount(fiber) {\n  if (typeof onCommitFiberUnmount === 'function') {\n    onCommitFiberUnmount(fiber);\n  }\n}\n\nvar hasBadMapPolyfill;\n\n{\n  hasBadMapPolyfill = false;\n\n  try {\n    var nonExtensibleObject = Object.preventExtensions({});\n    var testMap = new Map([[nonExtensibleObject, null]]);\n    var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused.\n    // https://github.com/rollup/rollup/issues/1771\n    // TODO: we can remove these if Rollup fixes the bug.\n\n    testMap.set(0, 0);\n    testSet.add(0);\n  } catch (e) {\n    // TODO: Consider warning about bad polyfills\n    hasBadMapPolyfill = true;\n  }\n}\n\nvar debugCounter = 1;\n\nfunction FiberNode(tag, pendingProps, key, mode) {\n  // Instance\n  this.tag = tag;\n  this.key = key;\n  this.elementType = null;\n  this.type = null;\n  this.stateNode = null; // Fiber\n\n  this.return = null;\n  this.child = null;\n  this.sibling = null;\n  this.index = 0;\n  this.ref = null;\n  this.pendingProps = pendingProps;\n  this.memoizedProps = null;\n  this.updateQueue = null;\n  this.memoizedState = null;\n  this.dependencies = null;\n  this.mode = mode; // Effects\n\n  this.effectTag = NoEffect;\n  this.nextEffect = null;\n  this.firstEffect = null;\n  this.lastEffect = null;\n  this.expirationTime = NoWork;\n  this.childExpirationTime = NoWork;\n  this.alternate = null;\n\n  {\n    // Note: The following is done to avoid a v8 performance cliff.\n    //\n    // Initializing the fields below to smis and later updating them with\n    // double values will cause Fibers to end up having separate shapes.\n    // This behavior/bug has something to do with Object.preventExtension().\n    // Fortunately this only impacts DEV builds.\n    // Unfortunately it makes React unusably slow for some applications.\n    // To work around this, initialize the fields below with doubles.\n    //\n    // Learn more about this here:\n    // https://github.com/facebook/react/issues/14365\n    // https://bugs.chromium.org/p/v8/issues/detail?id=8538\n    this.actualDuration = Number.NaN;\n    this.actualStartTime = Number.NaN;\n    this.selfBaseDuration = Number.NaN;\n    this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.\n    // This won't trigger the performance cliff mentioned above,\n    // and it simplifies other profiler code (including DevTools).\n\n    this.actualDuration = 0;\n    this.actualStartTime = -1;\n    this.selfBaseDuration = 0;\n    this.treeBaseDuration = 0;\n  } // This is normally DEV-only except www when it adds listeners.\n  // TODO: remove the User Timing integration in favor of Root Events.\n\n\n  {\n    this._debugID = debugCounter++;\n    this._debugIsCurrentlyTiming = false;\n  }\n\n  {\n    this._debugSource = null;\n    this._debugOwner = null;\n    this._debugNeedsRemount = false;\n    this._debugHookTypes = null;\n\n    if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {\n      Object.preventExtensions(this);\n    }\n  }\n} // This is a constructor function, rather than a POJO constructor, still\n// please ensure we do the following:\n// 1) Nobody should add any instance methods on this. Instance methods can be\n//    more difficult to predict when they get optimized and they are almost\n//    never inlined properly in static compilers.\n// 2) Nobody should rely on `instanceof Fiber` for type testing. We should\n//    always know when it is a fiber.\n// 3) We might want to experiment with using numeric keys since they are easier\n//    to optimize in a non-JIT environment.\n// 4) We can easily go from a constructor to a createFiber object literal if that\n//    is faster.\n// 5) It should be easy to port this to a C struct and keep a C implementation\n//    compatible.\n\n\nvar createFiber = function (tag, pendingProps, key, mode) {\n  // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors\n  return new FiberNode(tag, pendingProps, key, mode);\n};\n\nfunction shouldConstruct(Component) {\n  var prototype = Component.prototype;\n  return !!(prototype && prototype.isReactComponent);\n}\n\nfunction isSimpleFunctionComponent(type) {\n  return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;\n}\nfunction resolveLazyComponentTag(Component) {\n  if (typeof Component === 'function') {\n    return shouldConstruct(Component) ? ClassComponent : FunctionComponent;\n  } else if (Component !== undefined && Component !== null) {\n    var $$typeof = Component.$$typeof;\n\n    if ($$typeof === REACT_FORWARD_REF_TYPE) {\n      return ForwardRef;\n    }\n\n    if ($$typeof === REACT_MEMO_TYPE) {\n      return MemoComponent;\n    }\n  }\n\n  return IndeterminateComponent;\n} // This is used to create an alternate fiber to do work on.\n\nfunction createWorkInProgress(current, pendingProps) {\n  var workInProgress = current.alternate;\n\n  if (workInProgress === null) {\n    // We use a double buffering pooling technique because we know that we'll\n    // only ever need at most two versions of a tree. We pool the \"other\" unused\n    // node that we're free to reuse. This is lazily created to avoid allocating\n    // extra objects for things that are never updated. It also allow us to\n    // reclaim the extra memory if needed.\n    workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);\n    workInProgress.elementType = current.elementType;\n    workInProgress.type = current.type;\n    workInProgress.stateNode = current.stateNode;\n\n    {\n      // DEV-only fields\n      {\n        workInProgress._debugID = current._debugID;\n      }\n\n      workInProgress._debugSource = current._debugSource;\n      workInProgress._debugOwner = current._debugOwner;\n      workInProgress._debugHookTypes = current._debugHookTypes;\n    }\n\n    workInProgress.alternate = current;\n    current.alternate = workInProgress;\n  } else {\n    workInProgress.pendingProps = pendingProps; // We already have an alternate.\n    // Reset the effect tag.\n\n    workInProgress.effectTag = NoEffect; // The effect list is no longer valid.\n\n    workInProgress.nextEffect = null;\n    workInProgress.firstEffect = null;\n    workInProgress.lastEffect = null;\n\n    {\n      // We intentionally reset, rather than copy, actualDuration & actualStartTime.\n      // This prevents time from endlessly accumulating in new commits.\n      // This has the downside of resetting values for different priority renders,\n      // But works for yielding (the common case) and should support resuming.\n      workInProgress.actualDuration = 0;\n      workInProgress.actualStartTime = -1;\n    }\n  }\n\n  workInProgress.childExpirationTime = current.childExpirationTime;\n  workInProgress.expirationTime = current.expirationTime;\n  workInProgress.child = current.child;\n  workInProgress.memoizedProps = current.memoizedProps;\n  workInProgress.memoizedState = current.memoizedState;\n  workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n  // it cannot be shared with the current fiber.\n\n  var currentDependencies = current.dependencies;\n  workInProgress.dependencies = currentDependencies === null ? null : {\n    expirationTime: currentDependencies.expirationTime,\n    firstContext: currentDependencies.firstContext,\n    responders: currentDependencies.responders\n  }; // These will be overridden during the parent's reconciliation\n\n  workInProgress.sibling = current.sibling;\n  workInProgress.index = current.index;\n  workInProgress.ref = current.ref;\n\n  {\n    workInProgress.selfBaseDuration = current.selfBaseDuration;\n    workInProgress.treeBaseDuration = current.treeBaseDuration;\n  }\n\n  {\n    workInProgress._debugNeedsRemount = current._debugNeedsRemount;\n\n    switch (workInProgress.tag) {\n      case IndeterminateComponent:\n      case FunctionComponent:\n      case SimpleMemoComponent:\n        workInProgress.type = resolveFunctionForHotReloading(current.type);\n        break;\n\n      case ClassComponent:\n        workInProgress.type = resolveClassForHotReloading(current.type);\n        break;\n\n      case ForwardRef:\n        workInProgress.type = resolveForwardRefForHotReloading(current.type);\n        break;\n    }\n  }\n\n  return workInProgress;\n} // Used to reuse a Fiber for a second pass.\n\nfunction resetWorkInProgress(workInProgress, renderExpirationTime) {\n  // This resets the Fiber to what createFiber or createWorkInProgress would\n  // have set the values to before during the first pass. Ideally this wouldn't\n  // be necessary but unfortunately many code paths reads from the workInProgress\n  // when they should be reading from current and writing to workInProgress.\n  // We assume pendingProps, index, key, ref, return are still untouched to\n  // avoid doing another reconciliation.\n  // Reset the effect tag but keep any Placement tags, since that's something\n  // that child fiber is setting, not the reconciliation.\n  workInProgress.effectTag &= Placement; // The effect list is no longer valid.\n\n  workInProgress.nextEffect = null;\n  workInProgress.firstEffect = null;\n  workInProgress.lastEffect = null;\n  var current = workInProgress.alternate;\n\n  if (current === null) {\n    // Reset to createFiber's initial values.\n    workInProgress.childExpirationTime = NoWork;\n    workInProgress.expirationTime = renderExpirationTime;\n    workInProgress.child = null;\n    workInProgress.memoizedProps = null;\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null;\n    workInProgress.dependencies = null;\n\n    {\n      // Note: We don't reset the actualTime counts. It's useful to accumulate\n      // actual time across multiple render passes.\n      workInProgress.selfBaseDuration = 0;\n      workInProgress.treeBaseDuration = 0;\n    }\n  } else {\n    // Reset to the cloned values that createWorkInProgress would've.\n    workInProgress.childExpirationTime = current.childExpirationTime;\n    workInProgress.expirationTime = current.expirationTime;\n    workInProgress.child = current.child;\n    workInProgress.memoizedProps = current.memoizedProps;\n    workInProgress.memoizedState = current.memoizedState;\n    workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n    // it cannot be shared with the current fiber.\n\n    var currentDependencies = current.dependencies;\n    workInProgress.dependencies = currentDependencies === null ? null : {\n      expirationTime: currentDependencies.expirationTime,\n      firstContext: currentDependencies.firstContext,\n      responders: currentDependencies.responders\n    };\n\n    {\n      // Note: We don't reset the actualTime counts. It's useful to accumulate\n      // actual time across multiple render passes.\n      workInProgress.selfBaseDuration = current.selfBaseDuration;\n      workInProgress.treeBaseDuration = current.treeBaseDuration;\n    }\n  }\n\n  return workInProgress;\n}\nfunction createHostRootFiber(tag) {\n  var mode;\n\n  if (tag === ConcurrentRoot) {\n    mode = ConcurrentMode | BlockingMode | StrictMode;\n  } else if (tag === BlockingRoot) {\n    mode = BlockingMode | StrictMode;\n  } else {\n    mode = NoMode;\n  }\n\n  if ( isDevToolsPresent) {\n    // Always collect profile timings when DevTools are present.\n    // This enables DevTools to start capturing timing at any point–\n    // Without some nodes in the tree having empty base times.\n    mode |= ProfileMode;\n  }\n\n  return createFiber(HostRoot, null, null, mode);\n}\nfunction createFiberFromTypeAndProps(type, // React$ElementType\nkey, pendingProps, owner, mode, expirationTime) {\n  var fiber;\n  var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.\n\n  var resolvedType = type;\n\n  if (typeof type === 'function') {\n    if (shouldConstruct(type)) {\n      fiberTag = ClassComponent;\n\n      {\n        resolvedType = resolveClassForHotReloading(resolvedType);\n      }\n    } else {\n      {\n        resolvedType = resolveFunctionForHotReloading(resolvedType);\n      }\n    }\n  } else if (typeof type === 'string') {\n    fiberTag = HostComponent;\n  } else {\n    getTag: switch (type) {\n      case REACT_FRAGMENT_TYPE:\n        return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);\n\n      case REACT_CONCURRENT_MODE_TYPE:\n        fiberTag = Mode;\n        mode |= ConcurrentMode | BlockingMode | StrictMode;\n        break;\n\n      case REACT_STRICT_MODE_TYPE:\n        fiberTag = Mode;\n        mode |= StrictMode;\n        break;\n\n      case REACT_PROFILER_TYPE:\n        return createFiberFromProfiler(pendingProps, mode, expirationTime, key);\n\n      case REACT_SUSPENSE_TYPE:\n        return createFiberFromSuspense(pendingProps, mode, expirationTime, key);\n\n      case REACT_SUSPENSE_LIST_TYPE:\n        return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key);\n\n      default:\n        {\n          if (typeof type === 'object' && type !== null) {\n            switch (type.$$typeof) {\n              case REACT_PROVIDER_TYPE:\n                fiberTag = ContextProvider;\n                break getTag;\n\n              case REACT_CONTEXT_TYPE:\n                // This is a consumer\n                fiberTag = ContextConsumer;\n                break getTag;\n\n              case REACT_FORWARD_REF_TYPE:\n                fiberTag = ForwardRef;\n\n                {\n                  resolvedType = resolveForwardRefForHotReloading(resolvedType);\n                }\n\n                break getTag;\n\n              case REACT_MEMO_TYPE:\n                fiberTag = MemoComponent;\n                break getTag;\n\n              case REACT_LAZY_TYPE:\n                fiberTag = LazyComponent;\n                resolvedType = null;\n                break getTag;\n\n              case REACT_BLOCK_TYPE:\n                fiberTag = Block;\n                break getTag;\n\n            }\n          }\n\n          var info = '';\n\n          {\n            if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n              info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and \" + 'named imports.';\n            }\n\n            var ownerName = owner ? getComponentName(owner.type) : null;\n\n            if (ownerName) {\n              info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n            }\n          }\n\n          {\n            {\n              throw Error( \"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: \" + (type == null ? type : typeof type) + \".\" + info );\n            }\n          }\n        }\n    }\n  }\n\n  fiber = createFiber(fiberTag, pendingProps, key, mode);\n  fiber.elementType = type;\n  fiber.type = resolvedType;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromElement(element, mode, expirationTime) {\n  var owner = null;\n\n  {\n    owner = element._owner;\n  }\n\n  var type = element.type;\n  var key = element.key;\n  var pendingProps = element.props;\n  var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);\n\n  {\n    fiber._debugSource = element._source;\n    fiber._debugOwner = element._owner;\n  }\n\n  return fiber;\n}\nfunction createFiberFromFragment(elements, mode, expirationTime, key) {\n  var fiber = createFiber(Fragment, elements, key, mode);\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\n\nfunction createFiberFromProfiler(pendingProps, mode, expirationTime, key) {\n  {\n    if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {\n      error('Profiler must specify an \"id\" string and \"onRender\" function as props');\n    }\n  }\n\n  var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag.\n\n  fiber.elementType = REACT_PROFILER_TYPE;\n  fiber.type = REACT_PROFILER_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\n\nfunction createFiberFromSuspense(pendingProps, mode, expirationTime, key) {\n  var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.\n  // This needs to be fixed in getComponentName so that it relies on the tag\n  // instead.\n\n  fiber.type = REACT_SUSPENSE_TYPE;\n  fiber.elementType = REACT_SUSPENSE_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) {\n  var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);\n\n  {\n    // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag.\n    // This needs to be fixed in getComponentName so that it relies on the tag\n    // instead.\n    fiber.type = REACT_SUSPENSE_LIST_TYPE;\n  }\n\n  fiber.elementType = REACT_SUSPENSE_LIST_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromText(content, mode, expirationTime) {\n  var fiber = createFiber(HostText, content, null, mode);\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromHostInstanceForDeletion() {\n  var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type.\n\n  fiber.elementType = 'DELETED';\n  fiber.type = 'DELETED';\n  return fiber;\n}\nfunction createFiberFromPortal(portal, mode, expirationTime) {\n  var pendingProps = portal.children !== null ? portal.children : [];\n  var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);\n  fiber.expirationTime = expirationTime;\n  fiber.stateNode = {\n    containerInfo: portal.containerInfo,\n    pendingChildren: null,\n    // Used by persistent updates\n    implementation: portal.implementation\n  };\n  return fiber;\n} // Used for stashing WIP properties to replay failed work in DEV.\n\nfunction assignFiberPropertiesInDEV(target, source) {\n  if (target === null) {\n    // This Fiber's initial properties will always be overwritten.\n    // We only use a Fiber to ensure the same hidden class so DEV isn't slow.\n    target = createFiber(IndeterminateComponent, null, null, NoMode);\n  } // This is intentionally written as a list of all properties.\n  // We tried to use Object.assign() instead but this is called in\n  // the hottest path, and Object.assign() was too slow:\n  // https://github.com/facebook/react/issues/12502\n  // This code is DEV-only so size is not a concern.\n\n\n  target.tag = source.tag;\n  target.key = source.key;\n  target.elementType = source.elementType;\n  target.type = source.type;\n  target.stateNode = source.stateNode;\n  target.return = source.return;\n  target.child = source.child;\n  target.sibling = source.sibling;\n  target.index = source.index;\n  target.ref = source.ref;\n  target.pendingProps = source.pendingProps;\n  target.memoizedProps = source.memoizedProps;\n  target.updateQueue = source.updateQueue;\n  target.memoizedState = source.memoizedState;\n  target.dependencies = source.dependencies;\n  target.mode = source.mode;\n  target.effectTag = source.effectTag;\n  target.nextEffect = source.nextEffect;\n  target.firstEffect = source.firstEffect;\n  target.lastEffect = source.lastEffect;\n  target.expirationTime = source.expirationTime;\n  target.childExpirationTime = source.childExpirationTime;\n  target.alternate = source.alternate;\n\n  {\n    target.actualDuration = source.actualDuration;\n    target.actualStartTime = source.actualStartTime;\n    target.selfBaseDuration = source.selfBaseDuration;\n    target.treeBaseDuration = source.treeBaseDuration;\n  }\n\n  {\n    target._debugID = source._debugID;\n  }\n\n  target._debugSource = source._debugSource;\n  target._debugOwner = source._debugOwner;\n  target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;\n  target._debugNeedsRemount = source._debugNeedsRemount;\n  target._debugHookTypes = source._debugHookTypes;\n  return target;\n}\n\nfunction FiberRootNode(containerInfo, tag, hydrate) {\n  this.tag = tag;\n  this.current = null;\n  this.containerInfo = containerInfo;\n  this.pendingChildren = null;\n  this.pingCache = null;\n  this.finishedExpirationTime = NoWork;\n  this.finishedWork = null;\n  this.timeoutHandle = noTimeout;\n  this.context = null;\n  this.pendingContext = null;\n  this.hydrate = hydrate;\n  this.callbackNode = null;\n  this.callbackPriority = NoPriority;\n  this.firstPendingTime = NoWork;\n  this.firstSuspendedTime = NoWork;\n  this.lastSuspendedTime = NoWork;\n  this.nextKnownPendingLevel = NoWork;\n  this.lastPingedTime = NoWork;\n  this.lastExpiredTime = NoWork;\n\n  {\n    this.interactionThreadID = tracing.unstable_getThreadID();\n    this.memoizedInteractions = new Set();\n    this.pendingInteractionMap = new Map();\n  }\n}\n\nfunction createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {\n  var root = new FiberRootNode(containerInfo, tag, hydrate);\n  // stateNode is any.\n\n\n  var uninitializedFiber = createHostRootFiber(tag);\n  root.current = uninitializedFiber;\n  uninitializedFiber.stateNode = root;\n  initializeUpdateQueue(uninitializedFiber);\n  return root;\n}\nfunction isRootSuspendedAtTime(root, expirationTime) {\n  var firstSuspendedTime = root.firstSuspendedTime;\n  var lastSuspendedTime = root.lastSuspendedTime;\n  return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime;\n}\nfunction markRootSuspendedAtTime(root, expirationTime) {\n  var firstSuspendedTime = root.firstSuspendedTime;\n  var lastSuspendedTime = root.lastSuspendedTime;\n\n  if (firstSuspendedTime < expirationTime) {\n    root.firstSuspendedTime = expirationTime;\n  }\n\n  if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) {\n    root.lastSuspendedTime = expirationTime;\n  }\n\n  if (expirationTime <= root.lastPingedTime) {\n    root.lastPingedTime = NoWork;\n  }\n\n  if (expirationTime <= root.lastExpiredTime) {\n    root.lastExpiredTime = NoWork;\n  }\n}\nfunction markRootUpdatedAtTime(root, expirationTime) {\n  // Update the range of pending times\n  var firstPendingTime = root.firstPendingTime;\n\n  if (expirationTime > firstPendingTime) {\n    root.firstPendingTime = expirationTime;\n  } // Update the range of suspended times. Treat everything lower priority or\n  // equal to this update as unsuspended.\n\n\n  var firstSuspendedTime = root.firstSuspendedTime;\n\n  if (firstSuspendedTime !== NoWork) {\n    if (expirationTime >= firstSuspendedTime) {\n      // The entire suspended range is now unsuspended.\n      root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n    } else if (expirationTime >= root.lastSuspendedTime) {\n      root.lastSuspendedTime = expirationTime + 1;\n    } // This is a pending level. Check if it's higher priority than the next\n    // known pending level.\n\n\n    if (expirationTime > root.nextKnownPendingLevel) {\n      root.nextKnownPendingLevel = expirationTime;\n    }\n  }\n}\nfunction markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) {\n  // Update the range of pending times\n  root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or\n  // equal to this update as unsuspended.\n\n  if (finishedExpirationTime <= root.lastSuspendedTime) {\n    // The entire suspended range is now unsuspended.\n    root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n  } else if (finishedExpirationTime <= root.firstSuspendedTime) {\n    // Part of the suspended range is now unsuspended. Narrow the range to\n    // include everything between the unsuspended time (non-inclusive) and the\n    // last suspended time.\n    root.firstSuspendedTime = finishedExpirationTime - 1;\n  }\n\n  if (finishedExpirationTime <= root.lastPingedTime) {\n    // Clear the pinged time\n    root.lastPingedTime = NoWork;\n  }\n\n  if (finishedExpirationTime <= root.lastExpiredTime) {\n    // Clear the expired time\n    root.lastExpiredTime = NoWork;\n  }\n}\nfunction markRootExpiredAtTime(root, expirationTime) {\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) {\n    root.lastExpiredTime = expirationTime;\n  }\n}\n\nvar didWarnAboutNestedUpdates;\nvar didWarnAboutFindNodeInStrictMode;\n\n{\n  didWarnAboutNestedUpdates = false;\n  didWarnAboutFindNodeInStrictMode = {};\n}\n\nfunction getContextForSubtree(parentComponent) {\n  if (!parentComponent) {\n    return emptyContextObject;\n  }\n\n  var fiber = get(parentComponent);\n  var parentContext = findCurrentUnmaskedContext(fiber);\n\n  if (fiber.tag === ClassComponent) {\n    var Component = fiber.type;\n\n    if (isContextProvider(Component)) {\n      return processChildContext(fiber, Component, parentContext);\n    }\n  }\n\n  return parentContext;\n}\n\nfunction findHostInstanceWithWarning(component, methodName) {\n  {\n    var fiber = get(component);\n\n    if (fiber === undefined) {\n      if (typeof component.render === 'function') {\n        {\n          {\n            throw Error( \"Unable to find node on an unmounted component.\" );\n          }\n        }\n      } else {\n        {\n          {\n            throw Error( \"Argument appears to not be a ReactComponent. Keys: \" + Object.keys(component) );\n          }\n        }\n      }\n    }\n\n    var hostFiber = findCurrentHostFiber(fiber);\n\n    if (hostFiber === null) {\n      return null;\n    }\n\n    if (hostFiber.mode & StrictMode) {\n      var componentName = getComponentName(fiber.type) || 'Component';\n\n      if (!didWarnAboutFindNodeInStrictMode[componentName]) {\n        didWarnAboutFindNodeInStrictMode[componentName] = true;\n\n        if (fiber.mode & StrictMode) {\n          error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n        } else {\n          error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n        }\n      }\n    }\n\n    return hostFiber.stateNode;\n  }\n}\n\nfunction createContainer(containerInfo, tag, hydrate, hydrationCallbacks) {\n  return createFiberRoot(containerInfo, tag, hydrate);\n}\nfunction updateContainer(element, container, parentComponent, callback) {\n  {\n    onScheduleRoot(container, element);\n  }\n\n  var current$1 = container.current;\n  var currentTime = requestCurrentTimeForUpdate();\n\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfUnmockedScheduler(current$1);\n      warnIfNotScopedWithMatchingAct(current$1);\n    }\n  }\n\n  var suspenseConfig = requestCurrentSuspenseConfig();\n  var expirationTime = computeExpirationForFiber(currentTime, current$1, suspenseConfig);\n  var context = getContextForSubtree(parentComponent);\n\n  if (container.context === null) {\n    container.context = context;\n  } else {\n    container.pendingContext = context;\n  }\n\n  {\n    if (isRendering && current !== null && !didWarnAboutNestedUpdates) {\n      didWarnAboutNestedUpdates = true;\n\n      error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\\n\\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');\n    }\n  }\n\n  var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  update.payload = {\n    element: element\n  };\n  callback = callback === undefined ? null : callback;\n\n  if (callback !== null) {\n    {\n      if (typeof callback !== 'function') {\n        error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);\n      }\n    }\n\n    update.callback = callback;\n  }\n\n  enqueueUpdate(current$1, update);\n  scheduleWork(current$1, expirationTime);\n  return expirationTime;\n}\nfunction getPublicRootInstance(container) {\n  var containerFiber = container.current;\n\n  if (!containerFiber.child) {\n    return null;\n  }\n\n  switch (containerFiber.child.tag) {\n    case HostComponent:\n      return getPublicInstance(containerFiber.child.stateNode);\n\n    default:\n      return containerFiber.child.stateNode;\n  }\n}\n\nfunction markRetryTimeImpl(fiber, retryTime) {\n  var suspenseState = fiber.memoizedState;\n\n  if (suspenseState !== null && suspenseState.dehydrated !== null) {\n    if (suspenseState.retryTime < retryTime) {\n      suspenseState.retryTime = retryTime;\n    }\n  }\n} // Increases the priority of thennables when they resolve within this boundary.\n\n\nfunction markRetryTimeIfNotHydrated(fiber, retryTime) {\n  markRetryTimeImpl(fiber, retryTime);\n  var alternate = fiber.alternate;\n\n  if (alternate) {\n    markRetryTimeImpl(alternate, retryTime);\n  }\n}\n\nfunction attemptUserBlockingHydration$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority and they should not suspend on I/O,\n    // since you have to wrap anything that might suspend in\n    // Suspense.\n    return;\n  }\n\n  var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());\n  scheduleWork(fiber, expTime);\n  markRetryTimeIfNotHydrated(fiber, expTime);\n}\nfunction attemptContinuousHydration$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority and they should not suspend on I/O,\n    // since you have to wrap anything that might suspend in\n    // Suspense.\n    return;\n  }\n\n  scheduleWork(fiber, ContinuousHydration);\n  markRetryTimeIfNotHydrated(fiber, ContinuousHydration);\n}\nfunction attemptHydrationAtCurrentPriority$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority other than synchronously flush it.\n    return;\n  }\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var expTime = computeExpirationForFiber(currentTime, fiber, null);\n  scheduleWork(fiber, expTime);\n  markRetryTimeIfNotHydrated(fiber, expTime);\n}\nfunction findHostInstanceWithNoPortals(fiber) {\n  var hostFiber = findCurrentHostFiberWithNoPortals(fiber);\n\n  if (hostFiber === null) {\n    return null;\n  }\n\n  if (hostFiber.tag === FundamentalComponent) {\n    return hostFiber.stateNode.instance;\n  }\n\n  return hostFiber.stateNode;\n}\n\nvar shouldSuspendImpl = function (fiber) {\n  return false;\n};\n\nfunction shouldSuspend(fiber) {\n  return shouldSuspendImpl(fiber);\n}\nvar overrideHookState = null;\nvar overrideProps = null;\nvar scheduleUpdate = null;\nvar setSuspenseHandler = null;\n\n{\n  var copyWithSetImpl = function (obj, path, idx, value) {\n    if (idx >= path.length) {\n      return value;\n    }\n\n    var key = path[idx];\n    var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here\n\n    updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);\n    return updated;\n  };\n\n  var copyWithSet = function (obj, path, value) {\n    return copyWithSetImpl(obj, path, 0, value);\n  }; // Support DevTools editable values for useState and useReducer.\n\n\n  overrideHookState = function (fiber, id, path, value) {\n    // For now, the \"id\" of stateful hooks is just the stateful hook index.\n    // This may change in the future with e.g. nested hooks.\n    var currentHook = fiber.memoizedState;\n\n    while (currentHook !== null && id > 0) {\n      currentHook = currentHook.next;\n      id--;\n    }\n\n    if (currentHook !== null) {\n      var newState = copyWithSet(currentHook.memoizedState, path, value);\n      currentHook.memoizedState = newState;\n      currentHook.baseState = newState; // We aren't actually adding an update to the queue,\n      // because there is no update we can add for useReducer hooks that won't trigger an error.\n      // (There's no appropriate action type for DevTools overrides.)\n      // As a result though, React will see the scheduled update as a noop and bailout.\n      // Shallow cloning props works as a workaround for now to bypass the bailout check.\n\n      fiber.memoizedProps = _assign({}, fiber.memoizedProps);\n      scheduleWork(fiber, Sync);\n    }\n  }; // Support DevTools props for function components, forwardRef, memo, host components, etc.\n\n\n  overrideProps = function (fiber, path, value) {\n    fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);\n\n    if (fiber.alternate) {\n      fiber.alternate.pendingProps = fiber.pendingProps;\n    }\n\n    scheduleWork(fiber, Sync);\n  };\n\n  scheduleUpdate = function (fiber) {\n    scheduleWork(fiber, Sync);\n  };\n\n  setSuspenseHandler = function (newShouldSuspendImpl) {\n    shouldSuspendImpl = newShouldSuspendImpl;\n  };\n}\n\nfunction injectIntoDevTools(devToolsConfig) {\n  var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;\n  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\n  return injectInternals(_assign({}, devToolsConfig, {\n    overrideHookState: overrideHookState,\n    overrideProps: overrideProps,\n    setSuspenseHandler: setSuspenseHandler,\n    scheduleUpdate: scheduleUpdate,\n    currentDispatcherRef: ReactCurrentDispatcher,\n    findHostInstanceByFiber: function (fiber) {\n      var hostFiber = findCurrentHostFiber(fiber);\n\n      if (hostFiber === null) {\n        return null;\n      }\n\n      return hostFiber.stateNode;\n    },\n    findFiberByHostInstance: function (instance) {\n      if (!findFiberByHostInstance) {\n        // Might not be implemented by the renderer.\n        return null;\n      }\n\n      return findFiberByHostInstance(instance);\n    },\n    // React Refresh\n    findHostInstancesForRefresh:  findHostInstancesForRefresh ,\n    scheduleRefresh:  scheduleRefresh ,\n    scheduleRoot:  scheduleRoot ,\n    setRefreshHandler:  setRefreshHandler ,\n    // Enables DevTools to append owner stacks to error messages in DEV mode.\n    getCurrentFiber:  function () {\n      return current;\n    } \n  }));\n}\nvar IsSomeRendererActing$1 = ReactSharedInternals.IsSomeRendererActing;\n\nfunction ReactDOMRoot(container, options) {\n  this._internalRoot = createRootImpl(container, ConcurrentRoot, options);\n}\n\nfunction ReactDOMBlockingRoot(container, tag, options) {\n  this._internalRoot = createRootImpl(container, tag, options);\n}\n\nReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) {\n  var root = this._internalRoot;\n\n  {\n    if (typeof arguments[1] === 'function') {\n      error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n    }\n\n    var container = root.containerInfo;\n\n    if (container.nodeType !== COMMENT_NODE) {\n      var hostInstance = findHostInstanceWithNoPortals(root.current);\n\n      if (hostInstance) {\n        if (hostInstance.parentNode !== container) {\n          error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + \"root.unmount() to empty a root's container.\");\n        }\n      }\n    }\n  }\n\n  updateContainer(children, root, null, null);\n};\n\nReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () {\n  {\n    if (typeof arguments[0] === 'function') {\n      error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n    }\n  }\n\n  var root = this._internalRoot;\n  var container = root.containerInfo;\n  updateContainer(null, root, null, function () {\n    unmarkContainerAsRoot(container);\n  });\n};\n\nfunction createRootImpl(container, tag, options) {\n  // Tag is either LegacyRoot or Concurrent Root\n  var hydrate = options != null && options.hydrate === true;\n  var hydrationCallbacks = options != null && options.hydrationOptions || null;\n  var root = createContainer(container, tag, hydrate);\n  markContainerAsRoot(root.current, container);\n\n  if (hydrate && tag !== LegacyRoot) {\n    var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument;\n    eagerlyTrapReplayableEvents(container, doc);\n  }\n\n  return root;\n}\nfunction createLegacyRoot(container, options) {\n  return new ReactDOMBlockingRoot(container, LegacyRoot, options);\n}\nfunction isValidContainer(node) {\n  return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));\n}\n\nvar ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;\nvar topLevelUpdateWarnings;\nvar warnedAboutHydrateAPI = false;\n\n{\n  topLevelUpdateWarnings = function (container) {\n    if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {\n      var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);\n\n      if (hostInstance) {\n        if (hostInstance.parentNode !== container) {\n          error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');\n        }\n      }\n    }\n\n    var isRootRenderedBySomeReact = !!container._reactRootContainer;\n    var rootEl = getReactRootElementInContainer(container);\n    var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));\n\n    if (hasNonRootReactChild && !isRootRenderedBySomeReact) {\n      error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');\n    }\n\n    if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {\n      error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');\n    }\n  };\n}\n\nfunction getReactRootElementInContainer(container) {\n  if (!container) {\n    return null;\n  }\n\n  if (container.nodeType === DOCUMENT_NODE) {\n    return container.documentElement;\n  } else {\n    return container.firstChild;\n  }\n}\n\nfunction shouldHydrateDueToLegacyHeuristic(container) {\n  var rootElement = getReactRootElementInContainer(container);\n  return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));\n}\n\nfunction legacyCreateRootFromDOMContainer(container, forceHydrate) {\n  var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content.\n\n  if (!shouldHydrate) {\n    var warned = false;\n    var rootSibling;\n\n    while (rootSibling = container.lastChild) {\n      {\n        if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {\n          warned = true;\n\n          error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');\n        }\n      }\n\n      container.removeChild(rootSibling);\n    }\n  }\n\n  {\n    if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {\n      warnedAboutHydrateAPI = true;\n\n      warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');\n    }\n  }\n\n  return createLegacyRoot(container, shouldHydrate ? {\n    hydrate: true\n  } : undefined);\n}\n\nfunction warnOnInvalidCallback$1(callback, callerName) {\n  {\n    if (callback !== null && typeof callback !== 'function') {\n      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n    }\n  }\n}\n\nfunction legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {\n  {\n    topLevelUpdateWarnings(container);\n    warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');\n  } // TODO: Without `any` type, Flow says \"Property cannot be accessed on any\n  // member of intersection type.\" Whyyyyyy.\n\n\n  var root = container._reactRootContainer;\n  var fiberRoot;\n\n  if (!root) {\n    // Initial mount\n    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);\n    fiberRoot = root._internalRoot;\n\n    if (typeof callback === 'function') {\n      var originalCallback = callback;\n\n      callback = function () {\n        var instance = getPublicRootInstance(fiberRoot);\n        originalCallback.call(instance);\n      };\n    } // Initial mount should not be batched.\n\n\n    unbatchedUpdates(function () {\n      updateContainer(children, fiberRoot, parentComponent, callback);\n    });\n  } else {\n    fiberRoot = root._internalRoot;\n\n    if (typeof callback === 'function') {\n      var _originalCallback = callback;\n\n      callback = function () {\n        var instance = getPublicRootInstance(fiberRoot);\n\n        _originalCallback.call(instance);\n      };\n    } // Update\n\n\n    updateContainer(children, fiberRoot, parentComponent, callback);\n  }\n\n  return getPublicRootInstance(fiberRoot);\n}\n\nfunction findDOMNode(componentOrElement) {\n  {\n    var owner = ReactCurrentOwner$3.current;\n\n    if (owner !== null && owner.stateNode !== null) {\n      var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;\n\n      if (!warnedAboutRefsInRender) {\n        error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component');\n      }\n\n      owner.stateNode._warnedAboutRefsInRender = true;\n    }\n  }\n\n  if (componentOrElement == null) {\n    return null;\n  }\n\n  if (componentOrElement.nodeType === ELEMENT_NODE) {\n    return componentOrElement;\n  }\n\n  {\n    return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');\n  }\n}\nfunction hydrate(element, container, callback) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?');\n    }\n  } // TODO: throw or warn if we couldn't hydrate?\n\n\n  return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);\n}\nfunction render(element, container, callback) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');\n    }\n  }\n\n  return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);\n}\nfunction unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n  if (!isValidContainer(containerNode)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  if (!(parentComponent != null && has(parentComponent))) {\n    {\n      throw Error( \"parentComponent must be a valid React Component\" );\n    }\n  }\n\n  return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);\n}\nfunction unmountComponentAtNode(container) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"unmountComponentAtNode(...): Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?');\n    }\n  }\n\n  if (container._reactRootContainer) {\n    {\n      var rootEl = getReactRootElementInContainer(container);\n      var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);\n\n      if (renderedByDifferentReact) {\n        error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by another copy of React.');\n      }\n    } // Unmount should not be batched.\n\n\n    unbatchedUpdates(function () {\n      legacyRenderSubtreeIntoContainer(null, null, container, false, function () {\n        // $FlowFixMe This should probably use `delete container._reactRootContainer`\n        container._reactRootContainer = null;\n        unmarkContainerAsRoot(container);\n      });\n    }); // If you call unmountComponentAtNode twice in quick succession, you'll\n    // get `true` twice. That's probably fine?\n\n    return true;\n  } else {\n    {\n      var _rootEl = getReactRootElementInContainer(container);\n\n      var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node.\n\n      var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;\n\n      if (hasNonRootReactChild) {\n        error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');\n      }\n    }\n\n    return false;\n  }\n}\n\nfunction createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.\nimplementation) {\n  var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n  return {\n    // This tag allow us to uniquely identify this as a React Portal\n    $$typeof: REACT_PORTAL_TYPE,\n    key: key == null ? null : '' + key,\n    children: children,\n    containerInfo: containerInfo,\n    implementation: implementation\n  };\n}\n\nvar ReactVersion = '16.13.1';\n\nsetAttemptUserBlockingHydration(attemptUserBlockingHydration$1);\nsetAttemptContinuousHydration(attemptContinuousHydration$1);\nsetAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);\nvar didWarnAboutUnstableCreatePortal = false;\n\n{\n  if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype\n  Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype\n  Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {\n    error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n  }\n}\n\nsetRestoreImplementation(restoreControlledState$3);\nsetBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1);\n\nfunction createPortal$1(children, container) {\n  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  } // TODO: pass ReactDOM portal implementation as third argument\n  // $FlowFixMe The Flow type is opaque but there's no way to actually create it.\n\n\n  return createPortal(children, container, null, key);\n}\n\nfunction renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n\n  return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);\n}\n\nfunction unstable_createPortal(children, container) {\n  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  {\n    if (!didWarnAboutUnstableCreatePortal) {\n      didWarnAboutUnstableCreatePortal = true;\n\n      warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the \"unstable_\" prefix.');\n    }\n  }\n\n  return createPortal$1(children, container, key);\n}\n\nvar Internals = {\n  // Keep in sync with ReactDOMUnstableNativeDependencies.js\n  // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification.\n  Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing]\n};\nvar foundDevTools = injectIntoDevTools({\n  findFiberByHostInstance: getClosestInstanceFromNode,\n  bundleType:  1 ,\n  version: ReactVersion,\n  rendererPackageName: 'react-dom'\n});\n\n{\n  if (!foundDevTools && canUseDOM && window.top === window.self) {\n    // If we're in Chrome or Firefox, provide a download link if not installed.\n    if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n      var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.\n\n      if (/^(https?|file):$/.test(protocol)) {\n        // eslint-disable-next-line react-internal/no-production-logging\n        console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');\n      }\n    }\n  }\n}\n\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;\nexports.createPortal = createPortal$1;\nexports.findDOMNode = findDOMNode;\nexports.flushSync = flushSync;\nexports.hydrate = hydrate;\nexports.render = render;\nexports.unmountComponentAtNode = unmountComponentAtNode;\nexports.unstable_batchedUpdates = batchedUpdates$1;\nexports.unstable_createPortal = unstable_createPortal;\nexports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;\nexports.version = ReactVersion;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-dom/cjs/react-dom.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-dom/index.js":
-/*!*****************************************************!*\
-  !*** ./jaas-client/node_modules/react-dom/index.js ***!
-  \*****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (true) {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-dom.development.js */ \"./jaas-client/node_modules/react-dom/cjs/react-dom.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-dom/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-input-emoji/dist/index.es.js":
-/*!*********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-input-emoji/dist/index.es.js ***!
-  \*********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nfunction styleInject(css, ref) {\n  if ( ref === void 0 ) ref = {};\n  var insertAt = ref.insertAt;\n\n  if (!css || typeof document === 'undefined') { return; }\n\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild);\n    } else {\n      head.appendChild(style);\n    }\n  } else {\n    head.appendChild(style);\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar css = \".emoji-mart,\\n.emoji-mart * {\\n  box-sizing: border-box;\\n  line-height: 1.15;\\n}\\n\\n.emoji-mart {\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Helvetica Neue\\\", sans-serif;\\n  font-size: 16px;\\n  display: inline-block;\\n  color: #222427;\\n  border: 1px solid #d9d9d9;\\n  border-radius: 5px;\\n  background: #fff;\\n}\\n\\n.emoji-mart .emoji-mart-emoji {\\n  padding: 6px;\\n}\\n\\n.emoji-mart-bar {\\n  border: 0 solid #d9d9d9;\\n}\\n.emoji-mart-bar:first-child {\\n  border-bottom-width: 1px;\\n  border-top-left-radius: 5px;\\n  border-top-right-radius: 5px;\\n}\\n.emoji-mart-bar:last-child {\\n  border-top-width: 1px;\\n  border-bottom-left-radius: 5px;\\n  border-bottom-right-radius: 5px;\\n}\\n\\n.emoji-mart-anchors {\\n  display: flex;\\n  flex-direction: row;\\n  justify-content: space-between;\\n  padding: 0 6px;\\n  color: #858585;\\n  line-height: 0;\\n}\\n\\n.emoji-mart-anchor {\\n  position: relative;\\n  display: block;\\n  flex: 1 1 auto;\\n  text-align: center;\\n  padding: 12px 4px;\\n  overflow: hidden;\\n  transition: color .1s ease-out;\\n  margin: 0;\\n  box-shadow: none;\\n  background: none;\\n  border: none;\\n}\\n.emoji-mart-anchor:hover,\\n.emoji-mart-anchor-selected {\\n  color: #464646;\\n}\\n\\n.emoji-mart-anchor-selected .emoji-mart-anchor-bar {\\n  bottom: 0;\\n}\\n\\n.emoji-mart-anchor-bar {\\n  position: absolute;\\n  bottom: -3px; left: 0;\\n  width: 100%; height: 3px;\\n  background-color: #464646;\\n}\\n\\n.emoji-mart-anchors i {\\n  display: inline-block;\\n  width: 100%;\\n  max-width: 22px;\\n}\\n\\n.emoji-mart-anchors svg,\\n.emoji-mart-anchors img {\\n  fill: #858585;\\n  height: 18px;\\n  width: 18px;\\n}\\n\\n.emoji-mart-scroll {\\n  overflow-y: scroll;\\n  height: 270px;\\n  padding: 0 6px 6px 6px;\\n  will-change: transform; /* avoids \\\"repaints on scroll\\\" in mobile Chrome */\\n}\\n\\n.emoji-mart-search {\\n  margin-top: 6px;\\n  padding: 0 6px;\\n  position: relative;\\n}\\n\\n.emoji-mart-search input {\\n  font-size: 16px;\\n  display: block;\\n  width: 100%;\\n  padding: 5px 25px 6px 10px;\\n  border-radius: 5px;\\n  border: 1px solid #d9d9d9;\\n  outline: 0;\\n}\\n\\n.emoji-mart-search input,\\n.emoji-mart-search input::-webkit-search-decoration,\\n.emoji-mart-search input::-webkit-search-cancel-button,\\n.emoji-mart-search input::-webkit-search-results-button,\\n.emoji-mart-search input::-webkit-search-results-decoration {\\n  /* remove webkit/blink styles for <input type=\\\"search\\\">\\n   * via https://stackoverflow.com/a/9422689 */\\n  -webkit-appearance: none;\\n}\\n\\n.emoji-mart-search-icon {\\n  position: absolute;\\n  top: 7px;\\n  right: 11px;\\n  z-index: 2;\\n  padding: 2px 5px 1px;\\n  border: none;\\n  background: none;\\n}\\n\\n.emoji-mart-category .emoji-mart-emoji span {\\n  z-index: 1;\\n  position: relative;\\n  text-align: center;\\n  cursor: default;\\n}\\n\\n.emoji-mart-category .emoji-mart-emoji:hover:before {\\n  z-index: 0;\\n  content: \\\"\\\";\\n  position: absolute;\\n  top: 0; left: 0;\\n  width: 100%; height: 100%;\\n  background-color: #f4f4f4;\\n  border-radius: 100%;\\n}\\n\\n.emoji-mart-category-label {\\n  z-index: 2;\\n  position: relative;\\n  position: -webkit-sticky;\\n  position: sticky;\\n  top: 0;\\n}\\n\\n.emoji-mart-category-label span {\\n  display: block;\\n  width: 100%;\\n  font-weight: 500;\\n  padding: 5px 6px;\\n  background-color: #fff;\\n  background-color: rgba(255, 255, 255, .95);\\n}\\n\\n.emoji-mart-category-list {\\n  margin: 0;\\n  padding: 0;\\n}\\n\\n.emoji-mart-category-list li {\\n  list-style: none;\\n  margin: 0;\\n  padding: 0;\\n  display: inline-block;\\n}\\n\\n.emoji-mart-emoji {\\n  position: relative;\\n  display: inline-block;\\n  font-size: 0;\\n  margin: 0;\\n  padding: 0;\\n  border: none;\\n  background: none;\\n  box-shadow: none;\\n}\\n\\n.emoji-mart-emoji-native {\\n  font-family: \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Segoe UI\\\", \\\"Apple Color Emoji\\\", \\\"Twemoji Mozilla\\\", \\\"Noto Color Emoji\\\", \\\"EmojiOne Color\\\", \\\"Android Emoji\\\";\\n}\\n\\n.emoji-mart-no-results {\\n  font-size: 14px;\\n  text-align: center;\\n  padding-top: 70px;\\n  color: #858585;\\n}\\n.emoji-mart-no-results-img {\\n  display: block;\\n  margin-left: auto;\\n  margin-right: auto;\\n  width: 50%;\\n}\\n.emoji-mart-no-results .emoji-mart-category-label {\\n  display: none;\\n}\\n.emoji-mart-no-results .emoji-mart-no-results-label {\\n  margin-top: .2em;\\n}\\n.emoji-mart-no-results .emoji-mart-emoji:hover:before {\\n  content: none;\\n}\\n\\n.emoji-mart-preview {\\n  position: relative;\\n  height: 70px;\\n}\\n\\n.emoji-mart-preview-emoji,\\n.emoji-mart-preview-data,\\n.emoji-mart-preview-skins {\\n  position: absolute;\\n  top: 50%;\\n  transform: translateY(-50%);\\n}\\n\\n.emoji-mart-preview-emoji {\\n  left: 12px;\\n}\\n\\n.emoji-mart-preview-data {\\n  left: 68px; right: 12px;\\n  word-break: break-all;\\n}\\n\\n.emoji-mart-preview-skins {\\n  right: 30px;\\n  text-align: right;\\n}\\n\\n.emoji-mart-preview-skins.custom {\\n  right: 10px;\\n  text-align: right;\\n}\\n\\n.emoji-mart-preview-name {\\n  font-size: 14px;\\n}\\n\\n.emoji-mart-preview-shortname {\\n  font-size: 12px;\\n  color: #888;\\n}\\n.emoji-mart-preview-shortname + .emoji-mart-preview-shortname,\\n.emoji-mart-preview-shortname + .emoji-mart-preview-emoticon,\\n.emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon {\\n  margin-left: .5em;\\n}\\n\\n.emoji-mart-preview-emoticon {\\n  font-size: 11px;\\n  color: #bbb;\\n}\\n\\n.emoji-mart-title span {\\n  display: inline-block;\\n  vertical-align: middle;\\n}\\n\\n.emoji-mart-title .emoji-mart-emoji {\\n  padding: 0;\\n}\\n\\n.emoji-mart-title-label {\\n  color: #999A9C;\\n  font-size: 26px;\\n  font-weight: 300;\\n}\\n\\n.emoji-mart-skin-swatches {\\n  font-size: 0;\\n  padding: 2px 0;\\n  border: 1px solid #d9d9d9;\\n  border-radius: 12px;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin-swatches.custom {\\n  font-size: 0;\\n  border: none;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch {\\n  width: 16px;\\n  padding: 0 2px;\\n}\\n\\n.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected:after {\\n  opacity: .75;\\n}\\n\\n.emoji-mart-skin-swatch {\\n  display: inline-block;\\n  width: 0;\\n  vertical-align: middle;\\n  transition-property: width, padding;\\n  transition-duration: .125s;\\n  transition-timing-function: ease-out;\\n}\\n\\n.emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s }\\n.emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s }\\n.emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s }\\n.emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s }\\n.emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s }\\n.emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s }\\n\\n.emoji-mart-skin-swatch.selected {\\n  position: relative;\\n  width: 16px;\\n  padding: 0 2px;\\n}\\n\\n.emoji-mart-skin-swatch.selected:after {\\n  content: \\\"\\\";\\n  position: absolute;\\n  top: 50%; left: 50%;\\n  width: 4px; height: 4px;\\n  margin: -2px 0 0 -2px;\\n  background-color: #fff;\\n  border-radius: 100%;\\n  pointer-events: none;\\n  opacity: 0;\\n  transition: opacity .2s ease-out;\\n}\\n\\n.emoji-mart-skin-swatch.custom {\\n  display: inline-block;\\n  width: 0;\\n  height: 38px;\\n  overflow: hidden;\\n  vertical-align: middle;\\n  transition-property: width, height;\\n  transition-duration: .125s;\\n  transition-timing-function: ease-out;\\n  cursor: default;\\n}\\n\\n.emoji-mart-skin-swatch.custom.selected {\\n  position: relative;\\n  width: 36px;\\n  height: 38px;\\n  padding: 0 2px 0 0;\\n}\\n\\n.emoji-mart-skin-swatch.custom.selected:after {\\n  content: \\\"\\\";\\n  width: 0;\\n  height: 0;\\n}\\n\\n.emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover {\\n  background-color: #f4f4f4;\\n  border-radius: 10%;\\n}\\n\\n.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom {\\n  width: 36px;\\n  height: 38px;\\n  padding: 0 2px 0 0;\\n}\\n\\n.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected:after {\\n  opacity: .75;\\n}\\n\\n.emoji-mart-skin-text.opened {\\n  display: inline-block;\\n  vertical-align: middle;\\n  text-align: left;\\n  color: #888;\\n  font-size: 11px;\\n  padding: 5px 2px;\\n  width: 95px;\\n  height: 40px;\\n  border-radius: 10%;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin {\\n  display: inline-block;\\n  width: 100%;\\n  padding-top: 100%;\\n  max-width: 12px;\\n  border-radius: 100%;\\n}\\n\\n.emoji-mart-skin-tone-1 { background-color: #ffc93a }\\n.emoji-mart-skin-tone-2 { background-color: #fadcbc }\\n.emoji-mart-skin-tone-3 { background-color: #e0bb95 }\\n.emoji-mart-skin-tone-4 { background-color: #bf8f68 }\\n.emoji-mart-skin-tone-5 { background-color: #9b643d }\\n.emoji-mart-skin-tone-6 { background-color: #594539 }\\n\\n/* For screenreaders only, via https://stackoverflow.com/a/19758620 */\\n.emoji-mart-sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  border: 0;\\n}\\n\\n\\n\";\nstyleInject(css);\n\nvar compressed = true;\nvar categories = [\n\t{\n\t\tid: \"people\",\n\t\tname: \"Smileys & People\",\n\t\temojis: [\n\t\t\t\"grinning\",\n\t\t\t\"grin\",\n\t\t\t\"joy\",\n\t\t\t\"rolling_on_the_floor_laughing\",\n\t\t\t\"smiley\",\n\t\t\t\"smile\",\n\t\t\t\"sweat_smile\",\n\t\t\t\"laughing\",\n\t\t\t\"wink\",\n\t\t\t\"blush\",\n\t\t\t\"yum\",\n\t\t\t\"sunglasses\",\n\t\t\t\"heart_eyes\",\n\t\t\t\"kissing_heart\",\n\t\t\t\"kissing\",\n\t\t\t\"kissing_smiling_eyes\",\n\t\t\t\"kissing_closed_eyes\",\n\t\t\t\"relaxed\",\n\t\t\t\"slightly_smiling_face\",\n\t\t\t\"hugging_face\",\n\t\t\t\"star-struck\",\n\t\t\t\"thinking_face\",\n\t\t\t\"face_with_raised_eyebrow\",\n\t\t\t\"neutral_face\",\n\t\t\t\"expressionless\",\n\t\t\t\"no_mouth\",\n\t\t\t\"face_with_rolling_eyes\",\n\t\t\t\"smirk\",\n\t\t\t\"persevere\",\n\t\t\t\"disappointed_relieved\",\n\t\t\t\"open_mouth\",\n\t\t\t\"zipper_mouth_face\",\n\t\t\t\"hushed\",\n\t\t\t\"sleepy\",\n\t\t\t\"tired_face\",\n\t\t\t\"sleeping\",\n\t\t\t\"relieved\",\n\t\t\t\"stuck_out_tongue\",\n\t\t\t\"stuck_out_tongue_winking_eye\",\n\t\t\t\"stuck_out_tongue_closed_eyes\",\n\t\t\t\"drooling_face\",\n\t\t\t\"unamused\",\n\t\t\t\"sweat\",\n\t\t\t\"pensive\",\n\t\t\t\"confused\",\n\t\t\t\"upside_down_face\",\n\t\t\t\"money_mouth_face\",\n\t\t\t\"astonished\",\n\t\t\t\"white_frowning_face\",\n\t\t\t\"slightly_frowning_face\",\n\t\t\t\"confounded\",\n\t\t\t\"disappointed\",\n\t\t\t\"worried\",\n\t\t\t\"triumph\",\n\t\t\t\"cry\",\n\t\t\t\"sob\",\n\t\t\t\"frowning\",\n\t\t\t\"anguished\",\n\t\t\t\"fearful\",\n\t\t\t\"weary\",\n\t\t\t\"exploding_head\",\n\t\t\t\"grimacing\",\n\t\t\t\"cold_sweat\",\n\t\t\t\"scream\",\n\t\t\t\"flushed\",\n\t\t\t\"zany_face\",\n\t\t\t\"dizzy_face\",\n\t\t\t\"rage\",\n\t\t\t\"angry\",\n\t\t\t\"face_with_symbols_on_mouth\",\n\t\t\t\"mask\",\n\t\t\t\"face_with_thermometer\",\n\t\t\t\"face_with_head_bandage\",\n\t\t\t\"nauseated_face\",\n\t\t\t\"face_vomiting\",\n\t\t\t\"sneezing_face\",\n\t\t\t\"innocent\",\n\t\t\t\"face_with_cowboy_hat\",\n\t\t\t\"clown_face\",\n\t\t\t\"lying_face\",\n\t\t\t\"shushing_face\",\n\t\t\t\"face_with_hand_over_mouth\",\n\t\t\t\"face_with_monocle\",\n\t\t\t\"nerd_face\",\n\t\t\t\"smiling_imp\",\n\t\t\t\"imp\",\n\t\t\t\"japanese_ogre\",\n\t\t\t\"japanese_goblin\",\n\t\t\t\"skull\",\n\t\t\t\"skull_and_crossbones\",\n\t\t\t\"ghost\",\n\t\t\t\"alien\",\n\t\t\t\"space_invader\",\n\t\t\t\"robot_face\",\n\t\t\t\"hankey\",\n\t\t\t\"smiley_cat\",\n\t\t\t\"smile_cat\",\n\t\t\t\"joy_cat\",\n\t\t\t\"heart_eyes_cat\",\n\t\t\t\"smirk_cat\",\n\t\t\t\"kissing_cat\",\n\t\t\t\"scream_cat\",\n\t\t\t\"crying_cat_face\",\n\t\t\t\"pouting_cat\",\n\t\t\t\"see_no_evil\",\n\t\t\t\"hear_no_evil\",\n\t\t\t\"speak_no_evil\",\n\t\t\t\"baby\",\n\t\t\t\"child\",\n\t\t\t\"boy\",\n\t\t\t\"girl\",\n\t\t\t\"adult\",\n\t\t\t\"man\",\n\t\t\t\"woman\",\n\t\t\t\"older_adult\",\n\t\t\t\"older_man\",\n\t\t\t\"older_woman\",\n\t\t\t\"male-doctor\",\n\t\t\t\"female-doctor\",\n\t\t\t\"male-student\",\n\t\t\t\"female-student\",\n\t\t\t\"male-teacher\",\n\t\t\t\"female-teacher\",\n\t\t\t\"male-judge\",\n\t\t\t\"female-judge\",\n\t\t\t\"male-farmer\",\n\t\t\t\"female-farmer\",\n\t\t\t\"male-cook\",\n\t\t\t\"female-cook\",\n\t\t\t\"male-mechanic\",\n\t\t\t\"female-mechanic\",\n\t\t\t\"male-factory-worker\",\n\t\t\t\"female-factory-worker\",\n\t\t\t\"male-office-worker\",\n\t\t\t\"female-office-worker\",\n\t\t\t\"male-scientist\",\n\t\t\t\"female-scientist\",\n\t\t\t\"male-technologist\",\n\t\t\t\"female-technologist\",\n\t\t\t\"male-singer\",\n\t\t\t\"female-singer\",\n\t\t\t\"male-artist\",\n\t\t\t\"female-artist\",\n\t\t\t\"male-pilot\",\n\t\t\t\"female-pilot\",\n\t\t\t\"male-astronaut\",\n\t\t\t\"female-astronaut\",\n\t\t\t\"male-firefighter\",\n\t\t\t\"female-firefighter\",\n\t\t\t\"cop\",\n\t\t\t\"male-police-officer\",\n\t\t\t\"female-police-officer\",\n\t\t\t\"sleuth_or_spy\",\n\t\t\t\"male-detective\",\n\t\t\t\"female-detective\",\n\t\t\t\"guardsman\",\n\t\t\t\"male-guard\",\n\t\t\t\"female-guard\",\n\t\t\t\"construction_worker\",\n\t\t\t\"male-construction-worker\",\n\t\t\t\"female-construction-worker\",\n\t\t\t\"prince\",\n\t\t\t\"princess\",\n\t\t\t\"man_with_turban\",\n\t\t\t\"man-wearing-turban\",\n\t\t\t\"woman-wearing-turban\",\n\t\t\t\"man_with_gua_pi_mao\",\n\t\t\t\"person_with_headscarf\",\n\t\t\t\"bearded_person\",\n\t\t\t\"person_with_blond_hair\",\n\t\t\t\"blond-haired-man\",\n\t\t\t\"blond-haired-woman\",\n\t\t\t\"man_in_tuxedo\",\n\t\t\t\"bride_with_veil\",\n\t\t\t\"pregnant_woman\",\n\t\t\t\"breast-feeding\",\n\t\t\t\"angel\",\n\t\t\t\"santa\",\n\t\t\t\"mrs_claus\",\n\t\t\t\"mage\",\n\t\t\t\"female_mage\",\n\t\t\t\"male_mage\",\n\t\t\t\"fairy\",\n\t\t\t\"female_fairy\",\n\t\t\t\"male_fairy\",\n\t\t\t\"vampire\",\n\t\t\t\"female_vampire\",\n\t\t\t\"male_vampire\",\n\t\t\t\"merperson\",\n\t\t\t\"mermaid\",\n\t\t\t\"merman\",\n\t\t\t\"elf\",\n\t\t\t\"female_elf\",\n\t\t\t\"male_elf\",\n\t\t\t\"genie\",\n\t\t\t\"female_genie\",\n\t\t\t\"male_genie\",\n\t\t\t\"zombie\",\n\t\t\t\"female_zombie\",\n\t\t\t\"male_zombie\",\n\t\t\t\"person_frowning\",\n\t\t\t\"man-frowning\",\n\t\t\t\"woman-frowning\",\n\t\t\t\"person_with_pouting_face\",\n\t\t\t\"man-pouting\",\n\t\t\t\"woman-pouting\",\n\t\t\t\"no_good\",\n\t\t\t\"man-gesturing-no\",\n\t\t\t\"woman-gesturing-no\",\n\t\t\t\"ok_woman\",\n\t\t\t\"man-gesturing-ok\",\n\t\t\t\"woman-gesturing-ok\",\n\t\t\t\"information_desk_person\",\n\t\t\t\"man-tipping-hand\",\n\t\t\t\"woman-tipping-hand\",\n\t\t\t\"raising_hand\",\n\t\t\t\"man-raising-hand\",\n\t\t\t\"woman-raising-hand\",\n\t\t\t\"bow\",\n\t\t\t\"man-bowing\",\n\t\t\t\"woman-bowing\",\n\t\t\t\"face_palm\",\n\t\t\t\"man-facepalming\",\n\t\t\t\"woman-facepalming\",\n\t\t\t\"shrug\",\n\t\t\t\"man-shrugging\",\n\t\t\t\"woman-shrugging\",\n\t\t\t\"massage\",\n\t\t\t\"man-getting-massage\",\n\t\t\t\"woman-getting-massage\",\n\t\t\t\"haircut\",\n\t\t\t\"man-getting-haircut\",\n\t\t\t\"woman-getting-haircut\",\n\t\t\t\"walking\",\n\t\t\t\"man-walking\",\n\t\t\t\"woman-walking\",\n\t\t\t\"runner\",\n\t\t\t\"man-running\",\n\t\t\t\"woman-running\",\n\t\t\t\"dancer\",\n\t\t\t\"man_dancing\",\n\t\t\t\"dancers\",\n\t\t\t\"man-with-bunny-ears-partying\",\n\t\t\t\"woman-with-bunny-ears-partying\",\n\t\t\t\"person_in_steamy_room\",\n\t\t\t\"woman_in_steamy_room\",\n\t\t\t\"man_in_steamy_room\",\n\t\t\t\"person_climbing\",\n\t\t\t\"woman_climbing\",\n\t\t\t\"man_climbing\",\n\t\t\t\"person_in_lotus_position\",\n\t\t\t\"woman_in_lotus_position\",\n\t\t\t\"man_in_lotus_position\",\n\t\t\t\"bath\",\n\t\t\t\"sleeping_accommodation\",\n\t\t\t\"man_in_business_suit_levitating\",\n\t\t\t\"speaking_head_in_silhouette\",\n\t\t\t\"bust_in_silhouette\",\n\t\t\t\"busts_in_silhouette\",\n\t\t\t\"fencer\",\n\t\t\t\"horse_racing\",\n\t\t\t\"skier\",\n\t\t\t\"snowboarder\",\n\t\t\t\"golfer\",\n\t\t\t\"man-golfing\",\n\t\t\t\"woman-golfing\",\n\t\t\t\"surfer\",\n\t\t\t\"man-surfing\",\n\t\t\t\"woman-surfing\",\n\t\t\t\"rowboat\",\n\t\t\t\"man-rowing-boat\",\n\t\t\t\"woman-rowing-boat\",\n\t\t\t\"swimmer\",\n\t\t\t\"man-swimming\",\n\t\t\t\"woman-swimming\",\n\t\t\t\"person_with_ball\",\n\t\t\t\"man-bouncing-ball\",\n\t\t\t\"woman-bouncing-ball\",\n\t\t\t\"weight_lifter\",\n\t\t\t\"man-lifting-weights\",\n\t\t\t\"woman-lifting-weights\",\n\t\t\t\"bicyclist\",\n\t\t\t\"man-biking\",\n\t\t\t\"woman-biking\",\n\t\t\t\"mountain_bicyclist\",\n\t\t\t\"man-mountain-biking\",\n\t\t\t\"woman-mountain-biking\",\n\t\t\t\"racing_car\",\n\t\t\t\"racing_motorcycle\",\n\t\t\t\"person_doing_cartwheel\",\n\t\t\t\"man-cartwheeling\",\n\t\t\t\"woman-cartwheeling\",\n\t\t\t\"wrestlers\",\n\t\t\t\"man-wrestling\",\n\t\t\t\"woman-wrestling\",\n\t\t\t\"water_polo\",\n\t\t\t\"man-playing-water-polo\",\n\t\t\t\"woman-playing-water-polo\",\n\t\t\t\"handball\",\n\t\t\t\"man-playing-handball\",\n\t\t\t\"woman-playing-handball\",\n\t\t\t\"juggling\",\n\t\t\t\"man-juggling\",\n\t\t\t\"woman-juggling\",\n\t\t\t\"couple\",\n\t\t\t\"two_men_holding_hands\",\n\t\t\t\"two_women_holding_hands\",\n\t\t\t\"couplekiss\",\n\t\t\t\"woman-kiss-man\",\n\t\t\t\"man-kiss-man\",\n\t\t\t\"woman-kiss-woman\",\n\t\t\t\"couple_with_heart\",\n\t\t\t\"woman-heart-man\",\n\t\t\t\"man-heart-man\",\n\t\t\t\"woman-heart-woman\",\n\t\t\t\"family\",\n\t\t\t\"man-woman-boy\",\n\t\t\t\"man-woman-girl\",\n\t\t\t\"man-woman-girl-boy\",\n\t\t\t\"man-woman-boy-boy\",\n\t\t\t\"man-woman-girl-girl\",\n\t\t\t\"man-man-boy\",\n\t\t\t\"man-man-girl\",\n\t\t\t\"man-man-girl-boy\",\n\t\t\t\"man-man-boy-boy\",\n\t\t\t\"man-man-girl-girl\",\n\t\t\t\"woman-woman-boy\",\n\t\t\t\"woman-woman-girl\",\n\t\t\t\"woman-woman-girl-boy\",\n\t\t\t\"woman-woman-boy-boy\",\n\t\t\t\"woman-woman-girl-girl\",\n\t\t\t\"man-boy\",\n\t\t\t\"man-boy-boy\",\n\t\t\t\"man-girl\",\n\t\t\t\"man-girl-boy\",\n\t\t\t\"man-girl-girl\",\n\t\t\t\"woman-boy\",\n\t\t\t\"woman-boy-boy\",\n\t\t\t\"woman-girl\",\n\t\t\t\"woman-girl-boy\",\n\t\t\t\"woman-girl-girl\",\n\t\t\t\"selfie\",\n\t\t\t\"muscle\",\n\t\t\t\"point_left\",\n\t\t\t\"point_right\",\n\t\t\t\"point_up\",\n\t\t\t\"point_up_2\",\n\t\t\t\"middle_finger\",\n\t\t\t\"point_down\",\n\t\t\t\"v\",\n\t\t\t\"crossed_fingers\",\n\t\t\t\"spock-hand\",\n\t\t\t\"the_horns\",\n\t\t\t\"call_me_hand\",\n\t\t\t\"raised_hand_with_fingers_splayed\",\n\t\t\t\"hand\",\n\t\t\t\"ok_hand\",\n\t\t\t\"+1\",\n\t\t\t\"-1\",\n\t\t\t\"fist\",\n\t\t\t\"facepunch\",\n\t\t\t\"left-facing_fist\",\n\t\t\t\"right-facing_fist\",\n\t\t\t\"raised_back_of_hand\",\n\t\t\t\"wave\",\n\t\t\t\"i_love_you_hand_sign\",\n\t\t\t\"writing_hand\",\n\t\t\t\"clap\",\n\t\t\t\"open_hands\",\n\t\t\t\"raised_hands\",\n\t\t\t\"palms_up_together\",\n\t\t\t\"pray\",\n\t\t\t\"handshake\",\n\t\t\t\"nail_care\",\n\t\t\t\"ear\",\n\t\t\t\"nose\",\n\t\t\t\"footprints\",\n\t\t\t\"eyes\",\n\t\t\t\"eye\",\n\t\t\t\"eye-in-speech-bubble\",\n\t\t\t\"brain\",\n\t\t\t\"tongue\",\n\t\t\t\"lips\",\n\t\t\t\"kiss\",\n\t\t\t\"cupid\",\n\t\t\t\"heart\",\n\t\t\t\"heartbeat\",\n\t\t\t\"broken_heart\",\n\t\t\t\"two_hearts\",\n\t\t\t\"sparkling_heart\",\n\t\t\t\"heartpulse\",\n\t\t\t\"blue_heart\",\n\t\t\t\"green_heart\",\n\t\t\t\"yellow_heart\",\n\t\t\t\"orange_heart\",\n\t\t\t\"purple_heart\",\n\t\t\t\"black_heart\",\n\t\t\t\"gift_heart\",\n\t\t\t\"revolving_hearts\",\n\t\t\t\"heart_decoration\",\n\t\t\t\"heavy_heart_exclamation_mark_ornament\",\n\t\t\t\"love_letter\",\n\t\t\t\"zzz\",\n\t\t\t\"anger\",\n\t\t\t\"bomb\",\n\t\t\t\"boom\",\n\t\t\t\"sweat_drops\",\n\t\t\t\"dash\",\n\t\t\t\"dizzy\",\n\t\t\t\"speech_balloon\",\n\t\t\t\"left_speech_bubble\",\n\t\t\t\"right_anger_bubble\",\n\t\t\t\"thought_balloon\",\n\t\t\t\"hole\",\n\t\t\t\"eyeglasses\",\n\t\t\t\"dark_sunglasses\",\n\t\t\t\"necktie\",\n\t\t\t\"shirt\",\n\t\t\t\"jeans\",\n\t\t\t\"scarf\",\n\t\t\t\"gloves\",\n\t\t\t\"coat\",\n\t\t\t\"socks\",\n\t\t\t\"dress\",\n\t\t\t\"kimono\",\n\t\t\t\"bikini\",\n\t\t\t\"womans_clothes\",\n\t\t\t\"purse\",\n\t\t\t\"handbag\",\n\t\t\t\"pouch\",\n\t\t\t\"shopping_bags\",\n\t\t\t\"school_satchel\",\n\t\t\t\"mans_shoe\",\n\t\t\t\"athletic_shoe\",\n\t\t\t\"high_heel\",\n\t\t\t\"sandal\",\n\t\t\t\"boot\",\n\t\t\t\"crown\",\n\t\t\t\"womans_hat\",\n\t\t\t\"tophat\",\n\t\t\t\"mortar_board\",\n\t\t\t\"billed_cap\",\n\t\t\t\"helmet_with_white_cross\",\n\t\t\t\"prayer_beads\",\n\t\t\t\"lipstick\",\n\t\t\t\"ring\",\n\t\t\t\"gem\"\n\t\t]\n\t},\n\t{\n\t\tid: \"nature\",\n\t\tname: \"Animals & Nature\",\n\t\temojis: [\n\t\t\t\"monkey_face\",\n\t\t\t\"monkey\",\n\t\t\t\"gorilla\",\n\t\t\t\"dog\",\n\t\t\t\"dog2\",\n\t\t\t\"poodle\",\n\t\t\t\"wolf\",\n\t\t\t\"fox_face\",\n\t\t\t\"cat\",\n\t\t\t\"cat2\",\n\t\t\t\"lion_face\",\n\t\t\t\"tiger\",\n\t\t\t\"tiger2\",\n\t\t\t\"leopard\",\n\t\t\t\"horse\",\n\t\t\t\"racehorse\",\n\t\t\t\"unicorn_face\",\n\t\t\t\"zebra_face\",\n\t\t\t\"deer\",\n\t\t\t\"cow\",\n\t\t\t\"ox\",\n\t\t\t\"water_buffalo\",\n\t\t\t\"cow2\",\n\t\t\t\"pig\",\n\t\t\t\"pig2\",\n\t\t\t\"boar\",\n\t\t\t\"pig_nose\",\n\t\t\t\"ram\",\n\t\t\t\"sheep\",\n\t\t\t\"goat\",\n\t\t\t\"dromedary_camel\",\n\t\t\t\"camel\",\n\t\t\t\"giraffe_face\",\n\t\t\t\"elephant\",\n\t\t\t\"rhinoceros\",\n\t\t\t\"mouse\",\n\t\t\t\"mouse2\",\n\t\t\t\"rat\",\n\t\t\t\"hamster\",\n\t\t\t\"rabbit\",\n\t\t\t\"rabbit2\",\n\t\t\t\"chipmunk\",\n\t\t\t\"hedgehog\",\n\t\t\t\"bat\",\n\t\t\t\"bear\",\n\t\t\t\"koala\",\n\t\t\t\"panda_face\",\n\t\t\t\"feet\",\n\t\t\t\"turkey\",\n\t\t\t\"chicken\",\n\t\t\t\"rooster\",\n\t\t\t\"hatching_chick\",\n\t\t\t\"baby_chick\",\n\t\t\t\"hatched_chick\",\n\t\t\t\"bird\",\n\t\t\t\"penguin\",\n\t\t\t\"dove_of_peace\",\n\t\t\t\"eagle\",\n\t\t\t\"duck\",\n\t\t\t\"owl\",\n\t\t\t\"frog\",\n\t\t\t\"crocodile\",\n\t\t\t\"turtle\",\n\t\t\t\"lizard\",\n\t\t\t\"snake\",\n\t\t\t\"dragon_face\",\n\t\t\t\"dragon\",\n\t\t\t\"sauropod\",\n\t\t\t\"t-rex\",\n\t\t\t\"whale\",\n\t\t\t\"whale2\",\n\t\t\t\"dolphin\",\n\t\t\t\"fish\",\n\t\t\t\"tropical_fish\",\n\t\t\t\"blowfish\",\n\t\t\t\"shark\",\n\t\t\t\"octopus\",\n\t\t\t\"shell\",\n\t\t\t\"crab\",\n\t\t\t\"shrimp\",\n\t\t\t\"squid\",\n\t\t\t\"snail\",\n\t\t\t\"butterfly\",\n\t\t\t\"bug\",\n\t\t\t\"ant\",\n\t\t\t\"bee\",\n\t\t\t\"beetle\",\n\t\t\t\"cricket\",\n\t\t\t\"spider\",\n\t\t\t\"spider_web\",\n\t\t\t\"scorpion\",\n\t\t\t\"bouquet\",\n\t\t\t\"cherry_blossom\",\n\t\t\t\"white_flower\",\n\t\t\t\"rosette\",\n\t\t\t\"rose\",\n\t\t\t\"wilted_flower\",\n\t\t\t\"hibiscus\",\n\t\t\t\"sunflower\",\n\t\t\t\"blossom\",\n\t\t\t\"tulip\",\n\t\t\t\"seedling\",\n\t\t\t\"evergreen_tree\",\n\t\t\t\"deciduous_tree\",\n\t\t\t\"palm_tree\",\n\t\t\t\"cactus\",\n\t\t\t\"ear_of_rice\",\n\t\t\t\"herb\",\n\t\t\t\"shamrock\",\n\t\t\t\"four_leaf_clover\",\n\t\t\t\"maple_leaf\",\n\t\t\t\"fallen_leaf\",\n\t\t\t\"leaves\"\n\t\t]\n\t},\n\t{\n\t\tid: \"foods\",\n\t\tname: \"Food & Drink\",\n\t\temojis: [\n\t\t\t\"grapes\",\n\t\t\t\"melon\",\n\t\t\t\"watermelon\",\n\t\t\t\"tangerine\",\n\t\t\t\"lemon\",\n\t\t\t\"banana\",\n\t\t\t\"pineapple\",\n\t\t\t\"apple\",\n\t\t\t\"green_apple\",\n\t\t\t\"pear\",\n\t\t\t\"peach\",\n\t\t\t\"cherries\",\n\t\t\t\"strawberry\",\n\t\t\t\"kiwifruit\",\n\t\t\t\"tomato\",\n\t\t\t\"coconut\",\n\t\t\t\"avocado\",\n\t\t\t\"eggplant\",\n\t\t\t\"potato\",\n\t\t\t\"carrot\",\n\t\t\t\"corn\",\n\t\t\t\"hot_pepper\",\n\t\t\t\"cucumber\",\n\t\t\t\"broccoli\",\n\t\t\t\"mushroom\",\n\t\t\t\"peanuts\",\n\t\t\t\"chestnut\",\n\t\t\t\"bread\",\n\t\t\t\"croissant\",\n\t\t\t\"baguette_bread\",\n\t\t\t\"pretzel\",\n\t\t\t\"pancakes\",\n\t\t\t\"cheese_wedge\",\n\t\t\t\"meat_on_bone\",\n\t\t\t\"poultry_leg\",\n\t\t\t\"cut_of_meat\",\n\t\t\t\"bacon\",\n\t\t\t\"hamburger\",\n\t\t\t\"fries\",\n\t\t\t\"pizza\",\n\t\t\t\"hotdog\",\n\t\t\t\"sandwich\",\n\t\t\t\"taco\",\n\t\t\t\"burrito\",\n\t\t\t\"stuffed_flatbread\",\n\t\t\t\"egg\",\n\t\t\t\"fried_egg\",\n\t\t\t\"shallow_pan_of_food\",\n\t\t\t\"stew\",\n\t\t\t\"bowl_with_spoon\",\n\t\t\t\"green_salad\",\n\t\t\t\"popcorn\",\n\t\t\t\"canned_food\",\n\t\t\t\"bento\",\n\t\t\t\"rice_cracker\",\n\t\t\t\"rice_ball\",\n\t\t\t\"rice\",\n\t\t\t\"curry\",\n\t\t\t\"ramen\",\n\t\t\t\"spaghetti\",\n\t\t\t\"sweet_potato\",\n\t\t\t\"oden\",\n\t\t\t\"sushi\",\n\t\t\t\"fried_shrimp\",\n\t\t\t\"fish_cake\",\n\t\t\t\"dango\",\n\t\t\t\"dumpling\",\n\t\t\t\"fortune_cookie\",\n\t\t\t\"takeout_box\",\n\t\t\t\"icecream\",\n\t\t\t\"shaved_ice\",\n\t\t\t\"ice_cream\",\n\t\t\t\"doughnut\",\n\t\t\t\"cookie\",\n\t\t\t\"birthday\",\n\t\t\t\"cake\",\n\t\t\t\"pie\",\n\t\t\t\"chocolate_bar\",\n\t\t\t\"candy\",\n\t\t\t\"lollipop\",\n\t\t\t\"custard\",\n\t\t\t\"honey_pot\",\n\t\t\t\"baby_bottle\",\n\t\t\t\"glass_of_milk\",\n\t\t\t\"coffee\",\n\t\t\t\"tea\",\n\t\t\t\"sake\",\n\t\t\t\"champagne\",\n\t\t\t\"wine_glass\",\n\t\t\t\"cocktail\",\n\t\t\t\"tropical_drink\",\n\t\t\t\"beer\",\n\t\t\t\"beers\",\n\t\t\t\"clinking_glasses\",\n\t\t\t\"tumbler_glass\",\n\t\t\t\"cup_with_straw\",\n\t\t\t\"chopsticks\",\n\t\t\t\"knife_fork_plate\",\n\t\t\t\"fork_and_knife\",\n\t\t\t\"spoon\",\n\t\t\t\"hocho\",\n\t\t\t\"amphora\"\n\t\t]\n\t},\n\t{\n\t\tid: \"activity\",\n\t\tname: \"Activities\",\n\t\temojis: [\n\t\t\t\"jack_o_lantern\",\n\t\t\t\"christmas_tree\",\n\t\t\t\"fireworks\",\n\t\t\t\"sparkler\",\n\t\t\t\"sparkles\",\n\t\t\t\"balloon\",\n\t\t\t\"tada\",\n\t\t\t\"confetti_ball\",\n\t\t\t\"tanabata_tree\",\n\t\t\t\"bamboo\",\n\t\t\t\"dolls\",\n\t\t\t\"flags\",\n\t\t\t\"wind_chime\",\n\t\t\t\"rice_scene\",\n\t\t\t\"ribbon\",\n\t\t\t\"gift\",\n\t\t\t\"reminder_ribbon\",\n\t\t\t\"admission_tickets\",\n\t\t\t\"ticket\",\n\t\t\t\"medal\",\n\t\t\t\"trophy\",\n\t\t\t\"sports_medal\",\n\t\t\t\"first_place_medal\",\n\t\t\t\"second_place_medal\",\n\t\t\t\"third_place_medal\",\n\t\t\t\"soccer\",\n\t\t\t\"baseball\",\n\t\t\t\"basketball\",\n\t\t\t\"volleyball\",\n\t\t\t\"football\",\n\t\t\t\"rugby_football\",\n\t\t\t\"tennis\",\n\t\t\t\"8ball\",\n\t\t\t\"bowling\",\n\t\t\t\"cricket_bat_and_ball\",\n\t\t\t\"field_hockey_stick_and_ball\",\n\t\t\t\"ice_hockey_stick_and_puck\",\n\t\t\t\"table_tennis_paddle_and_ball\",\n\t\t\t\"badminton_racquet_and_shuttlecock\",\n\t\t\t\"boxing_glove\",\n\t\t\t\"martial_arts_uniform\",\n\t\t\t\"goal_net\",\n\t\t\t\"dart\",\n\t\t\t\"golf\",\n\t\t\t\"ice_skate\",\n\t\t\t\"fishing_pole_and_fish\",\n\t\t\t\"running_shirt_with_sash\",\n\t\t\t\"ski\",\n\t\t\t\"sled\",\n\t\t\t\"curling_stone\",\n\t\t\t\"video_game\",\n\t\t\t\"joystick\",\n\t\t\t\"game_die\",\n\t\t\t\"spades\",\n\t\t\t\"hearts\",\n\t\t\t\"diamonds\",\n\t\t\t\"clubs\",\n\t\t\t\"black_joker\",\n\t\t\t\"mahjong\",\n\t\t\t\"flower_playing_cards\"\n\t\t]\n\t},\n\t{\n\t\tid: \"places\",\n\t\tname: \"Travel & Places\",\n\t\temojis: [\n\t\t\t\"earth_africa\",\n\t\t\t\"earth_americas\",\n\t\t\t\"earth_asia\",\n\t\t\t\"globe_with_meridians\",\n\t\t\t\"world_map\",\n\t\t\t\"japan\",\n\t\t\t\"snow_capped_mountain\",\n\t\t\t\"mountain\",\n\t\t\t\"volcano\",\n\t\t\t\"mount_fuji\",\n\t\t\t\"camping\",\n\t\t\t\"beach_with_umbrella\",\n\t\t\t\"desert\",\n\t\t\t\"desert_island\",\n\t\t\t\"national_park\",\n\t\t\t\"stadium\",\n\t\t\t\"classical_building\",\n\t\t\t\"building_construction\",\n\t\t\t\"house_buildings\",\n\t\t\t\"cityscape\",\n\t\t\t\"derelict_house_building\",\n\t\t\t\"house\",\n\t\t\t\"house_with_garden\",\n\t\t\t\"office\",\n\t\t\t\"post_office\",\n\t\t\t\"european_post_office\",\n\t\t\t\"hospital\",\n\t\t\t\"bank\",\n\t\t\t\"hotel\",\n\t\t\t\"love_hotel\",\n\t\t\t\"convenience_store\",\n\t\t\t\"school\",\n\t\t\t\"department_store\",\n\t\t\t\"factory\",\n\t\t\t\"japanese_castle\",\n\t\t\t\"european_castle\",\n\t\t\t\"wedding\",\n\t\t\t\"tokyo_tower\",\n\t\t\t\"statue_of_liberty\",\n\t\t\t\"church\",\n\t\t\t\"mosque\",\n\t\t\t\"synagogue\",\n\t\t\t\"shinto_shrine\",\n\t\t\t\"kaaba\",\n\t\t\t\"fountain\",\n\t\t\t\"tent\",\n\t\t\t\"foggy\",\n\t\t\t\"night_with_stars\",\n\t\t\t\"sunrise_over_mountains\",\n\t\t\t\"sunrise\",\n\t\t\t\"city_sunset\",\n\t\t\t\"city_sunrise\",\n\t\t\t\"bridge_at_night\",\n\t\t\t\"hotsprings\",\n\t\t\t\"milky_way\",\n\t\t\t\"carousel_horse\",\n\t\t\t\"ferris_wheel\",\n\t\t\t\"roller_coaster\",\n\t\t\t\"barber\",\n\t\t\t\"circus_tent\",\n\t\t\t\"performing_arts\",\n\t\t\t\"frame_with_picture\",\n\t\t\t\"art\",\n\t\t\t\"slot_machine\",\n\t\t\t\"steam_locomotive\",\n\t\t\t\"railway_car\",\n\t\t\t\"bullettrain_side\",\n\t\t\t\"bullettrain_front\",\n\t\t\t\"train2\",\n\t\t\t\"metro\",\n\t\t\t\"light_rail\",\n\t\t\t\"station\",\n\t\t\t\"tram\",\n\t\t\t\"monorail\",\n\t\t\t\"mountain_railway\",\n\t\t\t\"train\",\n\t\t\t\"bus\",\n\t\t\t\"oncoming_bus\",\n\t\t\t\"trolleybus\",\n\t\t\t\"minibus\",\n\t\t\t\"ambulance\",\n\t\t\t\"fire_engine\",\n\t\t\t\"police_car\",\n\t\t\t\"oncoming_police_car\",\n\t\t\t\"taxi\",\n\t\t\t\"oncoming_taxi\",\n\t\t\t\"car\",\n\t\t\t\"oncoming_automobile\",\n\t\t\t\"blue_car\",\n\t\t\t\"truck\",\n\t\t\t\"articulated_lorry\",\n\t\t\t\"tractor\",\n\t\t\t\"bike\",\n\t\t\t\"scooter\",\n\t\t\t\"motor_scooter\",\n\t\t\t\"busstop\",\n\t\t\t\"motorway\",\n\t\t\t\"railway_track\",\n\t\t\t\"fuelpump\",\n\t\t\t\"rotating_light\",\n\t\t\t\"traffic_light\",\n\t\t\t\"vertical_traffic_light\",\n\t\t\t\"construction\",\n\t\t\t\"octagonal_sign\",\n\t\t\t\"anchor\",\n\t\t\t\"boat\",\n\t\t\t\"canoe\",\n\t\t\t\"speedboat\",\n\t\t\t\"passenger_ship\",\n\t\t\t\"ferry\",\n\t\t\t\"motor_boat\",\n\t\t\t\"ship\",\n\t\t\t\"airplane\",\n\t\t\t\"small_airplane\",\n\t\t\t\"airplane_departure\",\n\t\t\t\"airplane_arriving\",\n\t\t\t\"seat\",\n\t\t\t\"helicopter\",\n\t\t\t\"suspension_railway\",\n\t\t\t\"mountain_cableway\",\n\t\t\t\"aerial_tramway\",\n\t\t\t\"satellite\",\n\t\t\t\"rocket\",\n\t\t\t\"flying_saucer\",\n\t\t\t\"bellhop_bell\",\n\t\t\t\"door\",\n\t\t\t\"bed\",\n\t\t\t\"couch_and_lamp\",\n\t\t\t\"toilet\",\n\t\t\t\"shower\",\n\t\t\t\"bathtub\",\n\t\t\t\"hourglass\",\n\t\t\t\"hourglass_flowing_sand\",\n\t\t\t\"watch\",\n\t\t\t\"alarm_clock\",\n\t\t\t\"stopwatch\",\n\t\t\t\"timer_clock\",\n\t\t\t\"mantelpiece_clock\",\n\t\t\t\"clock12\",\n\t\t\t\"clock1230\",\n\t\t\t\"clock1\",\n\t\t\t\"clock130\",\n\t\t\t\"clock2\",\n\t\t\t\"clock230\",\n\t\t\t\"clock3\",\n\t\t\t\"clock330\",\n\t\t\t\"clock4\",\n\t\t\t\"clock430\",\n\t\t\t\"clock5\",\n\t\t\t\"clock530\",\n\t\t\t\"clock6\",\n\t\t\t\"clock630\",\n\t\t\t\"clock7\",\n\t\t\t\"clock730\",\n\t\t\t\"clock8\",\n\t\t\t\"clock830\",\n\t\t\t\"clock9\",\n\t\t\t\"clock930\",\n\t\t\t\"clock10\",\n\t\t\t\"clock1030\",\n\t\t\t\"clock11\",\n\t\t\t\"clock1130\",\n\t\t\t\"new_moon\",\n\t\t\t\"waxing_crescent_moon\",\n\t\t\t\"first_quarter_moon\",\n\t\t\t\"moon\",\n\t\t\t\"full_moon\",\n\t\t\t\"waning_gibbous_moon\",\n\t\t\t\"last_quarter_moon\",\n\t\t\t\"waning_crescent_moon\",\n\t\t\t\"crescent_moon\",\n\t\t\t\"new_moon_with_face\",\n\t\t\t\"first_quarter_moon_with_face\",\n\t\t\t\"last_quarter_moon_with_face\",\n\t\t\t\"thermometer\",\n\t\t\t\"sunny\",\n\t\t\t\"full_moon_with_face\",\n\t\t\t\"sun_with_face\",\n\t\t\t\"star\",\n\t\t\t\"star2\",\n\t\t\t\"stars\",\n\t\t\t\"cloud\",\n\t\t\t\"partly_sunny\",\n\t\t\t\"thunder_cloud_and_rain\",\n\t\t\t\"mostly_sunny\",\n\t\t\t\"barely_sunny\",\n\t\t\t\"partly_sunny_rain\",\n\t\t\t\"rain_cloud\",\n\t\t\t\"snow_cloud\",\n\t\t\t\"lightning\",\n\t\t\t\"tornado\",\n\t\t\t\"fog\",\n\t\t\t\"wind_blowing_face\",\n\t\t\t\"cyclone\",\n\t\t\t\"rainbow\",\n\t\t\t\"closed_umbrella\",\n\t\t\t\"umbrella\",\n\t\t\t\"umbrella_with_rain_drops\",\n\t\t\t\"umbrella_on_ground\",\n\t\t\t\"zap\",\n\t\t\t\"snowflake\",\n\t\t\t\"snowman\",\n\t\t\t\"snowman_without_snow\",\n\t\t\t\"comet\",\n\t\t\t\"fire\",\n\t\t\t\"droplet\",\n\t\t\t\"ocean\"\n\t\t]\n\t},\n\t{\n\t\tid: \"objects\",\n\t\tname: \"Objects\",\n\t\temojis: [\n\t\t\t\"mute\",\n\t\t\t\"speaker\",\n\t\t\t\"sound\",\n\t\t\t\"loud_sound\",\n\t\t\t\"loudspeaker\",\n\t\t\t\"mega\",\n\t\t\t\"postal_horn\",\n\t\t\t\"bell\",\n\t\t\t\"no_bell\",\n\t\t\t\"musical_score\",\n\t\t\t\"musical_note\",\n\t\t\t\"notes\",\n\t\t\t\"studio_microphone\",\n\t\t\t\"level_slider\",\n\t\t\t\"control_knobs\",\n\t\t\t\"microphone\",\n\t\t\t\"headphones\",\n\t\t\t\"radio\",\n\t\t\t\"saxophone\",\n\t\t\t\"guitar\",\n\t\t\t\"musical_keyboard\",\n\t\t\t\"trumpet\",\n\t\t\t\"violin\",\n\t\t\t\"drum_with_drumsticks\",\n\t\t\t\"iphone\",\n\t\t\t\"calling\",\n\t\t\t\"phone\",\n\t\t\t\"telephone_receiver\",\n\t\t\t\"pager\",\n\t\t\t\"fax\",\n\t\t\t\"battery\",\n\t\t\t\"electric_plug\",\n\t\t\t\"computer\",\n\t\t\t\"desktop_computer\",\n\t\t\t\"printer\",\n\t\t\t\"keyboard\",\n\t\t\t\"three_button_mouse\",\n\t\t\t\"trackball\",\n\t\t\t\"minidisc\",\n\t\t\t\"floppy_disk\",\n\t\t\t\"cd\",\n\t\t\t\"dvd\",\n\t\t\t\"movie_camera\",\n\t\t\t\"film_frames\",\n\t\t\t\"film_projector\",\n\t\t\t\"clapper\",\n\t\t\t\"tv\",\n\t\t\t\"camera\",\n\t\t\t\"camera_with_flash\",\n\t\t\t\"video_camera\",\n\t\t\t\"vhs\",\n\t\t\t\"mag\",\n\t\t\t\"mag_right\",\n\t\t\t\"microscope\",\n\t\t\t\"telescope\",\n\t\t\t\"satellite_antenna\",\n\t\t\t\"candle\",\n\t\t\t\"bulb\",\n\t\t\t\"flashlight\",\n\t\t\t\"izakaya_lantern\",\n\t\t\t\"notebook_with_decorative_cover\",\n\t\t\t\"closed_book\",\n\t\t\t\"book\",\n\t\t\t\"green_book\",\n\t\t\t\"blue_book\",\n\t\t\t\"orange_book\",\n\t\t\t\"books\",\n\t\t\t\"notebook\",\n\t\t\t\"ledger\",\n\t\t\t\"page_with_curl\",\n\t\t\t\"scroll\",\n\t\t\t\"page_facing_up\",\n\t\t\t\"newspaper\",\n\t\t\t\"rolled_up_newspaper\",\n\t\t\t\"bookmark_tabs\",\n\t\t\t\"bookmark\",\n\t\t\t\"label\",\n\t\t\t\"moneybag\",\n\t\t\t\"yen\",\n\t\t\t\"dollar\",\n\t\t\t\"euro\",\n\t\t\t\"pound\",\n\t\t\t\"money_with_wings\",\n\t\t\t\"credit_card\",\n\t\t\t\"chart\",\n\t\t\t\"currency_exchange\",\n\t\t\t\"heavy_dollar_sign\",\n\t\t\t\"email\",\n\t\t\t\"e-mail\",\n\t\t\t\"incoming_envelope\",\n\t\t\t\"envelope_with_arrow\",\n\t\t\t\"outbox_tray\",\n\t\t\t\"inbox_tray\",\n\t\t\t\"package\",\n\t\t\t\"mailbox\",\n\t\t\t\"mailbox_closed\",\n\t\t\t\"mailbox_with_mail\",\n\t\t\t\"mailbox_with_no_mail\",\n\t\t\t\"postbox\",\n\t\t\t\"ballot_box_with_ballot\",\n\t\t\t\"pencil2\",\n\t\t\t\"black_nib\",\n\t\t\t\"lower_left_fountain_pen\",\n\t\t\t\"lower_left_ballpoint_pen\",\n\t\t\t\"lower_left_paintbrush\",\n\t\t\t\"lower_left_crayon\",\n\t\t\t\"memo\",\n\t\t\t\"briefcase\",\n\t\t\t\"file_folder\",\n\t\t\t\"open_file_folder\",\n\t\t\t\"card_index_dividers\",\n\t\t\t\"date\",\n\t\t\t\"calendar\",\n\t\t\t\"spiral_note_pad\",\n\t\t\t\"spiral_calendar_pad\",\n\t\t\t\"card_index\",\n\t\t\t\"chart_with_upwards_trend\",\n\t\t\t\"chart_with_downwards_trend\",\n\t\t\t\"bar_chart\",\n\t\t\t\"clipboard\",\n\t\t\t\"pushpin\",\n\t\t\t\"round_pushpin\",\n\t\t\t\"paperclip\",\n\t\t\t\"linked_paperclips\",\n\t\t\t\"straight_ruler\",\n\t\t\t\"triangular_ruler\",\n\t\t\t\"scissors\",\n\t\t\t\"card_file_box\",\n\t\t\t\"file_cabinet\",\n\t\t\t\"wastebasket\",\n\t\t\t\"lock\",\n\t\t\t\"unlock\",\n\t\t\t\"lock_with_ink_pen\",\n\t\t\t\"closed_lock_with_key\",\n\t\t\t\"key\",\n\t\t\t\"old_key\",\n\t\t\t\"hammer\",\n\t\t\t\"pick\",\n\t\t\t\"hammer_and_pick\",\n\t\t\t\"hammer_and_wrench\",\n\t\t\t\"dagger_knife\",\n\t\t\t\"crossed_swords\",\n\t\t\t\"gun\",\n\t\t\t\"bow_and_arrow\",\n\t\t\t\"shield\",\n\t\t\t\"wrench\",\n\t\t\t\"nut_and_bolt\",\n\t\t\t\"gear\",\n\t\t\t\"compression\",\n\t\t\t\"alembic\",\n\t\t\t\"scales\",\n\t\t\t\"link\",\n\t\t\t\"chains\",\n\t\t\t\"syringe\",\n\t\t\t\"pill\",\n\t\t\t\"smoking\",\n\t\t\t\"coffin\",\n\t\t\t\"funeral_urn\",\n\t\t\t\"moyai\",\n\t\t\t\"oil_drum\",\n\t\t\t\"crystal_ball\",\n\t\t\t\"shopping_trolley\"\n\t\t]\n\t},\n\t{\n\t\tid: \"symbols\",\n\t\tname: \"Symbols\",\n\t\temojis: [\n\t\t\t\"atm\",\n\t\t\t\"put_litter_in_its_place\",\n\t\t\t\"potable_water\",\n\t\t\t\"wheelchair\",\n\t\t\t\"mens\",\n\t\t\t\"womens\",\n\t\t\t\"restroom\",\n\t\t\t\"baby_symbol\",\n\t\t\t\"wc\",\n\t\t\t\"passport_control\",\n\t\t\t\"customs\",\n\t\t\t\"baggage_claim\",\n\t\t\t\"left_luggage\",\n\t\t\t\"warning\",\n\t\t\t\"children_crossing\",\n\t\t\t\"no_entry\",\n\t\t\t\"no_entry_sign\",\n\t\t\t\"no_bicycles\",\n\t\t\t\"no_smoking\",\n\t\t\t\"do_not_litter\",\n\t\t\t\"non-potable_water\",\n\t\t\t\"no_pedestrians\",\n\t\t\t\"no_mobile_phones\",\n\t\t\t\"underage\",\n\t\t\t\"radioactive_sign\",\n\t\t\t\"biohazard_sign\",\n\t\t\t\"arrow_up\",\n\t\t\t\"arrow_upper_right\",\n\t\t\t\"arrow_right\",\n\t\t\t\"arrow_lower_right\",\n\t\t\t\"arrow_down\",\n\t\t\t\"arrow_lower_left\",\n\t\t\t\"arrow_left\",\n\t\t\t\"arrow_upper_left\",\n\t\t\t\"arrow_up_down\",\n\t\t\t\"left_right_arrow\",\n\t\t\t\"leftwards_arrow_with_hook\",\n\t\t\t\"arrow_right_hook\",\n\t\t\t\"arrow_heading_up\",\n\t\t\t\"arrow_heading_down\",\n\t\t\t\"arrows_clockwise\",\n\t\t\t\"arrows_counterclockwise\",\n\t\t\t\"back\",\n\t\t\t\"end\",\n\t\t\t\"on\",\n\t\t\t\"soon\",\n\t\t\t\"top\",\n\t\t\t\"place_of_worship\",\n\t\t\t\"atom_symbol\",\n\t\t\t\"om_symbol\",\n\t\t\t\"star_of_david\",\n\t\t\t\"wheel_of_dharma\",\n\t\t\t\"yin_yang\",\n\t\t\t\"latin_cross\",\n\t\t\t\"orthodox_cross\",\n\t\t\t\"star_and_crescent\",\n\t\t\t\"peace_symbol\",\n\t\t\t\"menorah_with_nine_branches\",\n\t\t\t\"six_pointed_star\",\n\t\t\t\"aries\",\n\t\t\t\"taurus\",\n\t\t\t\"gemini\",\n\t\t\t\"cancer\",\n\t\t\t\"leo\",\n\t\t\t\"virgo\",\n\t\t\t\"libra\",\n\t\t\t\"scorpius\",\n\t\t\t\"sagittarius\",\n\t\t\t\"capricorn\",\n\t\t\t\"aquarius\",\n\t\t\t\"pisces\",\n\t\t\t\"ophiuchus\",\n\t\t\t\"twisted_rightwards_arrows\",\n\t\t\t\"repeat\",\n\t\t\t\"repeat_one\",\n\t\t\t\"arrow_forward\",\n\t\t\t\"fast_forward\",\n\t\t\t\"black_right_pointing_double_triangle_with_vertical_bar\",\n\t\t\t\"black_right_pointing_triangle_with_double_vertical_bar\",\n\t\t\t\"arrow_backward\",\n\t\t\t\"rewind\",\n\t\t\t\"black_left_pointing_double_triangle_with_vertical_bar\",\n\t\t\t\"arrow_up_small\",\n\t\t\t\"arrow_double_up\",\n\t\t\t\"arrow_down_small\",\n\t\t\t\"arrow_double_down\",\n\t\t\t\"double_vertical_bar\",\n\t\t\t\"black_square_for_stop\",\n\t\t\t\"black_circle_for_record\",\n\t\t\t\"eject\",\n\t\t\t\"cinema\",\n\t\t\t\"low_brightness\",\n\t\t\t\"high_brightness\",\n\t\t\t\"signal_strength\",\n\t\t\t\"vibration_mode\",\n\t\t\t\"mobile_phone_off\",\n\t\t\t\"female_sign\",\n\t\t\t\"male_sign\",\n\t\t\t\"medical_symbol\",\n\t\t\t\"recycle\",\n\t\t\t\"fleur_de_lis\",\n\t\t\t\"trident\",\n\t\t\t\"name_badge\",\n\t\t\t\"beginner\",\n\t\t\t\"o\",\n\t\t\t\"white_check_mark\",\n\t\t\t\"ballot_box_with_check\",\n\t\t\t\"heavy_check_mark\",\n\t\t\t\"heavy_multiplication_x\",\n\t\t\t\"x\",\n\t\t\t\"negative_squared_cross_mark\",\n\t\t\t\"heavy_plus_sign\",\n\t\t\t\"heavy_minus_sign\",\n\t\t\t\"heavy_division_sign\",\n\t\t\t\"curly_loop\",\n\t\t\t\"loop\",\n\t\t\t\"part_alternation_mark\",\n\t\t\t\"eight_spoked_asterisk\",\n\t\t\t\"eight_pointed_black_star\",\n\t\t\t\"sparkle\",\n\t\t\t\"bangbang\",\n\t\t\t\"interrobang\",\n\t\t\t\"question\",\n\t\t\t\"grey_question\",\n\t\t\t\"grey_exclamation\",\n\t\t\t\"exclamation\",\n\t\t\t\"wavy_dash\",\n\t\t\t\"copyright\",\n\t\t\t\"registered\",\n\t\t\t\"tm\",\n\t\t\t\"hash\",\n\t\t\t\"keycap_star\",\n\t\t\t\"zero\",\n\t\t\t\"one\",\n\t\t\t\"two\",\n\t\t\t\"three\",\n\t\t\t\"four\",\n\t\t\t\"five\",\n\t\t\t\"six\",\n\t\t\t\"seven\",\n\t\t\t\"eight\",\n\t\t\t\"nine\",\n\t\t\t\"keycap_ten\",\n\t\t\t\"100\",\n\t\t\t\"capital_abcd\",\n\t\t\t\"abcd\",\n\t\t\t\"1234\",\n\t\t\t\"symbols\",\n\t\t\t\"abc\",\n\t\t\t\"a\",\n\t\t\t\"ab\",\n\t\t\t\"b\",\n\t\t\t\"cl\",\n\t\t\t\"cool\",\n\t\t\t\"free\",\n\t\t\t\"information_source\",\n\t\t\t\"id\",\n\t\t\t\"m\",\n\t\t\t\"new\",\n\t\t\t\"ng\",\n\t\t\t\"o2\",\n\t\t\t\"ok\",\n\t\t\t\"parking\",\n\t\t\t\"sos\",\n\t\t\t\"up\",\n\t\t\t\"vs\",\n\t\t\t\"koko\",\n\t\t\t\"sa\",\n\t\t\t\"u6708\",\n\t\t\t\"u6709\",\n\t\t\t\"u6307\",\n\t\t\t\"ideograph_advantage\",\n\t\t\t\"u5272\",\n\t\t\t\"u7121\",\n\t\t\t\"u7981\",\n\t\t\t\"accept\",\n\t\t\t\"u7533\",\n\t\t\t\"u5408\",\n\t\t\t\"u7a7a\",\n\t\t\t\"congratulations\",\n\t\t\t\"secret\",\n\t\t\t\"u55b6\",\n\t\t\t\"u6e80\",\n\t\t\t\"black_small_square\",\n\t\t\t\"white_small_square\",\n\t\t\t\"white_medium_square\",\n\t\t\t\"black_medium_square\",\n\t\t\t\"white_medium_small_square\",\n\t\t\t\"black_medium_small_square\",\n\t\t\t\"black_large_square\",\n\t\t\t\"white_large_square\",\n\t\t\t\"large_orange_diamond\",\n\t\t\t\"large_blue_diamond\",\n\t\t\t\"small_orange_diamond\",\n\t\t\t\"small_blue_diamond\",\n\t\t\t\"small_red_triangle\",\n\t\t\t\"small_red_triangle_down\",\n\t\t\t\"diamond_shape_with_a_dot_inside\",\n\t\t\t\"radio_button\",\n\t\t\t\"black_square_button\",\n\t\t\t\"white_square_button\",\n\t\t\t\"white_circle\",\n\t\t\t\"black_circle\",\n\t\t\t\"red_circle\",\n\t\t\t\"large_blue_circle\"\n\t\t]\n\t},\n\t{\n\t\tid: \"flags\",\n\t\tname: \"Flags\",\n\t\temojis: [\n\t\t\t\"checkered_flag\",\n\t\t\t\"cn\",\n\t\t\t\"crossed_flags\",\n\t\t\t\"de\",\n\t\t\t\"es\",\n\t\t\t\"flag-ac\",\n\t\t\t\"flag-ad\",\n\t\t\t\"flag-ae\",\n\t\t\t\"flag-af\",\n\t\t\t\"flag-ag\",\n\t\t\t\"flag-ai\",\n\t\t\t\"flag-al\",\n\t\t\t\"flag-am\",\n\t\t\t\"flag-ao\",\n\t\t\t\"flag-aq\",\n\t\t\t\"flag-ar\",\n\t\t\t\"flag-as\",\n\t\t\t\"flag-at\",\n\t\t\t\"flag-au\",\n\t\t\t\"flag-aw\",\n\t\t\t\"flag-ax\",\n\t\t\t\"flag-az\",\n\t\t\t\"flag-ba\",\n\t\t\t\"flag-bb\",\n\t\t\t\"flag-bd\",\n\t\t\t\"flag-be\",\n\t\t\t\"flag-bf\",\n\t\t\t\"flag-bg\",\n\t\t\t\"flag-bh\",\n\t\t\t\"flag-bi\",\n\t\t\t\"flag-bj\",\n\t\t\t\"flag-bl\",\n\t\t\t\"flag-bm\",\n\t\t\t\"flag-bn\",\n\t\t\t\"flag-bo\",\n\t\t\t\"flag-bq\",\n\t\t\t\"flag-br\",\n\t\t\t\"flag-bs\",\n\t\t\t\"flag-bt\",\n\t\t\t\"flag-bv\",\n\t\t\t\"flag-bw\",\n\t\t\t\"flag-by\",\n\t\t\t\"flag-bz\",\n\t\t\t\"flag-ca\",\n\t\t\t\"flag-cc\",\n\t\t\t\"flag-cd\",\n\t\t\t\"flag-cf\",\n\t\t\t\"flag-cg\",\n\t\t\t\"flag-ch\",\n\t\t\t\"flag-ci\",\n\t\t\t\"flag-ck\",\n\t\t\t\"flag-cl\",\n\t\t\t\"flag-cm\",\n\t\t\t\"flag-co\",\n\t\t\t\"flag-cp\",\n\t\t\t\"flag-cr\",\n\t\t\t\"flag-cu\",\n\t\t\t\"flag-cv\",\n\t\t\t\"flag-cw\",\n\t\t\t\"flag-cx\",\n\t\t\t\"flag-cy\",\n\t\t\t\"flag-cz\",\n\t\t\t\"flag-dg\",\n\t\t\t\"flag-dj\",\n\t\t\t\"flag-dk\",\n\t\t\t\"flag-dm\",\n\t\t\t\"flag-do\",\n\t\t\t\"flag-dz\",\n\t\t\t\"flag-ea\",\n\t\t\t\"flag-ec\",\n\t\t\t\"flag-ee\",\n\t\t\t\"flag-eg\",\n\t\t\t\"flag-eh\",\n\t\t\t\"flag-england\",\n\t\t\t\"flag-er\",\n\t\t\t\"flag-et\",\n\t\t\t\"flag-eu\",\n\t\t\t\"flag-fi\",\n\t\t\t\"flag-fj\",\n\t\t\t\"flag-fk\",\n\t\t\t\"flag-fm\",\n\t\t\t\"flag-fo\",\n\t\t\t\"flag-ga\",\n\t\t\t\"flag-gd\",\n\t\t\t\"flag-ge\",\n\t\t\t\"flag-gf\",\n\t\t\t\"flag-gg\",\n\t\t\t\"flag-gh\",\n\t\t\t\"flag-gi\",\n\t\t\t\"flag-gl\",\n\t\t\t\"flag-gm\",\n\t\t\t\"flag-gn\",\n\t\t\t\"flag-gp\",\n\t\t\t\"flag-gq\",\n\t\t\t\"flag-gr\",\n\t\t\t\"flag-gs\",\n\t\t\t\"flag-gt\",\n\t\t\t\"flag-gu\",\n\t\t\t\"flag-gw\",\n\t\t\t\"flag-gy\",\n\t\t\t\"flag-hk\",\n\t\t\t\"flag-hm\",\n\t\t\t\"flag-hn\",\n\t\t\t\"flag-hr\",\n\t\t\t\"flag-ht\",\n\t\t\t\"flag-hu\",\n\t\t\t\"flag-ic\",\n\t\t\t\"flag-id\",\n\t\t\t\"flag-ie\",\n\t\t\t\"flag-il\",\n\t\t\t\"flag-im\",\n\t\t\t\"flag-in\",\n\t\t\t\"flag-io\",\n\t\t\t\"flag-iq\",\n\t\t\t\"flag-ir\",\n\t\t\t\"flag-is\",\n\t\t\t\"flag-je\",\n\t\t\t\"flag-jm\",\n\t\t\t\"flag-jo\",\n\t\t\t\"flag-ke\",\n\t\t\t\"flag-kg\",\n\t\t\t\"flag-kh\",\n\t\t\t\"flag-ki\",\n\t\t\t\"flag-km\",\n\t\t\t\"flag-kn\",\n\t\t\t\"flag-kp\",\n\t\t\t\"flag-kw\",\n\t\t\t\"flag-ky\",\n\t\t\t\"flag-kz\",\n\t\t\t\"flag-la\",\n\t\t\t\"flag-lb\",\n\t\t\t\"flag-lc\",\n\t\t\t\"flag-li\",\n\t\t\t\"flag-lk\",\n\t\t\t\"flag-lr\",\n\t\t\t\"flag-ls\",\n\t\t\t\"flag-lt\",\n\t\t\t\"flag-lu\",\n\t\t\t\"flag-lv\",\n\t\t\t\"flag-ly\",\n\t\t\t\"flag-ma\",\n\t\t\t\"flag-mc\",\n\t\t\t\"flag-md\",\n\t\t\t\"flag-me\",\n\t\t\t\"flag-mf\",\n\t\t\t\"flag-mg\",\n\t\t\t\"flag-mh\",\n\t\t\t\"flag-mk\",\n\t\t\t\"flag-ml\",\n\t\t\t\"flag-mm\",\n\t\t\t\"flag-mn\",\n\t\t\t\"flag-mo\",\n\t\t\t\"flag-mp\",\n\t\t\t\"flag-mq\",\n\t\t\t\"flag-mr\",\n\t\t\t\"flag-ms\",\n\t\t\t\"flag-mt\",\n\t\t\t\"flag-mu\",\n\t\t\t\"flag-mv\",\n\t\t\t\"flag-mw\",\n\t\t\t\"flag-mx\",\n\t\t\t\"flag-my\",\n\t\t\t\"flag-mz\",\n\t\t\t\"flag-na\",\n\t\t\t\"flag-nc\",\n\t\t\t\"flag-ne\",\n\t\t\t\"flag-nf\",\n\t\t\t\"flag-ng\",\n\t\t\t\"flag-ni\",\n\t\t\t\"flag-nl\",\n\t\t\t\"flag-no\",\n\t\t\t\"flag-np\",\n\t\t\t\"flag-nr\",\n\t\t\t\"flag-nu\",\n\t\t\t\"flag-nz\",\n\t\t\t\"flag-om\",\n\t\t\t\"flag-pa\",\n\t\t\t\"flag-pe\",\n\t\t\t\"flag-pf\",\n\t\t\t\"flag-pg\",\n\t\t\t\"flag-ph\",\n\t\t\t\"flag-pk\",\n\t\t\t\"flag-pl\",\n\t\t\t\"flag-pm\",\n\t\t\t\"flag-pn\",\n\t\t\t\"flag-pr\",\n\t\t\t\"flag-ps\",\n\t\t\t\"flag-pt\",\n\t\t\t\"flag-pw\",\n\t\t\t\"flag-py\",\n\t\t\t\"flag-qa\",\n\t\t\t\"flag-re\",\n\t\t\t\"flag-ro\",\n\t\t\t\"flag-rs\",\n\t\t\t\"flag-rw\",\n\t\t\t\"flag-sa\",\n\t\t\t\"flag-sb\",\n\t\t\t\"flag-sc\",\n\t\t\t\"flag-scotland\",\n\t\t\t\"flag-sd\",\n\t\t\t\"flag-se\",\n\t\t\t\"flag-sg\",\n\t\t\t\"flag-sh\",\n\t\t\t\"flag-si\",\n\t\t\t\"flag-sj\",\n\t\t\t\"flag-sk\",\n\t\t\t\"flag-sl\",\n\t\t\t\"flag-sm\",\n\t\t\t\"flag-sn\",\n\t\t\t\"flag-so\",\n\t\t\t\"flag-sr\",\n\t\t\t\"flag-ss\",\n\t\t\t\"flag-st\",\n\t\t\t\"flag-sv\",\n\t\t\t\"flag-sx\",\n\t\t\t\"flag-sy\",\n\t\t\t\"flag-sz\",\n\t\t\t\"flag-ta\",\n\t\t\t\"flag-tc\",\n\t\t\t\"flag-td\",\n\t\t\t\"flag-tf\",\n\t\t\t\"flag-tg\",\n\t\t\t\"flag-th\",\n\t\t\t\"flag-tj\",\n\t\t\t\"flag-tk\",\n\t\t\t\"flag-tl\",\n\t\t\t\"flag-tm\",\n\t\t\t\"flag-tn\",\n\t\t\t\"flag-to\",\n\t\t\t\"flag-tr\",\n\t\t\t\"flag-tt\",\n\t\t\t\"flag-tv\",\n\t\t\t\"flag-tw\",\n\t\t\t\"flag-tz\",\n\t\t\t\"flag-ua\",\n\t\t\t\"flag-ug\",\n\t\t\t\"flag-um\",\n\t\t\t\"flag-uy\",\n\t\t\t\"flag-uz\",\n\t\t\t\"flag-va\",\n\t\t\t\"flag-vc\",\n\t\t\t\"flag-ve\",\n\t\t\t\"flag-vg\",\n\t\t\t\"flag-vi\",\n\t\t\t\"flag-vn\",\n\t\t\t\"flag-vu\",\n\t\t\t\"flag-wales\",\n\t\t\t\"flag-wf\",\n\t\t\t\"flag-ws\",\n\t\t\t\"flag-xk\",\n\t\t\t\"flag-ye\",\n\t\t\t\"flag-yt\",\n\t\t\t\"flag-za\",\n\t\t\t\"flag-zm\",\n\t\t\t\"flag-zw\",\n\t\t\t\"fr\",\n\t\t\t\"gb\",\n\t\t\t\"it\",\n\t\t\t\"jp\",\n\t\t\t\"kr\",\n\t\t\t\"rainbow-flag\",\n\t\t\t\"ru\",\n\t\t\t\"triangular_flag_on_post\",\n\t\t\t\"us\",\n\t\t\t\"waving_black_flag\",\n\t\t\t\"waving_white_flag\"\n\t\t]\n\t}\n];\nvar emojis = {\n\t\"100\": {\n\t\ta: \"Hundred Points Symbol\",\n\t\tb: \"1F4AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"score\",\n\t\t\t\"perfect\",\n\t\t\t\"numbers\",\n\t\t\t\"century\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\",\n\t\t\t\"pass\",\n\t\t\t\"hundred\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t26\n\t\t]\n\t},\n\t\"1234\": {\n\t\ta: \"Input Symbol for Numbers\",\n\t\tb: \"1F522\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t36\n\t\t]\n\t},\n\tmonkey_face: {\n\t\ta: \"Monkey Face\",\n\t\tb: \"1F435\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t31\n\t\t],\n\t\tl: [\n\t\t\t\":o)\"\n\t\t]\n\t},\n\tgrinning: {\n\t\ta: \"Grinning Face\",\n\t\tb: \"1F600\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\":D\",\n\t\t\t\"grin\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t24\n\t\t],\n\t\tm: \":D\"\n\t},\n\tearth_africa: {\n\t\ta: \"Earth Globe Europe-Africa\",\n\t\tb: \"1F30D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t5\n\t\t]\n\t},\n\tcheckered_flag: {\n\t\ta: \"Chequered Flag\",\n\t\tb: \"1F3C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"contest\",\n\t\t\t\"finishline\",\n\t\t\t\"race\",\n\t\t\t\"gokart\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t27\n\t\t]\n\t},\n\tmute: {\n\t\ta: \"Speaker with Cancellation Stroke\",\n\t\tb: \"1F507\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"silence\",\n\t\t\t\"quiet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t9\n\t\t]\n\t},\n\tjack_o_lantern: {\n\t\ta: \"Jack-O-Lantern\",\n\t\tb: \"1F383\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"halloween\",\n\t\t\t\"light\",\n\t\t\t\"pumpkin\",\n\t\t\t\"creepy\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t17\n\t\t]\n\t},\n\tatm: {\n\t\ta: \"Automated Teller Machine\",\n\t\tb: \"1F3E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"cash\",\n\t\t\t\"blue-square\",\n\t\t\t\"payment\",\n\t\t\t\"bank\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t4\n\t\t]\n\t},\n\tgrapes: {\n\t\ta: \"Grapes\",\n\t\tb: \"1F347\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"wine\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t9\n\t\t]\n\t},\n\tearth_americas: {\n\t\ta: \"Earth Globe Americas\",\n\t\tb: \"1F30E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"USA\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t6\n\t\t]\n\t},\n\tgrin: {\n\t\ta: \"Grinning Face with Smiling Eyes\",\n\t\tb: \"1F601\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"smile\",\n\t\t\t\"joy\",\n\t\t\t\"kawaii\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t25\n\t\t]\n\t},\n\tmelon: {\n\t\ta: \"Melon\",\n\t\tb: \"1F348\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t10\n\t\t]\n\t},\n\ttriangular_flag_on_post: {\n\t\ta: \"Triangular Flag on Post\",\n\t\tb: \"1F6A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mark\",\n\t\t\t\"milestone\",\n\t\t\t\"place\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t14\n\t\t]\n\t},\n\tmonkey: {\n\t\ta: \"Monkey\",\n\t\tb: \"1F412\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"banana\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t48\n\t\t]\n\t},\n\tchristmas_tree: {\n\t\ta: \"Christmas Tree\",\n\t\tb: \"1F384\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"vacation\",\n\t\t\t\"december\",\n\t\t\t\"xmas\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t18\n\t\t]\n\t},\n\tput_litter_in_its_place: {\n\t\ta: \"Put Litter in Its Place Symbol\",\n\t\tb: \"1F6AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"sign\",\n\t\t\t\"human\",\n\t\t\t\"info\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t19\n\t\t]\n\t},\n\tspeaker: {\n\t\ta: \"Speaker\",\n\t\tb: \"1F508\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"silence\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t10\n\t\t]\n\t},\n\tearth_asia: {\n\t\ta: \"Earth Globe Asia-Australia\",\n\t\tb: \"1F30F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"east\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t7\n\t\t]\n\t},\n\tcrossed_flags: {\n\t\ta: \"Crossed Flags\",\n\t\tb: \"1F38C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"border\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t31\n\t\t]\n\t},\n\tjoy: {\n\t\ta: \"Face with Tears of Joy\",\n\t\tb: \"1F602\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cry\",\n\t\t\t\"tears\",\n\t\t\t\"weep\",\n\t\t\t\"happy\",\n\t\t\t\"happytears\",\n\t\t\t\"haha\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t26\n\t\t]\n\t},\n\tsound: {\n\t\ta: \"Speaker with One Sound Wave\",\n\t\tb: \"1F509\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"speaker\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t11\n\t\t]\n\t},\n\twatermelon: {\n\t\ta: \"Watermelon\",\n\t\tb: \"1F349\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"picnic\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t11\n\t\t]\n\t},\n\tgorilla: {\n\t\ta: \"Gorilla\",\n\t\tb: \"1F98D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t37\n\t\t],\n\t\to: 9\n\t},\n\tfireworks: {\n\t\ta: \"Fireworks\",\n\t\tb: \"1F386\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"festival\",\n\t\t\t\"carnival\",\n\t\t\t\"congratulations\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t25\n\t\t]\n\t},\n\tpotable_water: {\n\t\ta: \"Potable Water Symbol\",\n\t\tb: \"1F6B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"liquid\",\n\t\t\t\"restroom\",\n\t\t\t\"cleaning\",\n\t\t\t\"faucet\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t21\n\t\t]\n\t},\n\twheelchair: {\n\t\ta: \"Wheelchair Symbol\",\n\t\tb: \"267F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"disabled\",\n\t\t\t\"a11y\",\n\t\t\t\"accessibility\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t10\n\t\t],\n\t\to: 4\n\t},\n\trolling_on_the_floor_laughing: {\n\t\ta: \"Rolling on the Floor Laughing\",\n\t\tb: \"1F923\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t26\n\t\t],\n\t\to: 9\n\t},\n\tloud_sound: {\n\t\ta: \"Speaker with Three Sound Waves\",\n\t\tb: \"1F50A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"noise\",\n\t\t\t\"noisy\",\n\t\t\t\"speaker\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t12\n\t\t]\n\t},\n\twaving_black_flag: {\n\t\ta: \"Waving Black Flag\",\n\t\tb: \"1F3F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t19\n\t\t],\n\t\to: 7\n\t},\n\ttangerine: {\n\t\ta: \"Tangerine\",\n\t\tb: \"1F34A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"orange\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t12\n\t\t]\n\t},\n\tdog: {\n\t\ta: \"Dog Face\",\n\t\tb: \"1F436\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"friend\",\n\t\t\t\"nature\",\n\t\t\t\"woof\",\n\t\t\t\"puppy\",\n\t\t\t\"pet\",\n\t\t\t\"faithful\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t32\n\t\t]\n\t},\n\tsparkler: {\n\t\ta: \"Firework Sparkler\",\n\t\tb: \"1F387\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"night\",\n\t\t\t\"shine\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t26\n\t\t]\n\t},\n\tglobe_with_meridians: {\n\t\ta: \"Globe with Meridians\",\n\t\tb: \"1F310\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"earth\",\n\t\t\t\"international\",\n\t\t\t\"world\",\n\t\t\t\"internet\",\n\t\t\t\"interweb\",\n\t\t\t\"i18n\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t8\n\t\t]\n\t},\n\tsmiley: {\n\t\ta: \"Smiling Face with Open Mouth\",\n\t\tb: \"1F603\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"haha\",\n\t\t\t\":D\",\n\t\t\t\":)\",\n\t\t\t\"smile\",\n\t\t\t\"funny\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t27\n\t\t],\n\t\tl: [\n\t\t\t\"=)\",\n\t\t\t\"=-)\"\n\t\t],\n\t\tm: \":)\"\n\t},\n\tloudspeaker: {\n\t\ta: \"Public Address Loudspeaker\",\n\t\tb: \"1F4E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"sound\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t25\n\t\t]\n\t},\n\tsparkles: {\n\t\ta: \"Sparkles\",\n\t\tb: \"2728\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"shine\",\n\t\t\t\"shiny\",\n\t\t\t\"cool\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t48\n\t\t]\n\t},\n\tdog2: {\n\t\ta: \"Dog\",\n\t\tb: \"1F415\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"friend\",\n\t\t\t\"doge\",\n\t\t\t\"pet\",\n\t\t\t\"faithful\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t51\n\t\t]\n\t},\n\twaving_white_flag: {\n\t\ta: \"Waving White Flag\",\n\t\tb: \"1F3F3-FE0F\",\n\t\tc: \"1F3F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tworld_map: {\n\t\ta: \"World Map\",\n\t\tb: \"1F5FA-FE0F\",\n\t\tc: \"1F5FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"location\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tlemon: {\n\t\ta: \"Lemon\",\n\t\tb: \"1F34B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t13\n\t\t]\n\t},\n\tmens: {\n\t\ta: \"Mens Symbol\",\n\t\tb: \"1F6B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"toilet\",\n\t\t\t\"restroom\",\n\t\t\t\"wc\",\n\t\t\t\"blue-square\",\n\t\t\t\"gender\",\n\t\t\t\"male\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t29\n\t\t]\n\t},\n\twomens: {\n\t\ta: \"Womens Symbol\",\n\t\tb: \"1F6BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"toilet\",\n\t\t\t\"loo\",\n\t\t\t\"restroom\",\n\t\t\t\"gender\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t30\n\t\t]\n\t},\n\t\"rainbow-flag\": {\n\t\ta: \"Rainbow Flag\",\n\t\tb: \"1F3F3-FE0F-200D-1F308\",\n\t\tc: \"1F3F3-200D-1F308\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t12,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\tsmile: {\n\t\ta: \"Smiling Face with Open Mouth and Smiling Eyes\",\n\t\tb: \"1F604\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"funny\",\n\t\t\t\"haha\",\n\t\t\t\"laugh\",\n\t\t\t\"like\",\n\t\t\t\":D\",\n\t\t\t\":)\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t28\n\t\t],\n\t\tl: [\n\t\t\t\"C:\",\n\t\t\t\"c:\",\n\t\t\t\":D\",\n\t\t\t\":-D\"\n\t\t],\n\t\tm: \":)\"\n\t},\n\tbanana: {\n\t\ta: \"Banana\",\n\t\tb: \"1F34C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"monkey\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t14\n\t\t]\n\t},\n\tmega: {\n\t\ta: \"Cheering Megaphone\",\n\t\tb: \"1F4E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"speaker\",\n\t\t\t\"volume\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t26\n\t\t]\n\t},\n\tjapan: {\n\t\ta: \"Silhouette of Japan\",\n\t\tb: \"1F5FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"japanese\",\n\t\t\t\"asia\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t22\n\t\t]\n\t},\n\tpoodle: {\n\t\ta: \"Poodle\",\n\t\tb: \"1F429\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dog\",\n\t\t\t\"animal\",\n\t\t\t\"101\",\n\t\t\t\"nature\",\n\t\t\t\"pet\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t19\n\t\t]\n\t},\n\tballoon: {\n\t\ta: \"Balloon\",\n\t\tb: \"1F388\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"party\",\n\t\t\t\"celebration\",\n\t\t\t\"birthday\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-ac\": {\n\t\ta: \"Ascension Island Flag\",\n\t\tb: \"1F1E6-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t31\n\t\t]\n\t},\n\tsweat_smile: {\n\t\ta: \"Smiling Face with Open Mouth and Cold Sweat\",\n\t\tb: \"1F605\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hot\",\n\t\t\t\"happy\",\n\t\t\t\"laugh\",\n\t\t\t\"sweat\",\n\t\t\t\"smile\",\n\t\t\t\"relief\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t29\n\t\t]\n\t},\n\tpineapple: {\n\t\ta: \"Pineapple\",\n\t\tb: \"1F34D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t15\n\t\t]\n\t},\n\trestroom: {\n\t\ta: \"Restroom\",\n\t\tb: \"1F6BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"toilet\",\n\t\t\t\"refresh\",\n\t\t\t\"wc\",\n\t\t\t\"gender\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t31\n\t\t]\n\t},\n\tpostal_horn: {\n\t\ta: \"Postal Horn\",\n\t\tb: \"1F4EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"instrument\",\n\t\t\t\"music\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t38\n\t\t]\n\t},\n\twolf: {\n\t\ta: \"Wolf Face\",\n\t\tb: \"1F43A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wild\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t36\n\t\t]\n\t},\n\ttada: {\n\t\ta: \"Party Popper\",\n\t\tb: \"1F389\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"party\",\n\t\t\t\"congratulations\",\n\t\t\t\"birthday\",\n\t\t\t\"magic\",\n\t\t\t\"circus\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t28\n\t\t]\n\t},\n\tsnow_capped_mountain: {\n\t\ta: \"Snow Capped Mountain\",\n\t\tb: \"1F3D4-FE0F\",\n\t\tc: \"1F3D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t37\n\t\t],\n\t\to: 7\n\t},\n\tlaughing: {\n\t\ta: \"Smiling Face with Open Mouth and Tightly-Closed Eyes\",\n\t\tb: \"1F606\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"lol\",\n\t\t\t\"satisfied\",\n\t\t\t\"haha\",\n\t\t\t\"face\",\n\t\t\t\"glad\",\n\t\t\t\"XD\",\n\t\t\t\"laugh\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t30\n\t\t],\n\t\tl: [\n\t\t\t\":>\",\n\t\t\t\":->\"\n\t\t],\n\t\tn: [\n\t\t\t\"satisfied\"\n\t\t]\n\t},\n\tapple: {\n\t\ta: \"Red Apple\",\n\t\tb: \"1F34E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"mac\",\n\t\t\t\"school\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-ad\": {\n\t\ta: \"Andorra Flag\",\n\t\tb: \"1F1E6-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t32\n\t\t]\n\t},\n\tfox_face: {\n\t\ta: \"Fox Face\",\n\t\tb: \"1F98A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t34\n\t\t],\n\t\to: 9\n\t},\n\tconfetti_ball: {\n\t\ta: \"Confetti Ball\",\n\t\tb: \"1F38A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"party\",\n\t\t\t\"birthday\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t29\n\t\t]\n\t},\n\tbell: {\n\t\ta: \"Bell\",\n\t\tb: \"1F514\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"notification\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\",\n\t\t\t\"chime\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t22\n\t\t]\n\t},\n\tmountain: {\n\t\ta: \"Mountain\",\n\t\tb: \"26F0-FE0F\",\n\t\tc: \"26F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"nature\",\n\t\t\t\"environment\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t38\n\t\t],\n\t\to: 5\n\t},\n\tbaby_symbol: {\n\t\ta: \"Baby Symbol\",\n\t\tb: \"1F6BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"child\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t32\n\t\t]\n\t},\n\twc: {\n\t\ta: \"Water Closet\",\n\t\tb: \"1F6BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"toilet\",\n\t\t\t\"restroom\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t34\n\t\t]\n\t},\n\twink: {\n\t\ta: \"Winking Face\",\n\t\tb: \"1F609\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"mischievous\",\n\t\t\t\"secret\",\n\t\t\t\";)\",\n\t\t\t\"smile\",\n\t\t\t\"eye\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t33\n\t\t],\n\t\tl: [\n\t\t\t\";)\",\n\t\t\t\";-)\"\n\t\t],\n\t\tm: \";)\"\n\t},\n\tno_bell: {\n\t\ta: \"Bell with Cancellation Stroke\",\n\t\tb: \"1F515\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"mute\",\n\t\t\t\"quiet\",\n\t\t\t\"silent\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t23\n\t\t]\n\t},\n\tgreen_apple: {\n\t\ta: \"Green Apple\",\n\t\tb: \"1F34F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t17\n\t\t]\n\t},\n\ttanabata_tree: {\n\t\ta: \"Tanabata Tree\",\n\t\tb: \"1F38B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"branch\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-ae\": {\n\t\ta: \"United Arab Emirates Flag\",\n\t\tb: \"1F1E6-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t33\n\t\t]\n\t},\n\tvolcano: {\n\t\ta: \"Volcano\",\n\t\tb: \"1F30B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"nature\",\n\t\t\t\"disaster\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t3\n\t\t]\n\t},\n\tcat: {\n\t\ta: \"Cat Face\",\n\t\tb: \"1F431\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"meow\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"kitten\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-af\": {\n\t\ta: \"Afghanistan Flag\",\n\t\tb: \"1F1E6-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t34\n\t\t]\n\t},\n\tmusical_score: {\n\t\ta: \"Musical Score\",\n\t\tb: \"1F3BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"treble\",\n\t\t\t\"clef\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t22\n\t\t]\n\t},\n\tblush: {\n\t\ta: \"Smiling Face with Smiling Eyes\",\n\t\tb: \"1F60A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"happy\",\n\t\t\t\"flushed\",\n\t\t\t\"crush\",\n\t\t\t\"embarrassed\",\n\t\t\t\"shy\",\n\t\t\t\"joy\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t34\n\t\t],\n\t\tm: \":)\"\n\t},\n\tpear: {\n\t\ta: \"Pear\",\n\t\tb: \"1F350\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t18\n\t\t]\n\t},\n\tbamboo: {\n\t\ta: \"Pine Decoration\",\n\t\tb: \"1F38D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"vegetable\",\n\t\t\t\"panda\",\n\t\t\t\"pine_decoration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t32\n\t\t]\n\t},\n\tpassport_control: {\n\t\ta: \"Passport Control\",\n\t\tb: \"1F6C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"custom\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t43\n\t\t]\n\t},\n\tmount_fuji: {\n\t\ta: \"Mount Fuji\",\n\t\tb: \"1F5FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"mountain\",\n\t\t\t\"nature\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t19\n\t\t]\n\t},\n\tcat2: {\n\t\ta: \"Cat\",\n\t\tb: \"1F408\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"meow\",\n\t\t\t\"pet\",\n\t\t\t\"cats\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t38\n\t\t]\n\t},\n\tmusical_note: {\n\t\ta: \"Musical Note\",\n\t\tb: \"1F3B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"score\",\n\t\t\t\"tone\",\n\t\t\t\"sound\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t15\n\t\t]\n\t},\n\tdolls: {\n\t\ta: \"Japanese Dolls\",\n\t\tb: \"1F38E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"toy\",\n\t\t\t\"kimono\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t33\n\t\t]\n\t},\n\tlion_face: {\n\t\ta: \"Lion Face\",\n\t\tb: \"1F981\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t25\n\t\t],\n\t\to: 8\n\t},\n\tcamping: {\n\t\ta: \"Camping\",\n\t\tb: \"1F3D5-FE0F\",\n\t\tc: \"1F3D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"outdoors\",\n\t\t\t\"tent\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t38\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ag\": {\n\t\ta: \"Antigua & Barbuda Flag\",\n\t\tb: \"1F1E6-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t35\n\t\t]\n\t},\n\tcustoms: {\n\t\ta: \"Customs\",\n\t\tb: \"1F6C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"passport\",\n\t\t\t\"border\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t44\n\t\t]\n\t},\n\tyum: {\n\t\ta: \"Face Savouring Delicious Food\",\n\t\tb: \"1F60B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"tongue\",\n\t\t\t\"smile\",\n\t\t\t\"face\",\n\t\t\t\"silly\",\n\t\t\t\"yummy\",\n\t\t\t\"nom\",\n\t\t\t\"delicious\",\n\t\t\t\"savouring\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t35\n\t\t]\n\t},\n\tpeach: {\n\t\ta: \"Peach\",\n\t\tb: \"1F351\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t19\n\t\t]\n\t},\n\ttiger: {\n\t\ta: \"Tiger Face\",\n\t\tb: \"1F42F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cat\",\n\t\t\t\"danger\",\n\t\t\t\"wild\",\n\t\t\t\"nature\",\n\t\t\t\"roar\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t25\n\t\t]\n\t},\n\tnotes: {\n\t\ta: \"Multiple Musical Notes\",\n\t\tb: \"1F3B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"score\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t16\n\t\t]\n\t},\n\tflags: {\n\t\ta: \"Carp Streamer\",\n\t\tb: \"1F38F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fish\",\n\t\t\t\"japanese\",\n\t\t\t\"koinobori\",\n\t\t\t\"carp\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t34\n\t\t]\n\t},\n\tbeach_with_umbrella: {\n\t\ta: \"Beach with Umbrella\",\n\t\tb: \"1F3D6-FE0F\",\n\t\tc: \"1F3D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t39\n\t\t],\n\t\to: 7\n\t},\n\tcherries: {\n\t\ta: \"Cherries\",\n\t\tb: \"1F352\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fruit\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-ai\": {\n\t\ta: \"Anguilla Flag\",\n\t\tb: \"1F1E6-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t36\n\t\t]\n\t},\n\tbaggage_claim: {\n\t\ta: \"Baggage Claim\",\n\t\tb: \"1F6C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"airport\",\n\t\t\t\"transport\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t45\n\t\t]\n\t},\n\tsunglasses: {\n\t\ta: \"Smiling Face with Sunglasses\",\n\t\tb: \"1F60E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cool\",\n\t\t\t\"smile\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"sunglass\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t38\n\t\t],\n\t\tl: [\n\t\t\t\"8)\"\n\t\t]\n\t},\n\tleft_luggage: {\n\t\ta: \"Left Luggage\",\n\t\tb: \"1F6C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t46\n\t\t]\n\t},\n\twind_chime: {\n\t\ta: \"Wind Chime\",\n\t\tb: \"1F390\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"ding\",\n\t\t\t\"spring\",\n\t\t\t\"bell\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t35\n\t\t]\n\t},\n\tstrawberry: {\n\t\ta: \"Strawberry\",\n\t\tb: \"1F353\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t21\n\t\t]\n\t},\n\tdesert: {\n\t\ta: \"Desert\",\n\t\tb: \"1F3DC-FE0F\",\n\t\tc: \"1F3DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"warm\",\n\t\t\t\"saharah\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\tstudio_microphone: {\n\t\ta: \"Studio Microphone\",\n\t\tb: \"1F399-FE0F\",\n\t\tc: \"1F399\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sing\",\n\t\t\t\"recording\",\n\t\t\t\"artist\",\n\t\t\t\"talkshow\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-al\": {\n\t\ta: \"Albania Flag\",\n\t\tb: \"1F1E6-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t37\n\t\t]\n\t},\n\ttiger2: {\n\t\ta: \"Tiger\",\n\t\tb: \"1F405\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"roar\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t35\n\t\t]\n\t},\n\theart_eyes: {\n\t\ta: \"Smiling Face with Heart-Shaped Eyes\",\n\t\tb: \"1F60D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"crush\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t37\n\t\t]\n\t},\n\tdesert_island: {\n\t\ta: \"Desert Island\",\n\t\tb: \"1F3DD-FE0F\",\n\t\tc: \"1F3DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"tropical\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t46\n\t\t],\n\t\to: 7\n\t},\n\tkiwifruit: {\n\t\ta: \"Kiwifruit\",\n\t\tb: \"1F95D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t9\n\t\t],\n\t\to: 9\n\t},\n\trice_scene: {\n\t\ta: \"Moon Viewing Ceremony\",\n\t\tb: \"1F391\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"japan\",\n\t\t\t\"asia\",\n\t\t\t\"tsukimi\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t36\n\t\t]\n\t},\n\tkissing_heart: {\n\t\ta: \"Face Throwing a Kiss\",\n\t\tb: \"1F618\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t48\n\t\t],\n\t\tl: [\n\t\t\t\":*\",\n\t\t\t\":-*\"\n\t\t]\n\t},\n\twarning: {\n\t\ta: \"Warning Sign\",\n\t\tb: \"26A0-FE0F\",\n\t\tc: \"26A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"exclamation\",\n\t\t\t\"wip\",\n\t\t\t\"alert\",\n\t\t\t\"error\",\n\t\t\t\"problem\",\n\t\t\t\"issue\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t20\n\t\t],\n\t\to: 4\n\t},\n\t\"flag-am\": {\n\t\ta: \"Armenia Flag\",\n\t\tb: \"1F1E6-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t38\n\t\t]\n\t},\n\tleopard: {\n\t\ta: \"Leopard\",\n\t\tb: \"1F406\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t36\n\t\t]\n\t},\n\tlevel_slider: {\n\t\ta: \"Level Slider\",\n\t\tb: \"1F39A-FE0F\",\n\t\tc: \"1F39A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"scale\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\thorse: {\n\t\ta: \"Horse Face\",\n\t\tb: \"1F434\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"brown\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t30\n\t\t]\n\t},\n\tchildren_crossing: {\n\t\ta: \"Children Crossing\",\n\t\tb: \"1F6B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"school\",\n\t\t\t\"warning\",\n\t\t\t\"danger\",\n\t\t\t\"sign\",\n\t\t\t\"driving\",\n\t\t\t\"yellow-diamond\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t28\n\t\t]\n\t},\n\tribbon: {\n\t\ta: \"Ribbon\",\n\t\tb: \"1F380\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"decoration\",\n\t\t\t\"pink\",\n\t\t\t\"girl\",\n\t\t\t\"bowtie\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t14\n\t\t]\n\t},\n\tnational_park: {\n\t\ta: \"National Park\",\n\t\tb: \"1F3DE-FE0F\",\n\t\tc: \"1F3DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"environment\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\tcontrol_knobs: {\n\t\ta: \"Control Knobs\",\n\t\tb: \"1F39B-FE0F\",\n\t\tc: \"1F39B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tkissing: {\n\t\ta: \"Kissing Face\",\n\t\tb: \"1F617\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"face\",\n\t\t\t\"3\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t47\n\t\t]\n\t},\n\ttomato: {\n\t\ta: \"Tomato\",\n\t\tb: \"1F345\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-ao\": {\n\t\ta: \"Angola Flag\",\n\t\tb: \"1F1E6-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t39\n\t\t]\n\t},\n\tstadium: {\n\t\ta: \"Stadium\",\n\t\tb: \"1F3DF-FE0F\",\n\t\tc: \"1F3DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"place\",\n\t\t\t\"sports\",\n\t\t\t\"concert\",\n\t\t\t\"venue\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t48\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-aq\": {\n\t\ta: \"Antarctica Flag\",\n\t\tb: \"1F1E6-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t40\n\t\t]\n\t},\n\tgift: {\n\t\ta: \"Wrapped Present\",\n\t\tb: \"1F381\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"present\",\n\t\t\t\"birthday\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t15\n\t\t]\n\t},\n\tno_entry: {\n\t\ta: \"No Entry\",\n\t\tb: \"26D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"limit\",\n\t\t\t\"security\",\n\t\t\t\"privacy\",\n\t\t\t\"bad\",\n\t\t\t\"denied\",\n\t\t\t\"stop\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t35\n\t\t],\n\t\to: 5\n\t},\n\tkissing_smiling_eyes: {\n\t\ta: \"Kissing Face with Smiling Eyes\",\n\t\tb: \"1F619\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t49\n\t\t]\n\t},\n\tcoconut: {\n\t\ta: \"Coconut\",\n\t\tb: \"1F965\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\tracehorse: {\n\t\ta: \"Horse\",\n\t\tb: \"1F40E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"gamble\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t44\n\t\t]\n\t},\n\tmicrophone: {\n\t\ta: \"Microphone\",\n\t\tb: \"1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"music\",\n\t\t\t\"PA\",\n\t\t\t\"sing\",\n\t\t\t\"talkshow\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t50\n\t\t]\n\t},\n\tclassical_building: {\n\t\ta: \"Classical Building\",\n\t\tb: \"1F3DB-FE0F\",\n\t\tc: \"1F3DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"art\",\n\t\t\t\"culture\",\n\t\t\t\"history\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tno_entry_sign: {\n\t\ta: \"No Entry Sign\",\n\t\tb: \"1F6AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"forbid\",\n\t\t\t\"stop\",\n\t\t\t\"limit\",\n\t\t\t\"denied\",\n\t\t\t\"disallow\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t16\n\t\t]\n\t},\n\treminder_ribbon: {\n\t\ta: \"Reminder Ribbon\",\n\t\tb: \"1F397-FE0F\",\n\t\tc: \"1F397\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"cause\",\n\t\t\t\"support\",\n\t\t\t\"awareness\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t40\n\t\t],\n\t\to: 7\n\t},\n\tkissing_closed_eyes: {\n\t\ta: \"Kissing Face with Closed Eyes\",\n\t\tb: \"1F61A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t50\n\t\t]\n\t},\n\tunicorn_face: {\n\t\ta: \"Unicorn Face\",\n\t\tb: \"1F984\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t28\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-ar\": {\n\t\ta: \"Argentina Flag\",\n\t\tb: \"1F1E6-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t41\n\t\t]\n\t},\n\theadphones: {\n\t\ta: \"Headphone\",\n\t\tb: \"1F3A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"score\",\n\t\t\t\"gadgets\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t1\n\t\t]\n\t},\n\tavocado: {\n\t\ta: \"Avocado\",\n\t\tb: \"1F951\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t49\n\t\t],\n\t\to: 9\n\t},\n\trelaxed: {\n\t\ta: \"White Smiling Face\",\n\t\tb: \"263A-FE0F\",\n\t\tc: \"263A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"blush\",\n\t\t\t\"massage\",\n\t\t\t\"happiness\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t41\n\t\t],\n\t\to: 1\n\t},\n\tzebra_face: {\n\t\ta: \"Zebra Face\",\n\t\tb: \"1F993\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t43\n\t\t],\n\t\to: 10\n\t},\n\teggplant: {\n\t\ta: \"Aubergine\",\n\t\tb: \"1F346\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"food\",\n\t\t\t\"aubergine\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t8\n\t\t]\n\t},\n\tradio: {\n\t\ta: \"Radio\",\n\t\tb: \"1F4FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"music\",\n\t\t\t\"podcast\",\n\t\t\t\"program\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t50\n\t\t]\n\t},\n\tbuilding_construction: {\n\t\ta: \"Building Construction\",\n\t\tb: \"1F3D7-FE0F\",\n\t\tc: \"1F3D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"wip\",\n\t\t\t\"working\",\n\t\t\t\"progress\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t40\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-as\": {\n\t\ta: \"American Samoa Flag\",\n\t\tb: \"1F1E6-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t42\n\t\t]\n\t},\n\tadmission_tickets: {\n\t\ta: \"Admission Tickets\",\n\t\tb: \"1F39F-FE0F\",\n\t\tc: \"1F39F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\tno_bicycles: {\n\t\ta: \"No Bicycles\",\n\t\tb: \"1F6B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cyclist\",\n\t\t\t\"prohibited\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t24\n\t\t]\n\t},\n\tno_smoking: {\n\t\ta: \"No Smoking Symbol\",\n\t\tb: \"1F6AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cigarette\",\n\t\t\t\"blue-square\",\n\t\t\t\"smell\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t18\n\t\t]\n\t},\n\tslightly_smiling_face: {\n\t\ta: \"Slightly Smiling Face\",\n\t\tb: \"1F642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t38\n\t\t],\n\t\tl: [\n\t\t\t\":)\",\n\t\t\t\"(:\",\n\t\t\t\":-)\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-at\": {\n\t\ta: \"Austria Flag\",\n\t\tb: \"1F1E6-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t43\n\t\t]\n\t},\n\tticket: {\n\t\ta: \"Ticket\",\n\t\tb: \"1F3AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"event\",\n\t\t\t\"concert\",\n\t\t\t\"pass\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t5\n\t\t]\n\t},\n\tsaxophone: {\n\t\ta: \"Saxophone\",\n\t\tb: \"1F3B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\",\n\t\t\t\"jazz\",\n\t\t\t\"blues\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t17\n\t\t]\n\t},\n\tdeer: {\n\t\ta: \"Deer\",\n\t\tb: \"1F98C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"horns\",\n\t\t\t\"venison\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\thouse_buildings: {\n\t\ta: \"House Buildings\",\n\t\tb: \"1F3D8-FE0F\",\n\t\tc: \"1F3D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\tpotato: {\n\t\ta: \"Potato\",\n\t\tb: \"1F954\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"tuber\",\n\t\t\t\"vegatable\",\n\t\t\t\"starch\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\tguitar: {\n\t\ta: \"Guitar\",\n\t\tb: \"1F3B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t18\n\t\t]\n\t},\n\tcarrot: {\n\t\ta: \"Carrot\",\n\t\tb: \"1F955\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"food\",\n\t\t\t\"orange\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t1\n\t\t],\n\t\to: 9\n\t},\n\tcityscape: {\n\t\ta: \"Cityscape\",\n\t\tb: \"1F3D9-FE0F\",\n\t\tc: \"1F3D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"night life\",\n\t\t\t\"urban\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-au\": {\n\t\ta: \"Australia Flag\",\n\t\tb: \"1F1E6-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t44\n\t\t]\n\t},\n\tdo_not_litter: {\n\t\ta: \"Do Not Litter Symbol\",\n\t\tb: \"1F6AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"trash\",\n\t\t\t\"bin\",\n\t\t\t\"garbage\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t20\n\t\t]\n\t},\n\thugging_face: {\n\t\ta: \"Hugging Face\",\n\t\tb: \"1F917\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t31\n\t\t],\n\t\to: 8\n\t},\n\tcow: {\n\t\ta: \"Cow Face\",\n\t\tb: \"1F42E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beef\",\n\t\t\t\"ox\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"moo\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t24\n\t\t]\n\t},\n\tmedal: {\n\t\ta: \"Medal\",\n\t\tb: \"1F396-FE0F\",\n\t\tc: \"1F396\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t39\n\t\t],\n\t\to: 7\n\t},\n\tmusical_keyboard: {\n\t\ta: \"Musical Keyboard\",\n\t\tb: \"1F3B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"piano\",\n\t\t\t\"instrument\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t19\n\t\t]\n\t},\n\tcorn: {\n\t\ta: \"Ear of Maize\",\n\t\tb: \"1F33D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"vegetable\",\n\t\t\t\"plant\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t51\n\t\t]\n\t},\n\tderelict_house_building: {\n\t\ta: \"Derelict House Building\",\n\t\tb: \"1F3DA-FE0F\",\n\t\tc: \"1F3DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\t\"non-potable_water\": {\n\t\ta: \"Non-Potable Water Symbol\",\n\t\tb: \"1F6B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"faucet\",\n\t\t\t\"tap\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t22\n\t\t]\n\t},\n\ttrophy: {\n\t\ta: \"Trophy\",\n\t\tb: \"1F3C6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"win\",\n\t\t\t\"award\",\n\t\t\t\"contest\",\n\t\t\t\"place\",\n\t\t\t\"ftw\",\n\t\t\t\"ceremony\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-aw\": {\n\t\ta: \"Aruba Flag\",\n\t\tb: \"1F1E6-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t45\n\t\t]\n\t},\n\t\"star-struck\": {\n\t\ta: \"Grinning Face with Star Eyes\",\n\t\tb: \"1F929\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t49\n\t\t],\n\t\tn: [\n\t\t\t\"grinning_face_with_star_eyes\"\n\t\t],\n\t\to: 10\n\t},\n\tox: {\n\t\ta: \"Ox\",\n\t\tb: \"1F402\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cow\",\n\t\t\t\"beef\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t32\n\t\t]\n\t},\n\ttrumpet: {\n\t\ta: \"Trumpet\",\n\t\tb: \"1F3BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"brass\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t20\n\t\t]\n\t},\n\thot_pepper: {\n\t\ta: \"Hot Pepper\",\n\t\tb: \"1F336-FE0F\",\n\t\tc: \"1F336\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"spicy\",\n\t\t\t\"chilli\",\n\t\t\t\"chili\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tsports_medal: {\n\t\ta: \"Sports Medal\",\n\t\tb: \"1F3C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ax\": {\n\t\ta: \"Åland Islands Flag\",\n\t\tb: \"1F1E6-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t46\n\t\t]\n\t},\n\twater_buffalo: {\n\t\ta: \"Water Buffalo\",\n\t\tb: \"1F403\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"ox\",\n\t\t\t\"cow\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t33\n\t\t]\n\t},\n\tno_pedestrians: {\n\t\ta: \"No Pedestrians\",\n\t\tb: \"1F6B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rules\",\n\t\t\t\"crossing\",\n\t\t\t\"walking\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t27\n\t\t]\n\t},\n\tthinking_face: {\n\t\ta: \"Thinking Face\",\n\t\tb: \"1F914\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t28\n\t\t],\n\t\to: 8\n\t},\n\thouse: {\n\t\ta: \"House Building\",\n\t\tb: \"1F3E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"home\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t49\n\t\t]\n\t},\n\tno_mobile_phones: {\n\t\ta: \"No Mobile Phones\",\n\t\tb: \"1F4F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"iphone\",\n\t\t\t\"mute\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t44\n\t\t]\n\t},\n\t\"flag-az\": {\n\t\ta: \"Azerbaijan Flag\",\n\t\tb: \"1F1E6-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t47\n\t\t]\n\t},\n\tfirst_place_medal: {\n\t\ta: \"First Place Medal\",\n\t\tb: \"1F947\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t42\n\t\t],\n\t\to: 9\n\t},\n\thouse_with_garden: {\n\t\ta: \"House with Garden\",\n\t\tb: \"1F3E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"home\",\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t50\n\t\t]\n\t},\n\tviolin: {\n\t\ta: \"Violin\",\n\t\tb: \"1F3BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\",\n\t\t\t\"orchestra\",\n\t\t\t\"symphony\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t21\n\t\t]\n\t},\n\tface_with_raised_eyebrow: {\n\t\ta: \"Face with One Eyebrow Raised\",\n\t\tb: \"1F928\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t48\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_one_eyebrow_raised\"\n\t\t],\n\t\to: 10\n\t},\n\tcucumber: {\n\t\ta: \"Cucumber\",\n\t\tb: \"1F952\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"pickle\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\tcow2: {\n\t\ta: \"Cow\",\n\t\tb: \"1F404\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beef\",\n\t\t\t\"ox\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"moo\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-ba\": {\n\t\ta: \"Bosnia & Herzegovina Flag\",\n\t\tb: \"1F1E7-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t0,\n\t\t\t48\n\t\t]\n\t},\n\tpig: {\n\t\ta: \"Pig Face\",\n\t\tb: \"1F437\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"oink\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t33\n\t\t]\n\t},\n\tdrum_with_drumsticks: {\n\t\ta: \"Drum with Drumsticks\",\n\t\tb: \"1F941\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t37\n\t\t],\n\t\to: 9\n\t},\n\tunderage: {\n\t\ta: \"No One Under Eighteen Symbol\",\n\t\tb: \"1F51E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"18\",\n\t\t\t\"drink\",\n\t\t\t\"pub\",\n\t\t\t\"night\",\n\t\t\t\"minor\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t32\n\t\t]\n\t},\n\tbroccoli: {\n\t\ta: \"Broccoli\",\n\t\tb: \"1F966\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\toffice: {\n\t\ta: \"Office Building\",\n\t\tb: \"1F3E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"bureau\",\n\t\t\t\"work\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t51\n\t\t]\n\t},\n\tsecond_place_medal: {\n\t\ta: \"Second Place Medal\",\n\t\tb: \"1F948\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t43\n\t\t],\n\t\to: 9\n\t},\n\tneutral_face: {\n\t\ta: \"Neutral Face\",\n\t\tb: \"1F610\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"indifference\",\n\t\t\t\"meh\",\n\t\t\t\":|\",\n\t\t\t\"neutral\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t40\n\t\t],\n\t\tl: [\n\t\t\t\":|\",\n\t\t\t\":-|\"\n\t\t]\n\t},\n\tthird_place_medal: {\n\t\ta: \"Third Place Medal\",\n\t\tb: \"1F949\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t44\n\t\t],\n\t\to: 9\n\t},\n\tmushroom: {\n\t\ta: \"Mushroom\",\n\t\tb: \"1F344\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-bb\": {\n\t\ta: \"Barbados Flag\",\n\t\tb: \"1F1E7-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t49\n\t\t]\n\t},\n\tradioactive_sign: {\n\t\ta: \"Radioactive Sign\",\n\t\tb: \"2622-FE0F\",\n\t\tc: \"2622\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t33\n\t\t],\n\t\to: 1\n\t},\n\tpig2: {\n\t\ta: \"Pig\",\n\t\tb: \"1F416\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t0\n\t\t]\n\t},\n\texpressionless: {\n\t\ta: \"Expressionless Face\",\n\t\tb: \"1F611\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"indifferent\",\n\t\t\t\"-_-\",\n\t\t\t\"meh\",\n\t\t\t\"deadpan\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t41\n\t\t]\n\t},\n\tiphone: {\n\t\ta: \"Mobile Phone\",\n\t\tb: \"1F4F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"apple\",\n\t\t\t\"gadgets\",\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t40\n\t\t]\n\t},\n\tpost_office: {\n\t\ta: \"Japanese Post Office\",\n\t\tb: \"1F3E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"envelope\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t0\n\t\t]\n\t},\n\teuropean_post_office: {\n\t\ta: \"European Post Office\",\n\t\tb: \"1F3E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"email\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t1\n\t\t]\n\t},\n\tsoccer: {\n\t\ta: \"Soccer Ball\",\n\t\tb: \"26BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"football\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t26\n\t\t],\n\t\to: 5\n\t},\n\tboar: {\n\t\ta: \"Boar\",\n\t\tb: \"1F417\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t1\n\t\t]\n\t},\n\tpeanuts: {\n\t\ta: \"Peanuts\",\n\t\tb: \"1F95C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"nut\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t8\n\t\t],\n\t\to: 9\n\t},\n\tcalling: {\n\t\ta: \"Mobile Phone with Rightwards Arrow at Left\",\n\t\tb: \"1F4F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"iphone\",\n\t\t\t\"incoming\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t41\n\t\t]\n\t},\n\tbiohazard_sign: {\n\t\ta: \"Biohazard Sign\",\n\t\tb: \"2623-FE0F\",\n\t\tc: \"2623\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t34\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bd\": {\n\t\ta: \"Bangladesh Flag\",\n\t\tb: \"1F1E7-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t50\n\t\t]\n\t},\n\tno_mouth: {\n\t\ta: \"Face Without Mouth\",\n\t\tb: \"1F636\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hellokitty\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t26\n\t\t]\n\t},\n\tface_with_rolling_eyes: {\n\t\ta: \"Face with Rolling Eyes\",\n\t\tb: \"1F644\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t40\n\t\t],\n\t\to: 8\n\t},\n\tphone: {\n\t\ta: \"Black Telephone\",\n\t\tb: \"260E-FE0F\",\n\t\tc: \"260E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"communication\",\n\t\t\t\"dial\",\n\t\t\t\"telephone\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t21\n\t\t],\n\t\tn: [\n\t\t\t\"telephone\"\n\t\t],\n\t\to: 1\n\t},\n\tpig_nose: {\n\t\ta: \"Pig Nose\",\n\t\tb: \"1F43D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"oink\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t39\n\t\t]\n\t},\n\tchestnut: {\n\t\ta: \"Chestnut\",\n\t\tb: \"1F330\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"squirrel\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t38\n\t\t]\n\t},\n\tarrow_up: {\n\t\ta: \"Upwards Black Arrow\",\n\t\tb: \"2B06-FE0F\",\n\t\tc: \"2B06\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"continue\",\n\t\t\t\"top\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t18\n\t\t],\n\t\to: 4\n\t},\n\thospital: {\n\t\ta: \"Hospital\",\n\t\tb: \"1F3E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"health\",\n\t\t\t\"surgery\",\n\t\t\t\"doctor\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-be\": {\n\t\ta: \"Belgium Flag\",\n\t\tb: \"1F1E7-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t51\n\t\t]\n\t},\n\tbaseball: {\n\t\ta: \"Baseball\",\n\t\tb: \"26BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t27\n\t\t],\n\t\to: 5\n\t},\n\tsmirk: {\n\t\ta: \"Smirking Face\",\n\t\tb: \"1F60F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"mean\",\n\t\t\t\"prank\",\n\t\t\t\"smug\",\n\t\t\t\"sarcasm\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t39\n\t\t]\n\t},\n\tarrow_upper_right: {\n\t\ta: \"North East Arrow\",\n\t\tb: \"2197-FE0F\",\n\t\tc: \"2197\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"point\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"northeast\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bf\": {\n\t\ta: \"Burkina Faso Flag\",\n\t\tb: \"1F1E7-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\tbasketball: {\n\t\ta: \"Basketball and Hoop\",\n\t\tb: \"1F3C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"NBA\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t26\n\t\t]\n\t},\n\tram: {\n\t\ta: \"Ram\",\n\t\tb: \"1F40F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"sheep\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t45\n\t\t]\n\t},\n\tbank: {\n\t\ta: \"Bank\",\n\t\tb: \"1F3E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"cash\",\n\t\t\t\"business\",\n\t\t\t\"enterprise\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t3\n\t\t]\n\t},\n\tbread: {\n\t\ta: \"Bread\",\n\t\tb: \"1F35E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"wheat\",\n\t\t\t\"breakfast\",\n\t\t\t\"toast\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t32\n\t\t]\n\t},\n\ttelephone_receiver: {\n\t\ta: \"Telephone Receiver\",\n\t\tb: \"1F4DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"communication\",\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t21\n\t\t]\n\t},\n\tcroissant: {\n\t\ta: \"Croissant\",\n\t\tb: \"1F950\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"bread\",\n\t\t\t\"french\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t48\n\t\t],\n\t\to: 9\n\t},\n\tpager: {\n\t\ta: \"Pager\",\n\t\tb: \"1F4DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bbcall\",\n\t\t\t\"oldschool\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t22\n\t\t]\n\t},\n\tsheep: {\n\t\ta: \"Sheep\",\n\t\tb: \"1F411\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wool\",\n\t\t\t\"shipit\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t47\n\t\t]\n\t},\n\tarrow_right: {\n\t\ta: \"Black Rightwards Arrow\",\n\t\tb: \"27A1-FE0F\",\n\t\tc: \"27A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"next\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t12\n\t\t],\n\t\to: 1\n\t},\n\tpersevere: {\n\t\ta: \"Persevering Face\",\n\t\tb: \"1F623\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sick\",\n\t\t\t\"no\",\n\t\t\t\"upset\",\n\t\t\t\"oops\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-bg\": {\n\t\ta: \"Bulgaria Flag\",\n\t\tb: \"1F1E7-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\tvolleyball: {\n\t\ta: \"Volleyball\",\n\t\tb: \"1F3D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t33\n\t\t],\n\t\to: 8\n\t},\n\thotel: {\n\t\ta: \"Hotel\",\n\t\tb: \"1F3E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"accomodation\",\n\t\t\t\"checkin\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t5\n\t\t]\n\t},\n\tarrow_lower_right: {\n\t\ta: \"South East Arrow\",\n\t\tb: \"2198-FE0F\",\n\t\tc: \"2198\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"southeast\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t37\n\t\t],\n\t\to: 1\n\t},\n\tgoat: {\n\t\ta: \"Goat\",\n\t\tb: \"1F410\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-bh\": {\n\t\ta: \"Bahrain Flag\",\n\t\tb: \"1F1E7-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t2\n\t\t]\n\t},\n\tlove_hotel: {\n\t\ta: \"Love Hotel\",\n\t\tb: \"1F3E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"dating\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t6\n\t\t]\n\t},\n\tdisappointed_relieved: {\n\t\ta: \"Disappointed but Relieved Face\",\n\t\tb: \"1F625\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"phew\",\n\t\t\t\"sweat\",\n\t\t\t\"nervous\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t9\n\t\t]\n\t},\n\tbaguette_bread: {\n\t\ta: \"Baguette Bread\",\n\t\tb: \"1F956\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"bread\",\n\t\t\t\"french\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t2\n\t\t],\n\t\to: 9\n\t},\n\tfootball: {\n\t\ta: \"American Football\",\n\t\tb: \"1F3C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"NFL\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t26\n\t\t]\n\t},\n\tfax: {\n\t\ta: \"Fax Machine\",\n\t\tb: \"1F4E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"technology\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t23\n\t\t]\n\t},\n\tconvenience_store: {\n\t\ta: \"Convenience Store\",\n\t\tb: \"1F3EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"shopping\",\n\t\t\t\"groceries\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t7\n\t\t]\n\t},\n\tdromedary_camel: {\n\t\ta: \"Dromedary Camel\",\n\t\tb: \"1F42A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"hot\",\n\t\t\t\"desert\",\n\t\t\t\"hump\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t20\n\t\t]\n\t},\n\tarrow_down: {\n\t\ta: \"Downwards Black Arrow\",\n\t\tb: \"2B07-FE0F\",\n\t\tc: \"2B07\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t19\n\t\t],\n\t\to: 4\n\t},\n\tbattery: {\n\t\ta: \"Battery\",\n\t\tb: \"1F50B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"power\",\n\t\t\t\"energy\",\n\t\t\t\"sustain\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t13\n\t\t]\n\t},\n\trugby_football: {\n\t\ta: \"Rugby Football\",\n\t\tb: \"1F3C9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"team\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t27\n\t\t]\n\t},\n\tpretzel: {\n\t\ta: \"Pretzel\",\n\t\tb: \"1F968\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\topen_mouth: {\n\t\ta: \"Face with Open Mouth\",\n\t\tb: \"1F62E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"surprise\",\n\t\t\t\"impressed\",\n\t\t\t\"wow\",\n\t\t\t\"whoa\",\n\t\t\t\":O\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t18\n\t\t],\n\t\tl: [\n\t\t\t\":o\",\n\t\t\t\":-o\",\n\t\t\t\":O\",\n\t\t\t\":-O\"\n\t\t]\n\t},\n\t\"flag-bi\": {\n\t\ta: \"Burundi Flag\",\n\t\tb: \"1F1E7-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-bj\": {\n\t\ta: \"Benin Flag\",\n\t\tb: \"1F1E7-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t4\n\t\t]\n\t},\n\tpancakes: {\n\t\ta: \"Pancakes\",\n\t\tb: \"1F95E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"flapjacks\",\n\t\t\t\"hotcakes\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t10\n\t\t],\n\t\to: 9\n\t},\n\tschool: {\n\t\ta: \"School\",\n\t\tb: \"1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"student\",\n\t\t\t\"education\",\n\t\t\t\"learn\",\n\t\t\t\"teach\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t8\n\t\t]\n\t},\n\ttennis: {\n\t\ta: \"Tennis Racquet and Ball\",\n\t\tb: \"1F3BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t24\n\t\t]\n\t},\n\tzipper_mouth_face: {\n\t\ta: \"Zipper-Mouth Face\",\n\t\tb: \"1F910\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sealed\",\n\t\t\t\"zipper\",\n\t\t\t\"secret\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tcamel: {\n\t\ta: \"Bactrian Camel\",\n\t\tb: \"1F42B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"hot\",\n\t\t\t\"desert\",\n\t\t\t\"hump\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t21\n\t\t]\n\t},\n\tarrow_lower_left: {\n\t\ta: \"South West Arrow\",\n\t\tb: \"2199-FE0F\",\n\t\tc: \"2199\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"southwest\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t38\n\t\t],\n\t\to: 1\n\t},\n\telectric_plug: {\n\t\ta: \"Electric Plug\",\n\t\tb: \"1F50C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"charger\",\n\t\t\t\"power\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t14\n\t\t]\n\t},\n\tcheese_wedge: {\n\t\ta: \"Cheese Wedge\",\n\t\tb: \"1F9C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t48\n\t\t],\n\t\to: 8\n\t},\n\thushed: {\n\t\ta: \"Hushed Face\",\n\t\tb: \"1F62F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"woo\",\n\t\t\t\"shh\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t19\n\t\t]\n\t},\n\tcomputer: {\n\t\ta: \"Personal Computer\",\n\t\tb: \"1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"laptop\",\n\t\t\t\"screen\",\n\t\t\t\"display\",\n\t\t\t\"monitor\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t38\n\t\t]\n\t},\n\tgiraffe_face: {\n\t\ta: \"Giraffe Face\",\n\t\tb: \"1F992\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t42\n\t\t],\n\t\to: 10\n\t},\n\t\"8ball\": {\n\t\ta: \"Billiards\",\n\t\tb: \"1F3B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pool\",\n\t\t\t\"hobby\",\n\t\t\t\"game\",\n\t\t\t\"luck\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-bl\": {\n\t\ta: \"St. Barthélemy Flag\",\n\t\tb: \"1F1E7-1F1F1\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t5\n\t\t]\n\t},\n\tarrow_left: {\n\t\ta: \"Leftwards Black Arrow\",\n\t\tb: \"2B05-FE0F\",\n\t\tc: \"2B05\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"previous\",\n\t\t\t\"back\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t17\n\t\t],\n\t\to: 4\n\t},\n\tdepartment_store: {\n\t\ta: \"Department Store\",\n\t\tb: \"1F3EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"shopping\",\n\t\t\t\"mall\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t9\n\t\t]\n\t},\n\tmeat_on_bone: {\n\t\ta: \"Meat on Bone\",\n\t\tb: \"1F356\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"food\",\n\t\t\t\"drumstick\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t24\n\t\t]\n\t},\n\tarrow_upper_left: {\n\t\ta: \"North West Arrow\",\n\t\tb: \"2196-FE0F\",\n\t\tc: \"2196\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"point\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"northwest\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t35\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bm\": {\n\t\ta: \"Bermuda Flag\",\n\t\tb: \"1F1E7-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t6\n\t\t]\n\t},\n\tsleepy: {\n\t\ta: \"Sleepy Face\",\n\t\tb: \"1F62A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"rest\",\n\t\t\t\"nap\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t14\n\t\t]\n\t},\n\tbowling: {\n\t\ta: \"Bowling\",\n\t\tb: \"1F3B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"fun\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t13\n\t\t]\n\t},\n\tfactory: {\n\t\ta: \"Factory\",\n\t\tb: \"1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"industry\",\n\t\t\t\"pollution\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t10\n\t\t]\n\t},\n\tdesktop_computer: {\n\t\ta: \"Desktop Computer\",\n\t\tb: \"1F5A5-FE0F\",\n\t\tc: \"1F5A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"computing\",\n\t\t\t\"screen\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t51\n\t\t],\n\t\to: 7\n\t},\n\telephant: {\n\t\ta: \"Elephant\",\n\t\tb: \"1F418\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"nose\",\n\t\t\t\"th\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t2\n\t\t]\n\t},\n\trhinoceros: {\n\t\ta: \"Rhinoceros\",\n\t\tb: \"1F98F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"horn\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t39\n\t\t],\n\t\to: 9\n\t},\n\tarrow_up_down: {\n\t\ta: \"Up Down Arrow\",\n\t\tb: \"2195-FE0F\",\n\t\tc: \"2195\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"way\",\n\t\t\t\"vertical\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t34\n\t\t],\n\t\to: 1\n\t},\n\tcricket_bat_and_ball: {\n\t\ta: \"Cricket Bat and Ball\",\n\t\tb: \"1F3CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t32\n\t\t],\n\t\to: 8\n\t},\n\tprinter: {\n\t\ta: \"Printer\",\n\t\tb: \"1F5A8-FE0F\",\n\t\tc: \"1F5A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"paper\",\n\t\t\t\"ink\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\tpoultry_leg: {\n\t\ta: \"Poultry Leg\",\n\t\tb: \"1F357\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"meat\",\n\t\t\t\"drumstick\",\n\t\t\t\"bird\",\n\t\t\t\"chicken\",\n\t\t\t\"turkey\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t25\n\t\t]\n\t},\n\ttired_face: {\n\t\ta: \"Tired Face\",\n\t\tb: \"1F62B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sick\",\n\t\t\t\"whine\",\n\t\t\t\"upset\",\n\t\t\t\"frustrated\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t15\n\t\t]\n\t},\n\tjapanese_castle: {\n\t\ta: \"Japanese Castle\",\n\t\tb: \"1F3EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"building\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-bn\": {\n\t\ta: \"Brunei Flag\",\n\t\tb: \"1F1E7-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t1,\n\t\t\t7\n\t\t]\n\t},\n\tfield_hockey_stick_and_ball: {\n\t\ta: \"Field Hockey Stick and Ball\",\n\t\tb: \"1F3D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t34\n\t\t],\n\t\to: 8\n\t},\n\tsleeping: {\n\t\ta: \"Sleeping Face\",\n\t\tb: \"1F634\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"sleepy\",\n\t\t\t\"night\",\n\t\t\t\"zzz\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t24\n\t\t]\n\t},\n\tleft_right_arrow: {\n\t\ta: \"Left Right Arrow\",\n\t\tb: \"2194-FE0F\",\n\t\tc: \"2194\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"horizontal\",\n\t\t\t\"sideways\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t33\n\t\t],\n\t\to: 1\n\t},\n\tkeyboard: {\n\t\ta: \"Keyboard\",\n\t\tb: \"2328-FE0F\",\n\t\tc: \"2328\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"computer\",\n\t\t\t\"type\",\n\t\t\t\"input\",\n\t\t\t\"text\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\teuropean_castle: {\n\t\ta: \"European Castle\",\n\t\tb: \"1F3F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"royalty\",\n\t\t\t\"history\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t13\n\t\t]\n\t},\n\tmouse: {\n\t\ta: \"Mouse Face\",\n\t\tb: \"1F42D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"cheese_wedge\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-bo\": {\n\t\ta: \"Bolivia Flag\",\n\t\tb: \"1F1E7-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t8\n\t\t]\n\t},\n\tcut_of_meat: {\n\t\ta: \"Cut of Meat\",\n\t\tb: \"1F969\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t21\n\t\t],\n\t\to: 10\n\t},\n\tice_hockey_stick_and_puck: {\n\t\ta: \"Ice Hockey Stick and Puck\",\n\t\tb: \"1F3D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t35\n\t\t],\n\t\to: 8\n\t},\n\tmouse2: {\n\t\ta: \"Mouse\",\n\t\tb: \"1F401\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t31\n\t\t]\n\t},\n\tthree_button_mouse: {\n\t\ta: \"Three Button Mouse\",\n\t\tb: \"1F5B1-FE0F\",\n\t\tc: \"1F5B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t1\n\t\t],\n\t\to: 7\n\t},\n\tleftwards_arrow_with_hook: {\n\t\ta: \"Leftwards Arrow with Hook\",\n\t\tb: \"21A9-FE0F\",\n\t\tc: \"21A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"back\",\n\t\t\t\"return\",\n\t\t\t\"blue-square\",\n\t\t\t\"undo\",\n\t\t\t\"enter\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t39\n\t\t],\n\t\to: 1\n\t},\n\tbacon: {\n\t\ta: \"Bacon\",\n\t\tb: \"1F953\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"pork\",\n\t\t\t\"pig\",\n\t\t\t\"meat\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t51\n\t\t],\n\t\to: 9\n\t},\n\trelieved: {\n\t\ta: \"Relieved Face\",\n\t\tb: \"1F60C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"relaxed\",\n\t\t\t\"phew\",\n\t\t\t\"massage\",\n\t\t\t\"happiness\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-bq\": {\n\t\ta: \"Caribbean Netherlands Flag\",\n\t\tb: \"1F1E7-1F1F6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t9\n\t\t]\n\t},\n\twedding: {\n\t\ta: \"Wedding\",\n\t\tb: \"1F492\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"bride\",\n\t\t\t\"groom\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t44\n\t\t]\n\t},\n\ttokyo_tower: {\n\t\ta: \"Tokyo Tower\",\n\t\tb: \"1F5FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t20\n\t\t]\n\t},\n\tarrow_right_hook: {\n\t\ta: \"Rightwards Arrow with Hook\",\n\t\tb: \"21AA-FE0F\",\n\t\tc: \"21AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"return\",\n\t\t\t\"rotate\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t40\n\t\t],\n\t\to: 1\n\t},\n\thamburger: {\n\t\ta: \"Hamburger\",\n\t\tb: \"1F354\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"meat\",\n\t\t\t\"fast food\",\n\t\t\t\"beef\",\n\t\t\t\"cheeseburger\",\n\t\t\t\"mcdonalds\",\n\t\t\t\"burger king\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t22\n\t\t]\n\t},\n\tstuck_out_tongue: {\n\t\ta: \"Face with Stuck-out Tongue\",\n\t\tb: \"1F61B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"childish\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t51\n\t\t],\n\t\tl: [\n\t\t\t\":p\",\n\t\t\t\":-p\",\n\t\t\t\":P\",\n\t\t\t\":-P\",\n\t\t\t\":b\",\n\t\t\t\":-b\"\n\t\t],\n\t\tm: \":p\"\n\t},\n\ttrackball: {\n\t\ta: \"Trackball\",\n\t\tb: \"1F5B2-FE0F\",\n\t\tc: \"1F5B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"trackpad\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t2\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-br\": {\n\t\ta: \"Brazil Flag\",\n\t\tb: \"1F1E7-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t10\n\t\t]\n\t},\n\trat: {\n\t\ta: \"Rat\",\n\t\tb: \"1F400\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"mouse\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t30\n\t\t]\n\t},\n\ttable_tennis_paddle_and_ball: {\n\t\ta: \"Table Tennis Paddle and Ball\",\n\t\tb: \"1F3D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t36\n\t\t],\n\t\to: 8\n\t},\n\tminidisc: {\n\t\ta: \"Minidisc\",\n\t\tb: \"1F4BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"record\",\n\t\t\t\"data\",\n\t\t\t\"disk\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t40\n\t\t]\n\t},\n\tstuck_out_tongue_winking_eye: {\n\t\ta: \"Face with Stuck-out Tongue and Winking Eye\",\n\t\tb: \"1F61C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"childish\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"wink\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t0\n\t\t],\n\t\tl: [\n\t\t\t\";p\",\n\t\t\t\";-p\",\n\t\t\t\";b\",\n\t\t\t\";-b\",\n\t\t\t\";P\",\n\t\t\t\";-P\"\n\t\t],\n\t\tm: \";p\"\n\t},\n\tfries: {\n\t\ta: \"French Fries\",\n\t\tb: \"1F35F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chips\",\n\t\t\t\"snack\",\n\t\t\t\"fast food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t33\n\t\t]\n\t},\n\tbadminton_racquet_and_shuttlecock: {\n\t\ta: \"Badminton Racquet and Shuttlecock\",\n\t\tb: \"1F3F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t22\n\t\t],\n\t\to: 8\n\t},\n\tstatue_of_liberty: {\n\t\ta: \"Statue of Liberty\",\n\t\tb: \"1F5FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"american\",\n\t\t\t\"newyork\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-bs\": {\n\t\ta: \"Bahamas Flag\",\n\t\tb: \"1F1E7-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t11\n\t\t]\n\t},\n\tarrow_heading_up: {\n\t\ta: \"Arrow Pointing Rightwards Then Curving Upwards\",\n\t\tb: \"2934-FE0F\",\n\t\tc: \"2934\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t15\n\t\t],\n\t\to: 3\n\t},\n\thamster: {\n\t\ta: \"Hamster Face\",\n\t\tb: \"1F439\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t35\n\t\t]\n\t},\n\tstuck_out_tongue_closed_eyes: {\n\t\ta: \"Face with Stuck-out Tongue and Tightly-Closed Eyes\",\n\t\tb: \"1F61D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t1\n\t\t]\n\t},\n\tpizza: {\n\t\ta: \"Slice of Pizza\",\n\t\tb: \"1F355\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"party\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t23\n\t\t]\n\t},\n\tboxing_glove: {\n\t\ta: \"Boxing Glove\",\n\t\tb: \"1F94A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"fighting\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t45\n\t\t],\n\t\to: 9\n\t},\n\tfloppy_disk: {\n\t\ta: \"Floppy Disk\",\n\t\tb: \"1F4BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"oldschool\",\n\t\t\t\"technology\",\n\t\t\t\"save\",\n\t\t\t\"90s\",\n\t\t\t\"80s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t41\n\t\t]\n\t},\n\tarrow_heading_down: {\n\t\ta: \"Arrow Pointing Rightwards Then Curving Downwards\",\n\t\tb: \"2935-FE0F\",\n\t\tc: \"2935\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t16\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-bt\": {\n\t\ta: \"Bhutan Flag\",\n\t\tb: \"1F1E7-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t12\n\t\t]\n\t},\n\trabbit: {\n\t\ta: \"Rabbit Face\",\n\t\tb: \"1F430\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"spring\",\n\t\t\t\"magic\",\n\t\t\t\"bunny\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t26\n\t\t]\n\t},\n\tchurch: {\n\t\ta: \"Church\",\n\t\tb: \"26EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"religion\",\n\t\t\t\"christ\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t37\n\t\t],\n\t\to: 5\n\t},\n\tdrooling_face: {\n\t\ta: \"Drooling Face\",\n\t\tb: \"1F924\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t27\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-bv\": {\n\t\ta: \"Bouvet Island Flag\",\n\t\tb: \"1F1E7-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t13\n\t\t]\n\t},\n\tmosque: {\n\t\ta: \"Mosque\",\n\t\tb: \"1F54C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"islam\",\n\t\t\t\"worship\",\n\t\t\t\"minaret\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t15\n\t\t],\n\t\to: 8\n\t},\n\trabbit2: {\n\t\ta: \"Rabbit\",\n\t\tb: \"1F407\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"magic\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t37\n\t\t]\n\t},\n\thotdog: {\n\t\ta: \"Hot Dog\",\n\t\tb: \"1F32D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"frankfurter\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t35\n\t\t],\n\t\to: 8\n\t},\n\tmartial_arts_uniform: {\n\t\ta: \"Martial Arts Uniform\",\n\t\tb: \"1F94B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judo\",\n\t\t\t\"karate\",\n\t\t\t\"taekwondo\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t46\n\t\t],\n\t\to: 9\n\t},\n\tarrows_clockwise: {\n\t\ta: \"Clockwise Downwards and Upwards Open Circle Arrows\",\n\t\tb: \"1F503\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sync\",\n\t\t\t\"cycle\",\n\t\t\t\"round\",\n\t\t\t\"repeat\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t5\n\t\t]\n\t},\n\tcd: {\n\t\ta: \"Optical Disc\",\n\t\tb: \"1F4BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"dvd\",\n\t\t\t\"disk\",\n\t\t\t\"disc\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t42\n\t\t]\n\t},\n\tarrows_counterclockwise: {\n\t\ta: \"Anticlockwise Downwards and Upwards Open Circle Arrows\",\n\t\tb: \"1F504\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"sync\",\n\t\t\t\"cycle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t6\n\t\t]\n\t},\n\tsandwich: {\n\t\ta: \"Sandwich\",\n\t\tb: \"1F96A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\tchipmunk: {\n\t\ta: \"Chipmunk\",\n\t\tb: \"1F43F-FE0F\",\n\t\tc: \"1F43F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"rodent\",\n\t\t\t\"squirrel\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\tsynagogue: {\n\t\ta: \"Synagogue\",\n\t\tb: \"1F54D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judaism\",\n\t\t\t\"worship\",\n\t\t\t\"temple\",\n\t\t\t\"jewish\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t16\n\t\t],\n\t\to: 8\n\t},\n\tunamused: {\n\t\ta: \"Unamused Face\",\n\t\tb: \"1F612\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"indifference\",\n\t\t\t\"bored\",\n\t\t\t\"straight face\",\n\t\t\t\"serious\",\n\t\t\t\"sarcasm\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t42\n\t\t],\n\t\tm: \":(\"\n\t},\n\tgoal_net: {\n\t\ta: \"Goal Net\",\n\t\tb: \"1F945\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-bw\": {\n\t\ta: \"Botswana Flag\",\n\t\tb: \"1F1E7-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t14\n\t\t]\n\t},\n\tdvd: {\n\t\ta: \"Dvd\",\n\t\tb: \"1F4C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cd\",\n\t\t\t\"disk\",\n\t\t\t\"disc\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t43\n\t\t]\n\t},\n\thedgehog: {\n\t\ta: \"Hedgehog\",\n\t\tb: \"1F994\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t44\n\t\t],\n\t\to: 10\n\t},\n\tdart: {\n\t\ta: \"Direct Hit\",\n\t\tb: \"1F3AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"bar\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t9\n\t\t]\n\t},\n\ttaco: {\n\t\ta: \"Taco\",\n\t\tb: \"1F32E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"mexican\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t36\n\t\t],\n\t\to: 8\n\t},\n\tback: {\n\t\ta: \"Back with Leftwards Arrow Above\",\n\t\tb: \"1F519\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\",\n\t\t\t\"return\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-by\": {\n\t\ta: \"Belarus Flag\",\n\t\tb: \"1F1E7-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t15\n\t\t]\n\t},\n\tshinto_shrine: {\n\t\ta: \"Shinto Shrine\",\n\t\tb: \"26E9-FE0F\",\n\t\tc: \"26E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"temple\",\n\t\t\t\"japan\",\n\t\t\t\"kyoto\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t36\n\t\t],\n\t\to: 5\n\t},\n\tmovie_camera: {\n\t\ta: \"Movie Camera\",\n\t\tb: \"1F3A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t51\n\t\t]\n\t},\n\tsweat: {\n\t\ta: \"Face with Cold Sweat\",\n\t\tb: \"1F613\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hot\",\n\t\t\t\"sad\",\n\t\t\t\"tired\",\n\t\t\t\"exercise\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t43\n\t\t]\n\t},\n\tburrito: {\n\t\ta: \"Burrito\",\n\t\tb: \"1F32F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"mexican\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t37\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-bz\": {\n\t\ta: \"Belize Flag\",\n\t\tb: \"1F1E7-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t16\n\t\t]\n\t},\n\tpensive: {\n\t\ta: \"Pensive Face\",\n\t\tb: \"1F614\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sad\",\n\t\t\t\"depressed\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t44\n\t\t]\n\t},\n\tkaaba: {\n\t\ta: \"Kaaba\",\n\t\tb: \"1F54B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"mecca\",\n\t\t\t\"mosque\",\n\t\t\t\"islam\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t14\n\t\t],\n\t\to: 8\n\t},\n\tfilm_frames: {\n\t\ta: \"Film Frames\",\n\t\tb: \"1F39E-FE0F\",\n\t\tc: \"1F39E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tbat: {\n\t\ta: \"Bat\",\n\t\tb: \"1F987\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"blind\",\n\t\t\t\"vampire\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t31\n\t\t],\n\t\to: 9\n\t},\n\tgolf: {\n\t\ta: \"Flag in Hole\",\n\t\tb: \"26F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"business\",\n\t\t\t\"flag\",\n\t\t\t\"hole\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t41\n\t\t],\n\t\to: 5\n\t},\n\tend: {\n\t\ta: \"End with Leftwards Arrow Above\",\n\t\tb: \"1F51A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"arrow\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t28\n\t\t]\n\t},\n\tfilm_projector: {\n\t\ta: \"Film Projector\",\n\t\tb: \"1F4FD-FE0F\",\n\t\tc: \"1F4FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"video\",\n\t\t\t\"tape\",\n\t\t\t\"record\",\n\t\t\t\"movie\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\tbear: {\n\t\ta: \"Bear Face\",\n\t\tb: \"1F43B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wild\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t37\n\t\t]\n\t},\n\tice_skate: {\n\t\ta: \"Ice Skate\",\n\t\tb: \"26F8-FE0F\",\n\t\tc: \"26F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t45\n\t\t],\n\t\to: 5\n\t},\n\tfountain: {\n\t\ta: \"Fountain\",\n\t\tb: \"26F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"summer\",\n\t\t\t\"water\",\n\t\t\t\"fresh\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t40\n\t\t],\n\t\to: 5\n\t},\n\tconfused: {\n\t\ta: \"Confused Face\",\n\t\tb: \"1F615\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"indifference\",\n\t\t\t\"huh\",\n\t\t\t\"weird\",\n\t\t\t\"hmmm\",\n\t\t\t\":/\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t45\n\t\t],\n\t\tl: [\n\t\t\t\":\\\\\",\n\t\t\t\":-\\\\\",\n\t\t\t\":/\",\n\t\t\t\":-/\"\n\t\t]\n\t},\n\t\"flag-ca\": {\n\t\ta: \"Canada Flag\",\n\t\tb: \"1F1E8-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t17\n\t\t]\n\t},\n\ton: {\n\t\ta: \"On with Exclamation Mark with Left Right Arrow Above\",\n\t\tb: \"1F51B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t29\n\t\t]\n\t},\n\tstuffed_flatbread: {\n\t\ta: \"Stuffed Flatbread\",\n\t\tb: \"1F959\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"flatbread\",\n\t\t\t\"stuffed\",\n\t\t\t\"gyro\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t5\n\t\t],\n\t\to: 9\n\t},\n\tsoon: {\n\t\ta: \"Soon with Rightwards Arrow Above\",\n\t\tb: \"1F51C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t30\n\t\t]\n\t},\n\tupside_down_face: {\n\t\ta: \"Upside-Down Face\",\n\t\tb: \"1F643\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"flipped\",\n\t\t\t\"silly\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t39\n\t\t],\n\t\to: 8\n\t},\n\tfishing_pole_and_fish: {\n\t\ta: \"Fishing Pole and Fish\",\n\t\tb: \"1F3A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hobby\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t49\n\t\t]\n\t},\n\ttent: {\n\t\ta: \"Tent\",\n\t\tb: \"26FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"camping\",\n\t\t\t\"outdoors\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t12\n\t\t],\n\t\to: 5\n\t},\n\tclapper: {\n\t\ta: \"Clapper Board\",\n\t\tb: \"1F3AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"movie\",\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t6\n\t\t]\n\t},\n\tegg: {\n\t\ta: \"Egg\",\n\t\tb: \"1F95A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"chicken\",\n\t\t\t\"breakfast\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-cc\": {\n\t\ta: \"Cocos (keeling) Islands Flag\",\n\t\tb: \"1F1E8-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t18\n\t\t]\n\t},\n\tkoala: {\n\t\ta: \"Koala\",\n\t\tb: \"1F428\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t18\n\t\t]\n\t},\n\tfoggy: {\n\t\ta: \"Foggy\",\n\t\tb: \"1F301\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"mountain\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t45\n\t\t]\n\t},\n\ttv: {\n\t\ta: \"Television\",\n\t\tb: \"1F4FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"program\",\n\t\t\t\"oldschool\",\n\t\t\t\"show\",\n\t\t\t\"television\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t49\n\t\t]\n\t},\n\tpanda_face: {\n\t\ta: \"Panda Face\",\n\t\tb: \"1F43C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"panda\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t38\n\t\t]\n\t},\n\tfried_egg: {\n\t\ta: \"Cooking\",\n\t\tb: \"1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"kitchen\",\n\t\t\t\"egg\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t1\n\t\t],\n\t\tn: [\n\t\t\t\"cooking\"\n\t\t]\n\t},\n\ttop: {\n\t\ta: \"Top with Upwards Arrow Above\",\n\t\tb: \"1F51D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-cd\": {\n\t\ta: \"Congo - Kinshasa Flag\",\n\t\tb: \"1F1E8-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t19\n\t\t]\n\t},\n\tmoney_mouth_face: {\n\t\ta: \"Money-Mouth Face\",\n\t\tb: \"1F911\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"rich\",\n\t\t\t\"dollar\",\n\t\t\t\"money\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t25\n\t\t],\n\t\to: 8\n\t},\n\trunning_shirt_with_sash: {\n\t\ta: \"Running Shirt with Sash\",\n\t\tb: \"1F3BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"pageant\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t23\n\t\t]\n\t},\n\tastonished: {\n\t\ta: \"Astonished Face\",\n\t\tb: \"1F632\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"xox\",\n\t\t\t\"surprised\",\n\t\t\t\"poisoned\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t22\n\t\t]\n\t},\n\tfeet: {\n\t\ta: \"Paw Prints\",\n\t\tb: \"1F43E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t13,\n\t\t\t40\n\t\t],\n\t\tn: [\n\t\t\t\"paw_prints\"\n\t\t]\n\t},\n\tcamera: {\n\t\ta: \"Camera\",\n\t\tb: \"1F4F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gadgets\",\n\t\t\t\"photography\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-cf\": {\n\t\ta: \"Central African Republic Flag\",\n\t\tb: \"1F1E8-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t20\n\t\t]\n\t},\n\tplace_of_worship: {\n\t\ta: \"Place of Worship\",\n\t\tb: \"1F6D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"religion\",\n\t\t\t\"church\",\n\t\t\t\"temple\",\n\t\t\t\"prayer\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t5\n\t\t],\n\t\to: 8\n\t},\n\tnight_with_stars: {\n\t\ta: \"Night with Stars\",\n\t\tb: \"1F303\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"evening\",\n\t\t\t\"city\",\n\t\t\t\"downtown\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t47\n\t\t]\n\t},\n\tski: {\n\t\ta: \"Ski and Ski Boot\",\n\t\tb: \"1F3BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\",\n\t\t\t\"cold\",\n\t\t\t\"snow\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t25\n\t\t]\n\t},\n\tshallow_pan_of_food: {\n\t\ta: \"Shallow Pan of Food\",\n\t\tb: \"1F958\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"cooking\",\n\t\t\t\"casserole\",\n\t\t\t\"paella\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\tcamera_with_flash: {\n\t\ta: \"Camera with Flash\",\n\t\tb: \"1F4F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t26,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\tsunrise_over_mountains: {\n\t\ta: \"Sunrise over Mountains\",\n\t\tb: \"1F304\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"view\",\n\t\t\t\"vacation\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t48\n\t\t]\n\t},\n\tturkey: {\n\t\ta: \"Turkey\",\n\t\tb: \"1F983\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t27\n\t\t],\n\t\to: 8\n\t},\n\twhite_frowning_face: {\n\t\ta: \"White Frowning Face\",\n\t\tb: \"2639-FE0F\",\n\t\tc: \"2639\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t40\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-cg\": {\n\t\ta: \"Congo - Brazzaville Flag\",\n\t\tb: \"1F1E8-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t21\n\t\t]\n\t},\n\tstew: {\n\t\ta: \"Pot of Food\",\n\t\tb: \"1F372\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"meat\",\n\t\t\t\"soup\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t0\n\t\t]\n\t},\n\tsled: {\n\t\ta: \"Sled\",\n\t\tb: \"1F6F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\tatom_symbol: {\n\t\ta: \"Atom Symbol\",\n\t\tb: \"269B-FE0F\",\n\t\tc: \"269B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"science\",\n\t\t\t\"physics\",\n\t\t\t\"chemistry\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t18\n\t\t],\n\t\to: 4\n\t},\n\tcurling_stone: {\n\t\ta: \"Curling Stone\",\n\t\tb: \"1F94C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t47\n\t\t],\n\t\to: 10\n\t},\n\tslightly_frowning_face: {\n\t\ta: \"Slightly Frowning Face\",\n\t\tb: \"1F641\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"frowning\",\n\t\t\t\"disappointed\",\n\t\t\t\"sad\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t37\n\t\t],\n\t\to: 7\n\t},\n\tsunrise: {\n\t\ta: \"Sunrise\",\n\t\tb: \"1F305\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"morning\",\n\t\t\t\"view\",\n\t\t\t\"vacation\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t49\n\t\t]\n\t},\n\tom_symbol: {\n\t\ta: \"Om Symbol\",\n\t\tb: \"1F549-FE0F\",\n\t\tc: \"1F549\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tchicken: {\n\t\ta: \"Chicken\",\n\t\tb: \"1F414\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cluck\",\n\t\t\t\"nature\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t50\n\t\t]\n\t},\n\tbowl_with_spoon: {\n\t\ta: \"Bowl with Spoon\",\n\t\tb: \"1F963\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t15\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ch\": {\n\t\ta: \"Switzerland Flag\",\n\t\tb: \"1F1E8-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t22\n\t\t]\n\t},\n\tvideo_camera: {\n\t\ta: \"Video Camera\",\n\t\tb: \"1F4F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t48\n\t\t]\n\t},\n\tvideo_game: {\n\t\ta: \"Video Game\",\n\t\tb: \"1F3AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"console\",\n\t\t\t\"PS4\",\n\t\t\t\"controller\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t8\n\t\t]\n\t},\n\trooster: {\n\t\ta: \"Rooster\",\n\t\tb: \"1F413\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"chicken\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t49\n\t\t]\n\t},\n\tvhs: {\n\t\ta: \"Videocassette\",\n\t\tb: \"1F4FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"record\",\n\t\t\t\"video\",\n\t\t\t\"oldschool\",\n\t\t\t\"90s\",\n\t\t\t\"80s\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t51\n\t\t]\n\t},\n\tcity_sunset: {\n\t\ta: \"Cityscape at Dusk\",\n\t\tb: \"1F306\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"evening\",\n\t\t\t\"sky\",\n\t\t\t\"buildings\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t50\n\t\t]\n\t},\n\tconfounded: {\n\t\ta: \"Confounded Face\",\n\t\tb: \"1F616\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"confused\",\n\t\t\t\"sick\",\n\t\t\t\"unwell\",\n\t\t\t\"oops\",\n\t\t\t\":S\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t46\n\t\t]\n\t},\n\tgreen_salad: {\n\t\ta: \"Green Salad\",\n\t\tb: \"1F957\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"healthy\",\n\t\t\t\"lettuce\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t3\n\t\t],\n\t\to: 9\n\t},\n\tstar_of_david: {\n\t\ta: \"Star of David\",\n\t\tb: \"2721-FE0F\",\n\t\tc: \"2721\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judaism\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t47\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ci\": {\n\t\ta: \"Côte D’ivoire Flag\",\n\t\tb: \"1F1E8-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t23\n\t\t]\n\t},\n\tpopcorn: {\n\t\ta: \"Popcorn\",\n\t\tb: \"1F37F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"movie theater\",\n\t\t\t\"films\",\n\t\t\t\"snack\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t13\n\t\t],\n\t\to: 8\n\t},\n\tcity_sunrise: {\n\t\ta: \"Sunset over Buildings\",\n\t\tb: \"1F307\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"good morning\",\n\t\t\t\"dawn\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t51\n\t\t]\n\t},\n\tdisappointed: {\n\t\ta: \"Disappointed Face\",\n\t\tb: \"1F61E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sad\",\n\t\t\t\"upset\",\n\t\t\t\"depressed\",\n\t\t\t\":(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t2\n\t\t],\n\t\tl: [\n\t\t\t\"):\",\n\t\t\t\":(\",\n\t\t\t\":-(\"\n\t\t],\n\t\tm: \":(\"\n\t},\n\tmag: {\n\t\ta: \"Left-Pointing Magnifying Glass\",\n\t\tb: \"1F50D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"search\",\n\t\t\t\"zoom\",\n\t\t\t\"find\",\n\t\t\t\"detective\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t15\n\t\t]\n\t},\n\thatching_chick: {\n\t\ta: \"Hatching Chick\",\n\t\tb: \"1F423\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"egg\",\n\t\t\t\"born\",\n\t\t\t\"baby\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t13\n\t\t]\n\t},\n\tjoystick: {\n\t\ta: \"Joystick\",\n\t\tb: \"1F579-FE0F\",\n\t\tc: \"1F579\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t20\n\t\t],\n\t\to: 7\n\t},\n\twheel_of_dharma: {\n\t\ta: \"Wheel of Dharma\",\n\t\tb: \"2638-FE0F\",\n\t\tc: \"2638\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hinduism\",\n\t\t\t\"buddhism\",\n\t\t\t\"sikhism\",\n\t\t\t\"jainism\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t39\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ck\": {\n\t\ta: \"Cook Islands Flag\",\n\t\tb: \"1F1E8-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t24\n\t\t]\n\t},\n\tcanned_food: {\n\t\ta: \"Canned Food\",\n\t\tb: \"1F96B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\tworried: {\n\t\ta: \"Worried Face\",\n\t\tb: \"1F61F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"concern\",\n\t\t\t\"nervous\",\n\t\t\t\":(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t3\n\t\t]\n\t},\n\tbaby_chick: {\n\t\ta: \"Baby Chick\",\n\t\tb: \"1F424\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t14\n\t\t]\n\t},\n\t\"flag-cl\": {\n\t\ta: \"Chile Flag\",\n\t\tb: \"1F1E8-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t25\n\t\t]\n\t},\n\tgame_die: {\n\t\ta: \"Game Die\",\n\t\tb: \"1F3B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dice\",\n\t\t\t\"random\",\n\t\t\t\"tabletop\",\n\t\t\t\"play\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t12\n\t\t]\n\t},\n\tmag_right: {\n\t\ta: \"Right-Pointing Magnifying Glass\",\n\t\tb: \"1F50E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"search\",\n\t\t\t\"zoom\",\n\t\t\t\"find\",\n\t\t\t\"detective\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t16\n\t\t]\n\t},\n\tyin_yang: {\n\t\ta: \"Yin Yang\",\n\t\tb: \"262F-FE0F\",\n\t\tc: \"262F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"balance\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t38\n\t\t],\n\t\to: 1\n\t},\n\tbridge_at_night: {\n\t\ta: \"Bridge at Night\",\n\t\tb: \"1F309\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"sanfrancisco\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t1\n\t\t]\n\t},\n\tspades: {\n\t\ta: \"Black Spade Suit\",\n\t\tb: \"2660-FE0F\",\n\t\tc: \"2660\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"suits\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t4\n\t\t],\n\t\to: 1\n\t},\n\thatched_chick: {\n\t\ta: \"Front-Facing Baby Chick\",\n\t\tb: \"1F425\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"baby\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-cm\": {\n\t\ta: \"Cameroon Flag\",\n\t\tb: \"1F1E8-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t26\n\t\t]\n\t},\n\tlatin_cross: {\n\t\ta: \"Latin Cross\",\n\t\tb: \"271D-FE0F\",\n\t\tc: \"271D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"christianity\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t46\n\t\t],\n\t\to: 1\n\t},\n\ttriumph: {\n\t\ta: \"Face with Look of Triumph\",\n\t\tb: \"1F624\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"gas\",\n\t\t\t\"phew\",\n\t\t\t\"proud\",\n\t\t\t\"pride\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t8\n\t\t]\n\t},\n\thotsprings: {\n\t\ta: \"Hot Springs\",\n\t\tb: \"2668-FE0F\",\n\t\tc: \"2668\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bath\",\n\t\t\t\"warm\",\n\t\t\t\"relax\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t8\n\t\t],\n\t\to: 1\n\t},\n\tbento: {\n\t\ta: \"Bento Box\",\n\t\tb: \"1F371\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\",\n\t\t\t\"box\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t51\n\t\t]\n\t},\n\tmicroscope: {\n\t\ta: \"Microscope\",\n\t\tb: \"1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"laboratory\",\n\t\t\t\"experiment\",\n\t\t\t\"zoomin\",\n\t\t\t\"science\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t46\n\t\t]\n\t},\n\tcry: {\n\t\ta: \"Crying Face\",\n\t\tb: \"1F622\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tears\",\n\t\t\t\"sad\",\n\t\t\t\"depressed\",\n\t\t\t\"upset\",\n\t\t\t\":'(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t6\n\t\t],\n\t\tl: [\n\t\t\t\":'(\"\n\t\t],\n\t\tm: \":'(\"\n\t},\n\tbird: {\n\t\ta: \"Bird\",\n\t\tb: \"1F426\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fly\",\n\t\t\t\"tweet\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t16\n\t\t]\n\t},\n\tcn: {\n\t\ta: \"China Flag\",\n\t\tb: \"1F1E8-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"china\",\n\t\t\t\"chinese\",\n\t\t\t\"prc\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"nation\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t27\n\t\t],\n\t\tn: [\n\t\t\t\"flag-cn\"\n\t\t]\n\t},\n\ttelescope: {\n\t\ta: \"Telescope\",\n\t\tb: \"1F52D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"space\",\n\t\t\t\"zoom\",\n\t\t\t\"science\",\n\t\t\t\"astronomy\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t47\n\t\t]\n\t},\n\trice_cracker: {\n\t\ta: \"Rice Cracker\",\n\t\tb: \"1F358\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t26\n\t\t]\n\t},\n\thearts: {\n\t\ta: \"Black Heart Suit\",\n\t\tb: \"2665-FE0F\",\n\t\tc: \"2665\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t6\n\t\t],\n\t\to: 1\n\t},\n\torthodox_cross: {\n\t\ta: \"Orthodox Cross\",\n\t\tb: \"2626-FE0F\",\n\t\tc: \"2626\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"suppedaneum\",\n\t\t\t\"religion\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t35\n\t\t],\n\t\to: 1\n\t},\n\tmilky_way: {\n\t\ta: \"Milky Way\",\n\t\tb: \"1F30C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"space\",\n\t\t\t\"stars\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t4\n\t\t]\n\t},\n\trice_ball: {\n\t\ta: \"Rice Ball\",\n\t\tb: \"1F359\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t27\n\t\t]\n\t},\n\tsatellite_antenna: {\n\t\ta: \"Satellite Antenna\",\n\t\tb: \"1F4E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t26,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-co\": {\n\t\ta: \"Colombia Flag\",\n\t\tb: \"1F1E8-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t28\n\t\t]\n\t},\n\tcarousel_horse: {\n\t\ta: \"Carousel Horse\",\n\t\tb: \"1F3A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"carnival\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t46\n\t\t]\n\t},\n\tsob: {\n\t\ta: \"Loudly Crying Face\",\n\t\tb: \"1F62D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cry\",\n\t\t\t\"tears\",\n\t\t\t\"sad\",\n\t\t\t\"upset\",\n\t\t\t\"depressed\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t17\n\t\t],\n\t\tm: \":'(\"\n\t},\n\tdiamonds: {\n\t\ta: \"Black Diamond Suit\",\n\t\tb: \"2666-FE0F\",\n\t\tc: \"2666\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tstar_and_crescent: {\n\t\ta: \"Star and Crescent\",\n\t\tb: \"262A-FE0F\",\n\t\tc: \"262A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"islam\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\tpenguin: {\n\t\ta: \"Penguin\",\n\t\tb: \"1F427\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t17\n\t\t]\n\t},\n\tdove_of_peace: {\n\t\ta: \"Dove of Peace\",\n\t\tb: \"1F54A-FE0F\",\n\t\tc: \"1F54A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-cp\": {\n\t\ta: \"Clipperton Island Flag\",\n\t\tb: \"1F1E8-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t1,\n\t\t\t29\n\t\t]\n\t},\n\tferris_wheel: {\n\t\ta: \"Ferris Wheel\",\n\t\tb: \"1F3A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"carnival\",\n\t\t\t\"londoneye\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t47\n\t\t]\n\t},\n\tclubs: {\n\t\ta: \"Black Club Suit\",\n\t\tb: \"2663-FE0F\",\n\t\tc: \"2663\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t5\n\t\t],\n\t\to: 1\n\t},\n\tpeace_symbol: {\n\t\ta: \"Peace Symbol\",\n\t\tb: \"262E-FE0F\",\n\t\tc: \"262E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hippie\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t37\n\t\t],\n\t\to: 1\n\t},\n\tcandle: {\n\t\ta: \"Candle\",\n\t\tb: \"1F56F-FE0F\",\n\t\tc: \"1F56F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fire\",\n\t\t\t\"wax\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\tfrowning: {\n\t\ta: \"Frowning Face with Open Mouth\",\n\t\tb: \"1F626\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"aw\",\n\t\t\t\"what\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t10\n\t\t]\n\t},\n\trice: {\n\t\ta: \"Cooked Rice\",\n\t\tb: \"1F35A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"china\",\n\t\t\t\"asian\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-cr\": {\n\t\ta: \"Costa Rica Flag\",\n\t\tb: \"1F1E8-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t30\n\t\t]\n\t},\n\troller_coaster: {\n\t\ta: \"Roller Coaster\",\n\t\tb: \"1F3A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"carnival\",\n\t\t\t\"playground\",\n\t\t\t\"photo\",\n\t\t\t\"fun\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t48\n\t\t]\n\t},\n\tmenorah_with_nine_branches: {\n\t\ta: \"Menorah with Nine Branches\",\n\t\tb: \"1F54E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t17\n\t\t],\n\t\to: 8\n\t},\n\tblack_joker: {\n\t\ta: \"Playing Card Black Joker\",\n\t\tb: \"1F0CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t15\n\t\t]\n\t},\n\teagle: {\n\t\ta: \"Eagle\",\n\t\tb: \"1F985\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t29\n\t\t],\n\t\to: 9\n\t},\n\tcurry: {\n\t\ta: \"Curry and Rice\",\n\t\tb: \"1F35B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"spicy\",\n\t\t\t\"hot\",\n\t\t\t\"indian\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t29\n\t\t]\n\t},\n\tbulb: {\n\t\ta: \"Electric Light Bulb\",\n\t\tb: \"1F4A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"light\",\n\t\t\t\"electricity\",\n\t\t\t\"idea\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t7\n\t\t]\n\t},\n\tanguished: {\n\t\ta: \"Anguished Face\",\n\t\tb: \"1F627\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"stunned\",\n\t\t\t\"nervous\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t11\n\t\t],\n\t\tl: [\n\t\t\t\"D:\"\n\t\t]\n\t},\n\t\"flag-cu\": {\n\t\ta: \"Cuba Flag\",\n\t\tb: \"1F1E8-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t31\n\t\t]\n\t},\n\tbarber: {\n\t\ta: \"Barber Pole\",\n\t\tb: \"1F488\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hair\",\n\t\t\t\"salon\",\n\t\t\t\"style\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t34\n\t\t]\n\t},\n\tduck: {\n\t\ta: \"Duck\",\n\t\tb: \"1F986\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\",\n\t\t\t\"mallard\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\tsix_pointed_star: {\n\t\ta: \"Six Pointed Star with Middle Dot\",\n\t\tb: \"1F52F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"religion\",\n\t\t\t\"jewish\",\n\t\t\t\"hexagram\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t49\n\t\t]\n\t},\n\tramen: {\n\t\ta: \"Steaming Bowl\",\n\t\tb: \"1F35C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\",\n\t\t\t\"noodle\",\n\t\t\t\"chopsticks\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t30\n\t\t]\n\t},\n\tflashlight: {\n\t\ta: \"Electric Torch\",\n\t\tb: \"1F526\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dark\",\n\t\t\t\"camping\",\n\t\t\t\"sight\",\n\t\t\t\"night\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t40\n\t\t]\n\t},\n\tmahjong: {\n\t\ta: \"Mahjong Tile Red Dragon\",\n\t\tb: \"1F004\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t14\n\t\t],\n\t\to: 5\n\t},\n\tfearful: {\n\t\ta: \"Fearful Face\",\n\t\tb: \"1F628\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"scared\",\n\t\t\t\"terrified\",\n\t\t\t\"nervous\",\n\t\t\t\"oops\",\n\t\t\t\"huh\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t12\n\t\t]\n\t},\n\taries: {\n\t\ta: \"Aries\",\n\t\tb: \"2648\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t44\n\t\t],\n\t\to: 1\n\t},\n\tspaghetti: {\n\t\ta: \"Spaghetti\",\n\t\tb: \"1F35D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"italian\",\n\t\t\t\"noodle\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t31\n\t\t]\n\t},\n\tcircus_tent: {\n\t\ta: \"Circus Tent\",\n\t\tb: \"1F3AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"carnival\",\n\t\t\t\"party\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t4\n\t\t]\n\t},\n\tizakaya_lantern: {\n\t\ta: \"Izakaya Lantern\",\n\t\tb: \"1F3EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"light\",\n\t\t\t\"paper\",\n\t\t\t\"halloween\",\n\t\t\t\"spooky\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"lantern\"\n\t\t]\n\t},\n\t\"flag-cv\": {\n\t\ta: \"Cape Verde Flag\",\n\t\tb: \"1F1E8-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t32\n\t\t]\n\t},\n\tweary: {\n\t\ta: \"Weary Face\",\n\t\tb: \"1F629\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"sleepy\",\n\t\t\t\"sad\",\n\t\t\t\"frustrated\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t13\n\t\t]\n\t},\n\tflower_playing_cards: {\n\t\ta: \"Flower Playing Cards\",\n\t\tb: \"1F3B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"sunset\",\n\t\t\t\"red\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t14\n\t\t]\n\t},\n\towl: {\n\t\ta: \"Owl\",\n\t\tb: \"1F989\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\",\n\t\t\t\"hoot\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t33\n\t\t],\n\t\to: 9\n\t},\n\tperforming_arts: {\n\t\ta: \"Performing Arts\",\n\t\tb: \"1F3AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"acting\",\n\t\t\t\"theater\",\n\t\t\t\"drama\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t7\n\t\t]\n\t},\n\tfrog: {\n\t\ta: \"Frog Face\",\n\t\tb: \"1F438\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"croak\",\n\t\t\t\"toad\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-cw\": {\n\t\ta: \"Curaçao Flag\",\n\t\tb: \"1F1E8-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t33\n\t\t]\n\t},\n\tnotebook_with_decorative_cover: {\n\t\ta: \"Notebook with Decorative Cover\",\n\t\tb: \"1F4D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"classroom\",\n\t\t\t\"notes\",\n\t\t\t\"record\",\n\t\t\t\"paper\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t11\n\t\t]\n\t},\n\texploding_head: {\n\t\ta: \"Shocked Face with Exploding Head\",\n\t\tb: \"1F92F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t3\n\t\t],\n\t\tn: [\n\t\t\t\"shocked_face_with_exploding_head\"\n\t\t],\n\t\to: 10\n\t},\n\ttaurus: {\n\t\ta: \"Taurus\",\n\t\tb: \"2649\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t45\n\t\t],\n\t\to: 1\n\t},\n\tsweet_potato: {\n\t\ta: \"Roasted Sweet Potato\",\n\t\tb: \"1F360\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t34\n\t\t]\n\t},\n\tclosed_book: {\n\t\ta: \"Closed Book\",\n\t\tb: \"1F4D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"textbook\",\n\t\t\t\"learn\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t12\n\t\t]\n\t},\n\tgemini: {\n\t\ta: \"Gemini\",\n\t\tb: \"264A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t46\n\t\t],\n\t\to: 1\n\t},\n\tframe_with_picture: {\n\t\ta: \"Frame with Picture\",\n\t\tb: \"1F5BC-FE0F\",\n\t\tc: \"1F5BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t3\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-cx\": {\n\t\ta: \"Christmas Island Flag\",\n\t\tb: \"1F1E8-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t34\n\t\t]\n\t},\n\tgrimacing: {\n\t\ta: \"Grimacing Face\",\n\t\tb: \"1F62C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"grimace\",\n\t\t\t\"teeth\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t16\n\t\t]\n\t},\n\tcrocodile: {\n\t\ta: \"Crocodile\",\n\t\tb: \"1F40A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"reptile\",\n\t\t\t\"lizard\",\n\t\t\t\"alligator\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t40\n\t\t]\n\t},\n\toden: {\n\t\ta: \"Oden\",\n\t\tb: \"1F362\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-cy\": {\n\t\ta: \"Cyprus Flag\",\n\t\tb: \"1F1E8-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t35\n\t\t]\n\t},\n\tbook: {\n\t\ta: \"Open Book\",\n\t\tb: \"1F4D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t26,\n\t\t\t13\n\t\t],\n\t\tn: [\n\t\t\t\"open_book\"\n\t\t]\n\t},\n\tturtle: {\n\t\ta: \"Turtle\",\n\t\tb: \"1F422\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"slow\",\n\t\t\t\"nature\",\n\t\t\t\"tortoise\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t12\n\t\t]\n\t},\n\tart: {\n\t\ta: \"Artist Palette\",\n\t\tb: \"1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"design\",\n\t\t\t\"paint\",\n\t\t\t\"draw\",\n\t\t\t\"colors\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t2\n\t\t]\n\t},\n\tsushi: {\n\t\ta: \"Sushi\",\n\t\tb: \"1F363\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fish\",\n\t\t\t\"japanese\",\n\t\t\t\"rice\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t37\n\t\t]\n\t},\n\tcold_sweat: {\n\t\ta: \"Face with Open Mouth and Cold Sweat\",\n\t\tb: \"1F630\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"nervous\",\n\t\t\t\"sweat\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t20\n\t\t]\n\t},\n\tcancer: {\n\t\ta: \"Cancer\",\n\t\tb: \"264B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t47\n\t\t],\n\t\to: 1\n\t},\n\tfried_shrimp: {\n\t\ta: \"Fried Shrimp\",\n\t\tb: \"1F364\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"animal\",\n\t\t\t\"appetizer\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t38\n\t\t]\n\t},\n\tslot_machine: {\n\t\ta: \"Slot Machine\",\n\t\tb: \"1F3B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bet\",\n\t\t\t\"gamble\",\n\t\t\t\"vegas\",\n\t\t\t\"fruit machine\",\n\t\t\t\"luck\",\n\t\t\t\"casino\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t10\n\t\t]\n\t},\n\tscream: {\n\t\ta: \"Face Screaming in Fear\",\n\t\tb: \"1F631\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"munch\",\n\t\t\t\"scared\",\n\t\t\t\"omg\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t21\n\t\t]\n\t},\n\tgreen_book: {\n\t\ta: \"Green Book\",\n\t\tb: \"1F4D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t14\n\t\t]\n\t},\n\tleo: {\n\t\ta: \"Leo\",\n\t\tb: \"264C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t48\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-cz\": {\n\t\ta: \"Czechia Flag\",\n\t\tb: \"1F1E8-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t36\n\t\t]\n\t},\n\tlizard: {\n\t\ta: \"Lizard\",\n\t\tb: \"1F98E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"reptile\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\tvirgo: {\n\t\ta: \"Virgo\",\n\t\tb: \"264D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t49\n\t\t],\n\t\to: 1\n\t},\n\tsteam_locomotive: {\n\t\ta: \"Steam Locomotive\",\n\t\tb: \"1F682\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"train\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t10\n\t\t]\n\t},\n\tde: {\n\t\ta: \"Germany Flag\",\n\t\tb: \"1F1E9-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"german\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t37\n\t\t],\n\t\tn: [\n\t\t\t\"flag-de\"\n\t\t]\n\t},\n\tflushed: {\n\t\ta: \"Flushed Face\",\n\t\tb: \"1F633\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"blush\",\n\t\t\t\"shy\",\n\t\t\t\"flattered\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t23\n\t\t]\n\t},\n\tblue_book: {\n\t\ta: \"Blue Book\",\n\t\tb: \"1F4D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"learn\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t15\n\t\t]\n\t},\n\tsnake: {\n\t\ta: \"Snake\",\n\t\tb: \"1F40D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"evil\",\n\t\t\t\"nature\",\n\t\t\t\"hiss\",\n\t\t\t\"python\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t43\n\t\t]\n\t},\n\tfish_cake: {\n\t\ta: \"Fish Cake with Swirl Design\",\n\t\tb: \"1F365\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japan\",\n\t\t\t\"sea\",\n\t\t\t\"beach\",\n\t\t\t\"narutomaki\",\n\t\t\t\"pink\",\n\t\t\t\"swirl\",\n\t\t\t\"kamaboko\",\n\t\t\t\"surimi\",\n\t\t\t\"ramen\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t39\n\t\t]\n\t},\n\trailway_car: {\n\t\ta: \"Railway Car\",\n\t\tb: \"1F683\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t11\n\t\t]\n\t},\n\tdango: {\n\t\ta: \"Dango\",\n\t\tb: \"1F361\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\",\n\t\t\t\"japanese\",\n\t\t\t\"barbecue\",\n\t\t\t\"meat\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t35\n\t\t]\n\t},\n\torange_book: {\n\t\ta: \"Orange Book\",\n\t\tb: \"1F4D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"textbook\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t16\n\t\t]\n\t},\n\tlibra: {\n\t\ta: \"Libra\",\n\t\tb: \"264E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t50\n\t\t],\n\t\to: 1\n\t},\n\tdragon_face: {\n\t\ta: \"Dragon Face\",\n\t\tb: \"1F432\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"myth\",\n\t\t\t\"nature\",\n\t\t\t\"chinese\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-dg\": {\n\t\ta: \"Diego Garcia Flag\",\n\t\tb: \"1F1E9-1F1EC\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t38\n\t\t]\n\t},\n\tzany_face: {\n\t\ta: \"Grinning Face with One Large and One Small Eye\",\n\t\tb: \"1F92A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t50\n\t\t],\n\t\tn: [\n\t\t\t\"grinning_face_with_one_large_and_one_small_eye\"\n\t\t],\n\t\to: 10\n\t},\n\tbooks: {\n\t\ta: \"Books\",\n\t\tb: \"1F4DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"literature\",\n\t\t\t\"library\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t17\n\t\t]\n\t},\n\tdragon: {\n\t\ta: \"Dragon\",\n\t\tb: \"1F409\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"myth\",\n\t\t\t\"nature\",\n\t\t\t\"chinese\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t39\n\t\t]\n\t},\n\t\"flag-dj\": {\n\t\ta: \"Djibouti Flag\",\n\t\tb: \"1F1E9-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t39\n\t\t]\n\t},\n\tdumpling: {\n\t\ta: \"Dumpling\",\n\t\tb: \"1F95F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t11\n\t\t],\n\t\to: 10\n\t},\n\tdizzy_face: {\n\t\ta: \"Dizzy Face\",\n\t\tb: \"1F635\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"spent\",\n\t\t\t\"unconscious\",\n\t\t\t\"xox\",\n\t\t\t\"dizzy\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t25\n\t\t]\n\t},\n\tscorpius: {\n\t\ta: \"Scorpius\",\n\t\tb: \"264F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\",\n\t\t\t\"scorpio\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t51\n\t\t],\n\t\to: 1\n\t},\n\tbullettrain_side: {\n\t\ta: \"High-Speed Train\",\n\t\tb: \"1F684\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t12\n\t\t]\n\t},\n\tbullettrain_front: {\n\t\ta: \"High-Speed Train with Bullet Nose\",\n\t\tb: \"1F685\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"speed\",\n\t\t\t\"fast\",\n\t\t\t\"public\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t13\n\t\t]\n\t},\n\tnotebook: {\n\t\ta: \"Notebook\",\n\t\tb: \"1F4D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"record\",\n\t\t\t\"notes\",\n\t\t\t\"paper\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t10\n\t\t]\n\t},\n\tfortune_cookie: {\n\t\ta: \"Fortune Cookie\",\n\t\tb: \"1F960\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t12\n\t\t],\n\t\to: 10\n\t},\n\tsagittarius: {\n\t\ta: \"Sagittarius\",\n\t\tb: \"2650\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t0\n\t\t],\n\t\to: 1\n\t},\n\tsauropod: {\n\t\ta: \"Sauropod\",\n\t\tb: \"1F995\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t45\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-dk\": {\n\t\ta: \"Denmark Flag\",\n\t\tb: \"1F1E9-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t40\n\t\t]\n\t},\n\trage: {\n\t\ta: \"Pouting Face\",\n\t\tb: \"1F621\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"mad\",\n\t\t\t\"hate\",\n\t\t\t\"despise\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t5\n\t\t]\n\t},\n\tledger: {\n\t\ta: \"Ledger\",\n\t\tb: \"1F4D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"notes\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t9\n\t\t]\n\t},\n\tangry: {\n\t\ta: \"Angry Face\",\n\t\tb: \"1F620\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mad\",\n\t\t\t\"face\",\n\t\t\t\"annoyed\",\n\t\t\t\"frustrated\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t4\n\t\t],\n\t\tl: [\n\t\t\t\">:(\",\n\t\t\t\">:-(\"\n\t\t]\n\t},\n\t\"t-rex\": {\n\t\ta: \"T-Rex\",\n\t\tb: \"1F996\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t46\n\t\t],\n\t\to: 10\n\t},\n\tcapricorn: {\n\t\ta: \"Capricorn\",\n\t\tb: \"2651\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t1\n\t\t],\n\t\to: 1\n\t},\n\ttakeout_box: {\n\t\ta: \"Takeout Box\",\n\t\tb: \"1F961\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t13\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-dm\": {\n\t\ta: \"Dominica Flag\",\n\t\tb: \"1F1E9-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t41\n\t\t]\n\t},\n\ttrain2: {\n\t\ta: \"Train\",\n\t\tb: \"1F686\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t14\n\t\t]\n\t},\n\tpage_with_curl: {\n\t\ta: \"Page with Curl\",\n\t\tb: \"1F4C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"office\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t46\n\t\t]\n\t},\n\twhale: {\n\t\ta: \"Spouting Whale\",\n\t\tb: \"1F433\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t29\n\t\t]\n\t},\n\tface_with_symbols_on_mouth: {\n\t\ta: \"Serious Face with Symbols Covering Mouth\",\n\t\tb: \"1F92C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t0\n\t\t],\n\t\tn: [\n\t\t\t\"serious_face_with_symbols_covering_mouth\"\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-do\": {\n\t\ta: \"Dominican Republic Flag\",\n\t\tb: \"1F1E9-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t42\n\t\t]\n\t},\n\tmetro: {\n\t\ta: \"Metro\",\n\t\tb: \"1F687\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"blue-square\",\n\t\t\t\"mrt\",\n\t\t\t\"underground\",\n\t\t\t\"tube\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t15\n\t\t]\n\t},\n\ticecream: {\n\t\ta: \"Soft Ice Cream\",\n\t\tb: \"1F366\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hot\",\n\t\t\t\"dessert\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t40\n\t\t]\n\t},\n\taquarius: {\n\t\ta: \"Aquarius\",\n\t\tb: \"2652\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t2\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-dz\": {\n\t\ta: \"Algeria Flag\",\n\t\tb: \"1F1E9-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t43\n\t\t]\n\t},\n\twhale2: {\n\t\ta: \"Whale\",\n\t\tb: \"1F40B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t41\n\t\t]\n\t},\n\tmask: {\n\t\ta: \"Face with Medical Mask\",\n\t\tb: \"1F637\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sick\",\n\t\t\t\"ill\",\n\t\t\t\"disease\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t27\n\t\t]\n\t},\n\tscroll: {\n\t\ta: \"Scroll\",\n\t\tb: \"1F4DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"ancient\",\n\t\t\t\"history\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t19\n\t\t]\n\t},\n\tshaved_ice: {\n\t\ta: \"Shaved Ice\",\n\t\tb: \"1F367\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hot\",\n\t\t\t\"dessert\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t41\n\t\t]\n\t},\n\tpisces: {\n\t\ta: \"Pisces\",\n\t\tb: \"2653\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t3\n\t\t],\n\t\to: 1\n\t},\n\tlight_rail: {\n\t\ta: \"Light Rail\",\n\t\tb: \"1F688\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t16\n\t\t]\n\t},\n\tdolphin: {\n\t\ta: \"Dolphin\",\n\t\tb: \"1F42C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fish\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\",\n\t\t\t\"flipper\",\n\t\t\t\"fins\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t22\n\t\t],\n\t\tn: [\n\t\t\t\"flipper\"\n\t\t]\n\t},\n\tface_with_thermometer: {\n\t\ta: \"Face with Thermometer\",\n\t\tb: \"1F912\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sick\",\n\t\t\t\"temperature\",\n\t\t\t\"thermometer\",\n\t\t\t\"cold\",\n\t\t\t\"fever\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t26\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-ea\": {\n\t\ta: \"Ceuta & Melilla Flag\",\n\t\tb: \"1F1EA-1F1E6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t44\n\t\t]\n\t},\n\tophiuchus: {\n\t\ta: \"Ophiuchus\",\n\t\tb: \"26CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"constellation\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t31\n\t\t]\n\t},\n\tstation: {\n\t\ta: \"Station\",\n\t\tb: \"1F689\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"public\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t17\n\t\t]\n\t},\n\tice_cream: {\n\t\ta: \"Ice Cream\",\n\t\tb: \"1F368\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hot\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t42\n\t\t]\n\t},\n\tpage_facing_up: {\n\t\ta: \"Page Facing Up\",\n\t\tb: \"1F4C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"office\",\n\t\t\t\"paper\",\n\t\t\t\"information\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t47\n\t\t]\n\t},\n\tdoughnut: {\n\t\ta: \"Doughnut\",\n\t\tb: \"1F369\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"snack\",\n\t\t\t\"sweet\",\n\t\t\t\"donut\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t43\n\t\t]\n\t},\n\tface_with_head_bandage: {\n\t\ta: \"Face with Head-Bandage\",\n\t\tb: \"1F915\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"injured\",\n\t\t\t\"clumsy\",\n\t\t\t\"bandage\",\n\t\t\t\"hurt\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t29\n\t\t],\n\t\to: 8\n\t},\n\tfish: {\n\t\ta: \"Fish\",\n\t\tb: \"1F41F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t9\n\t\t]\n\t},\n\tnewspaper: {\n\t\ta: \"Newspaper\",\n\t\tb: \"1F4F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"press\",\n\t\t\t\"headline\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t39\n\t\t]\n\t},\n\ttram: {\n\t\ta: \"Tram\",\n\t\tb: \"1F68A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-ec\": {\n\t\ta: \"Ecuador Flag\",\n\t\tb: \"1F1EA-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t45\n\t\t]\n\t},\n\ttwisted_rightwards_arrows: {\n\t\ta: \"Twisted Rightwards Arrows\",\n\t\tb: \"1F500\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"shuffle\",\n\t\t\t\"music\",\n\t\t\t\"random\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-ee\": {\n\t\ta: \"Estonia Flag\",\n\t\tb: \"1F1EA-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t46\n\t\t]\n\t},\n\tcookie: {\n\t\ta: \"Cookie\",\n\t\tb: \"1F36A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"oreo\",\n\t\t\t\"chocolate\",\n\t\t\t\"sweet\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t44\n\t\t]\n\t},\n\tmonorail: {\n\t\ta: \"Monorail\",\n\t\tb: \"1F69D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t37\n\t\t]\n\t},\n\ttropical_fish: {\n\t\ta: \"Tropical Fish\",\n\t\tb: \"1F420\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"swim\",\n\t\t\t\"ocean\",\n\t\t\t\"beach\",\n\t\t\t\"nemo\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t10\n\t\t]\n\t},\n\trolled_up_newspaper: {\n\t\ta: \"Rolled Up Newspaper\",\n\t\tb: \"1F5DE-FE0F\",\n\t\tc: \"1F5DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tnauseated_face: {\n\t\ta: \"Nauseated Face\",\n\t\tb: \"1F922\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"vomit\",\n\t\t\t\"gross\",\n\t\t\t\"green\",\n\t\t\t\"sick\",\n\t\t\t\"throw up\",\n\t\t\t\"ill\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t25\n\t\t],\n\t\to: 9\n\t},\n\trepeat: {\n\t\ta: \"Clockwise Rightwards and Leftwards Open Circle Arrows\",\n\t\tb: \"1F501\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"loop\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t3\n\t\t]\n\t},\n\tbookmark_tabs: {\n\t\ta: \"Bookmark Tabs\",\n\t\tb: \"1F4D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"favorite\",\n\t\t\t\"save\",\n\t\t\t\"order\",\n\t\t\t\"tidy\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t8\n\t\t]\n\t},\n\trepeat_one: {\n\t\ta: \"Clockwise Rightwards and Leftwards Open Circle Arrows with Circled One Overlay\",\n\t\tb: \"1F502\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"loop\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-eg\": {\n\t\ta: \"Egypt Flag\",\n\t\tb: \"1F1EA-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t47\n\t\t]\n\t},\n\tmountain_railway: {\n\t\ta: \"Mountain Railway\",\n\t\tb: \"1F69E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t38\n\t\t]\n\t},\n\tbirthday: {\n\t\ta: \"Birthday Cake\",\n\t\tb: \"1F382\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"cake\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t16\n\t\t]\n\t},\n\tblowfish: {\n\t\ta: \"Blowfish\",\n\t\tb: \"1F421\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"food\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t11\n\t\t]\n\t},\n\tface_vomiting: {\n\t\ta: \"Face with Open Mouth Vomiting\",\n\t\tb: \"1F92E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_open_mouth_vomiting\"\n\t\t],\n\t\to: 10\n\t},\n\tarrow_forward: {\n\t\ta: \"Black Right-Pointing Triangle\",\n\t\tb: \"25B6-FE0F\",\n\t\tc: \"25B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"right\",\n\t\t\t\"direction\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t10\n\t\t],\n\t\to: 1\n\t},\n\tbookmark: {\n\t\ta: \"Bookmark\",\n\t\tb: \"1F516\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"favorite\",\n\t\t\t\"label\",\n\t\t\t\"save\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-eh\": {\n\t\ta: \"Western Sahara Flag\",\n\t\tb: \"1F1EA-1F1ED\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t48\n\t\t]\n\t},\n\tshark: {\n\t\ta: \"Shark\",\n\t\tb: \"1F988\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fish\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\",\n\t\t\t\"jaws\",\n\t\t\t\"fins\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t32\n\t\t],\n\t\to: 9\n\t},\n\ttrain: {\n\t\ta: \"Tram Car\",\n\t\tb: \"1F68B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"carriage\",\n\t\t\t\"public\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t19\n\t\t]\n\t},\n\tsneezing_face: {\n\t\ta: \"Sneezing Face\",\n\t\tb: \"1F927\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"gesundheit\",\n\t\t\t\"sneeze\",\n\t\t\t\"sick\",\n\t\t\t\"allergy\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t47\n\t\t],\n\t\to: 9\n\t},\n\tcake: {\n\t\ta: \"Shortcake\",\n\t\tb: \"1F370\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t50\n\t\t]\n\t},\n\tbus: {\n\t\ta: \"Bus\",\n\t\tb: \"1F68C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"car\",\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t20\n\t\t]\n\t},\n\tpie: {\n\t\ta: \"Pie\",\n\t\tb: \"1F967\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t19\n\t\t],\n\t\to: 10\n\t},\n\tinnocent: {\n\t\ta: \"Smiling Face with Halo\",\n\t\tb: \"1F607\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"angel\",\n\t\t\t\"heaven\",\n\t\t\t\"halo\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t31\n\t\t]\n\t},\n\tfast_forward: {\n\t\ta: \"Black Right-Pointing Double Triangle\",\n\t\tb: \"23E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"play\",\n\t\t\t\"speed\",\n\t\t\t\"continue\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t45\n\t\t]\n\t},\n\tlabel: {\n\t\ta: \"Label\",\n\t\tb: \"1F3F7-FE0F\",\n\t\tc: \"1F3F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sale\",\n\t\t\t\"tag\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t21\n\t\t],\n\t\to: 7\n\t},\n\toctopus: {\n\t\ta: \"Octopus\",\n\t\tb: \"1F419\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"creature\",\n\t\t\t\"ocean\",\n\t\t\t\"sea\",\n\t\t\t\"nature\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-er\": {\n\t\ta: \"Eritrea Flag\",\n\t\tb: \"1F1EA-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t49\n\t\t]\n\t},\n\tblack_right_pointing_double_triangle_with_vertical_bar: {\n\t\ta: \"Black Right Pointing Double Triangle with Vertical Bar\",\n\t\tb: \"23ED-FE0F\",\n\t\tc: \"23ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t49\n\t\t]\n\t},\n\tchocolate_bar: {\n\t\ta: \"Chocolate Bar\",\n\t\tb: \"1F36B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t45\n\t\t]\n\t},\n\toncoming_bus: {\n\t\ta: \"Oncoming Bus\",\n\t\tb: \"1F68D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t21\n\t\t]\n\t},\n\tshell: {\n\t\ta: \"Spiral Shell\",\n\t\tb: \"1F41A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t4\n\t\t]\n\t},\n\tface_with_cowboy_hat: {\n\t\ta: \"Face with Cowboy Hat\",\n\t\tb: \"1F920\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t23\n\t\t],\n\t\to: 9\n\t},\n\tmoneybag: {\n\t\ta: \"Money Bag\",\n\t\tb: \"1F4B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dollar\",\n\t\t\t\"payment\",\n\t\t\t\"coins\",\n\t\t\t\"sale\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t27\n\t\t]\n\t},\n\tes: {\n\t\ta: \"Spain Flag\",\n\t\tb: \"1F1EA-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"spain\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t50\n\t\t],\n\t\tn: [\n\t\t\t\"flag-es\"\n\t\t]\n\t},\n\tcrab: {\n\t\ta: \"Crab\",\n\t\tb: \"1F980\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"crustacean\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tyen: {\n\t\ta: \"Banknote with Yen Sign\",\n\t\tb: \"1F4B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"japanese\",\n\t\t\t\"dollar\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-et\": {\n\t\ta: \"Ethiopia Flag\",\n\t\tb: \"1F1EA-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t51\n\t\t]\n\t},\n\tclown_face: {\n\t\ta: \"Clown Face\",\n\t\tb: \"1F921\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\tblack_right_pointing_triangle_with_double_vertical_bar: {\n\t\ta: \"Black Right Pointing Triangle with Double Vertical Bar\",\n\t\tb: \"23EF-FE0F\",\n\t\tc: \"23EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t51\n\t\t]\n\t},\n\ttrolleybus: {\n\t\ta: \"Trolleybus\",\n\t\tb: \"1F68E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bart\",\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t22\n\t\t]\n\t},\n\tcandy: {\n\t\ta: \"Candy\",\n\t\tb: \"1F36C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"snack\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\",\n\t\t\t\"lolly\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t46\n\t\t]\n\t},\n\tlying_face: {\n\t\ta: \"Lying Face\",\n\t\tb: \"1F925\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"lie\",\n\t\t\t\"pinocchio\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t28\n\t\t],\n\t\to: 9\n\t},\n\tarrow_backward: {\n\t\ta: \"Black Left-Pointing Triangle\",\n\t\tb: \"25C0-FE0F\",\n\t\tc: \"25C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"left\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t11\n\t\t],\n\t\to: 1\n\t},\n\tdollar: {\n\t\ta: \"Banknote with Dollar Sign\",\n\t\tb: \"1F4B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bill\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t32\n\t\t]\n\t},\n\tshrimp: {\n\t\ta: \"Shrimp\",\n\t\tb: \"1F990\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"ocean\",\n\t\t\t\"nature\",\n\t\t\t\"seafood\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t40\n\t\t],\n\t\to: 9\n\t},\n\tminibus: {\n\t\ta: \"Minibus\",\n\t\tb: \"1F690\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"car\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-eu\": {\n\t\ta: \"European Union Flag\",\n\t\tb: \"1F1EA-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t0\n\t\t]\n\t},\n\tlollipop: {\n\t\ta: \"Lollipop\",\n\t\tb: \"1F36D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"candy\",\n\t\t\t\"sweet\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t47\n\t\t]\n\t},\n\tsquid: {\n\t\ta: \"Squid\",\n\t\tb: \"1F991\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"ocean\",\n\t\t\t\"sea\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\teuro: {\n\t\ta: \"Banknote with Euro Sign\",\n\t\tb: \"1F4B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t33\n\t\t]\n\t},\n\t\"flag-fi\": {\n\t\ta: \"Finland Flag\",\n\t\tb: \"1F1EB-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t1\n\t\t]\n\t},\n\tambulance: {\n\t\ta: \"Ambulance\",\n\t\tb: \"1F691\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"911\",\n\t\t\t\"hospital\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t25\n\t\t]\n\t},\n\tcustard: {\n\t\ta: \"Custard\",\n\t\tb: \"1F36E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dessert\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t48\n\t\t]\n\t},\n\tshushing_face: {\n\t\ta: \"Face with Finger Covering Closed Lips\",\n\t\tb: \"1F92B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t51\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_finger_covering_closed_lips\"\n\t\t],\n\t\to: 10\n\t},\n\trewind: {\n\t\ta: \"Black Left-Pointing Double Triangle\",\n\t\tb: \"23EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t46\n\t\t]\n\t},\n\tblack_left_pointing_double_triangle_with_vertical_bar: {\n\t\ta: \"Black Left Pointing Double Triangle with Vertical Bar\",\n\t\tb: \"23EE-FE0F\",\n\t\tc: \"23EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t50\n\t\t]\n\t},\n\tface_with_hand_over_mouth: {\n\t\ta: \"Smiling Face with Smiling Eyes and Hand Covering Mouth\",\n\t\tb: \"1F92D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t1\n\t\t],\n\t\tn: [\n\t\t\t\"smiling_face_with_smiling_eyes_and_hand_covering_mouth\"\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-fj\": {\n\t\ta: \"Fiji Flag\",\n\t\tb: \"1F1EB-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t2\n\t\t]\n\t},\n\thoney_pot: {\n\t\ta: \"Honey Pot\",\n\t\tb: \"1F36F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bees\",\n\t\t\t\"sweet\",\n\t\t\t\"kitchen\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t49\n\t\t]\n\t},\n\tsnail: {\n\t\ta: \"Snail\",\n\t\tb: \"1F40C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"slow\",\n\t\t\t\"animal\",\n\t\t\t\"shell\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t42\n\t\t]\n\t},\n\tpound: {\n\t\ta: \"Banknote with Pound Sign\",\n\t\tb: \"1F4B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"british\",\n\t\t\t\"sterling\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bills\",\n\t\t\t\"uk\",\n\t\t\t\"england\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t34\n\t\t]\n\t},\n\tfire_engine: {\n\t\ta: \"Fire Engine\",\n\t\tb: \"1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"cars\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t26\n\t\t]\n\t},\n\tbaby_bottle: {\n\t\ta: \"Baby Bottle\",\n\t\tb: \"1F37C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"container\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-fk\": {\n\t\ta: \"Falkland Islands Flag\",\n\t\tb: \"1F1EB-1F1F0\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t},\n\tbutterfly: {\n\t\ta: \"Butterfly\",\n\t\tb: \"1F98B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"caterpillar\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t35\n\t\t],\n\t\to: 9\n\t},\n\tmoney_with_wings: {\n\t\ta: \"Money with Wings\",\n\t\tb: \"1F4B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dollar\",\n\t\t\t\"bills\",\n\t\t\t\"payment\",\n\t\t\t\"sale\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t35\n\t\t]\n\t},\n\tface_with_monocle: {\n\t\ta: \"Face with Monocle\",\n\t\tb: \"1F9D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t49\n\t\t],\n\t\to: 10\n\t},\n\tpolice_car: {\n\t\ta: \"Police Car\",\n\t\tb: \"1F693\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"enforcement\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t27\n\t\t]\n\t},\n\tarrow_up_small: {\n\t\ta: \"Up-Pointing Small Red Triangle\",\n\t\tb: \"1F53C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"triangle\",\n\t\t\t\"direction\",\n\t\t\t\"point\",\n\t\t\t\"forward\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-fm\": {\n\t\ta: \"Micronesia Flag\",\n\t\tb: \"1F1EB-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t4\n\t\t]\n\t},\n\tglass_of_milk: {\n\t\ta: \"Glass of Milk\",\n\t\tb: \"1F95B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t7\n\t\t],\n\t\to: 9\n\t},\n\tcredit_card: {\n\t\ta: \"Credit Card\",\n\t\tb: \"1F4B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"bill\",\n\t\t\t\"payment\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t30\n\t\t]\n\t},\n\toncoming_police_car: {\n\t\ta: \"Oncoming Police Car\",\n\t\tb: \"1F694\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"enforcement\",\n\t\t\t\"911\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t28\n\t\t]\n\t},\n\tbug: {\n\t\ta: \"Bug\",\n\t\tb: \"1F41B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"worm\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t5\n\t\t]\n\t},\n\tnerd_face: {\n\t\ta: \"Nerd Face\",\n\t\tb: \"1F913\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"nerdy\",\n\t\t\t\"geek\",\n\t\t\t\"dork\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t27\n\t\t],\n\t\to: 8\n\t},\n\tarrow_double_up: {\n\t\ta: \"Black Up-Pointing Double Triangle\",\n\t\tb: \"23EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t47\n\t\t]\n\t},\n\tchart: {\n\t\ta: \"Chart with Upwards Trend and Yen Sign\",\n\t\tb: \"1F4B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"green-square\",\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-fo\": {\n\t\ta: \"Faroe Islands Flag\",\n\t\tb: \"1F1EB-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t5\n\t\t]\n\t},\n\tant: {\n\t\ta: \"Ant\",\n\t\tb: \"1F41C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"bug\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t6\n\t\t]\n\t},\n\tarrow_down_small: {\n\t\ta: \"Down-Pointing Small Red Triangle\",\n\t\tb: \"1F53D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t11\n\t\t]\n\t},\n\tsmiling_imp: {\n\t\ta: \"Smiling Face with Horns\",\n\t\tb: \"1F608\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"devil\",\n\t\t\t\"horns\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t32\n\t\t]\n\t},\n\ttaxi: {\n\t\ta: \"Taxi\",\n\t\tb: \"1F695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"uber\",\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t29\n\t\t]\n\t},\n\tcoffee: {\n\t\ta: \"Hot Beverage\",\n\t\tb: \"2615\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"caffeine\",\n\t\t\t\"latte\",\n\t\t\t\"espresso\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t24\n\t\t],\n\t\to: 4\n\t},\n\tfr: {\n\t\ta: \"France Flag\",\n\t\tb: \"1F1EB-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"banner\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"france\",\n\t\t\t\"french\",\n\t\t\t\"country\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t6\n\t\t],\n\t\tn: [\n\t\t\t\"flag-fr\"\n\t\t]\n\t},\n\toncoming_taxi: {\n\t\ta: \"Oncoming Taxi\",\n\t\tb: \"1F696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"uber\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t30\n\t\t]\n\t},\n\tarrow_double_down: {\n\t\ta: \"Black Down-Pointing Double Triangle\",\n\t\tb: \"23EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t48\n\t\t]\n\t},\n\timp: {\n\t\ta: \"Imp\",\n\t\tb: \"1F47F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"devil\",\n\t\t\t\"angry\",\n\t\t\t\"horns\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t51\n\t\t]\n\t},\n\tcurrency_exchange: {\n\t\ta: \"Currency Exchange\",\n\t\tb: \"1F4B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t28\n\t\t]\n\t},\n\ttea: {\n\t\ta: \"Teacup Without Handle\",\n\t\tb: \"1F375\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"bowl\",\n\t\t\t\"breakfast\",\n\t\t\t\"green\",\n\t\t\t\"british\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t3\n\t\t]\n\t},\n\tbee: {\n\t\ta: \"Honeybee\",\n\t\tb: \"1F41D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t13,\n\t\t\t7\n\t\t],\n\t\tn: [\n\t\t\t\"honeybee\"\n\t\t]\n\t},\n\theavy_dollar_sign: {\n\t\ta: \"Heavy Dollar Sign\",\n\t\tb: \"1F4B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"payment\",\n\t\t\t\"currency\",\n\t\t\t\"buck\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t29\n\t\t]\n\t},\n\tcar: {\n\t\ta: \"Automobile\",\n\t\tb: \"1F697\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t34,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"red_car\"\n\t\t]\n\t},\n\tsake: {\n\t\ta: \"Sake Bottle and Cup\",\n\t\tb: \"1F376\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wine\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"beverage\",\n\t\t\t\"japanese\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-ga\": {\n\t\ta: \"Gabon Flag\",\n\t\tb: \"1F1EC-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t7\n\t\t]\n\t},\n\tbeetle: {\n\t\ta: \"Lady Beetle\",\n\t\tb: \"1F41E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"ladybug\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t8\n\t\t]\n\t},\n\tjapanese_ogre: {\n\t\ta: \"Japanese Ogre\",\n\t\tb: \"1F479\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monster\",\n\t\t\t\"red\",\n\t\t\t\"mask\",\n\t\t\t\"halloween\",\n\t\t\t\"scary\",\n\t\t\t\"creepy\",\n\t\t\t\"devil\",\n\t\t\t\"demon\",\n\t\t\t\"japanese\",\n\t\t\t\"ogre\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t40\n\t\t]\n\t},\n\tdouble_vertical_bar: {\n\t\ta: \"Double Vertical Bar\",\n\t\tb: \"23F8-FE0F\",\n\t\tc: \"23F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\tchampagne: {\n\t\ta: \"Bottle with Popping Cork\",\n\t\tb: \"1F37E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"wine\",\n\t\t\t\"bottle\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t12\n\t\t],\n\t\to: 8\n\t},\n\tjapanese_goblin: {\n\t\ta: \"Japanese Goblin\",\n\t\tb: \"1F47A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red\",\n\t\t\t\"evil\",\n\t\t\t\"mask\",\n\t\t\t\"monster\",\n\t\t\t\"scary\",\n\t\t\t\"creepy\",\n\t\t\t\"japanese\",\n\t\t\t\"goblin\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t41\n\t\t]\n\t},\n\tblack_square_for_stop: {\n\t\ta: \"Black Square for Stop\",\n\t\tb: \"23F9-FE0F\",\n\t\tc: \"23F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\toncoming_automobile: {\n\t\ta: \"Oncoming Automobile\",\n\t\tb: \"1F698\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"car\",\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t32\n\t\t]\n\t},\n\temail: {\n\t\ta: \"Envelope\",\n\t\tb: \"2709-FE0F\",\n\t\tc: \"2709\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"letter\",\n\t\t\t\"postal\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t17\n\t\t],\n\t\tn: [\n\t\t\t\"envelope\"\n\t\t],\n\t\to: 1\n\t},\n\tcricket: {\n\t\ta: \"Cricket\",\n\t\tb: \"1F997\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t47\n\t\t],\n\t\to: 10\n\t},\n\tgb: {\n\t\ta: \"United Kingdom Flag\",\n\t\tb: \"1F1EC-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t8\n\t\t],\n\t\tn: [\n\t\t\t\"uk\",\n\t\t\t\"flag-gb\"\n\t\t]\n\t},\n\tblack_circle_for_record: {\n\t\ta: \"Black Circle for Record\",\n\t\tb: \"23FA-FE0F\",\n\t\tc: \"23FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-gd\": {\n\t\ta: \"Grenada Flag\",\n\t\tb: \"1F1EC-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t9\n\t\t]\n\t},\n\tspider: {\n\t\ta: \"Spider\",\n\t\tb: \"1F577-FE0F\",\n\t\tc: \"1F577\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"arachnid\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tblue_car: {\n\t\ta: \"Recreational Vehicle\",\n\t\tb: \"1F699\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t33\n\t\t]\n\t},\n\tskull: {\n\t\ta: \"Skull\",\n\t\tb: \"1F480\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dead\",\n\t\t\t\"skeleton\",\n\t\t\t\"creepy\",\n\t\t\t\"death\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t0\n\t\t]\n\t},\n\t\"e-mail\": {\n\t\ta: \"E-Mail Symbol\",\n\t\tb: \"1F4E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t30\n\t\t]\n\t},\n\twine_glass: {\n\t\ta: \"Wine Glass\",\n\t\tb: \"1F377\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"beverage\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t5\n\t\t]\n\t},\n\tspider_web: {\n\t\ta: \"Spider Web\",\n\t\tb: \"1F578-FE0F\",\n\t\tc: \"1F578\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"arachnid\",\n\t\t\t\"silk\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t19\n\t\t],\n\t\to: 7\n\t},\n\tcocktail: {\n\t\ta: \"Cocktail Glass\",\n\t\tb: \"1F378\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"beverage\",\n\t\t\t\"booze\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t6\n\t\t]\n\t},\n\tskull_and_crossbones: {\n\t\ta: \"Skull and Crossbones\",\n\t\tb: \"2620-FE0F\",\n\t\tc: \"2620\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"poison\",\n\t\t\t\"danger\",\n\t\t\t\"deadly\",\n\t\t\t\"scary\",\n\t\t\t\"death\",\n\t\t\t\"pirate\",\n\t\t\t\"evil\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t32\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ge\": {\n\t\ta: \"Georgia Flag\",\n\t\tb: \"1F1EC-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t10\n\t\t]\n\t},\n\teject: {\n\t\ta: \"Eject\",\n\t\tb: \"23CF-FE0F\",\n\t\tc: \"23CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t44\n\t\t],\n\t\to: 4\n\t},\n\ttruck: {\n\t\ta: \"Delivery Truck\",\n\t\tb: \"1F69A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cars\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t34\n\t\t]\n\t},\n\tincoming_envelope: {\n\t\ta: \"Incoming Envelope\",\n\t\tb: \"1F4E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t31\n\t\t]\n\t},\n\ttropical_drink: {\n\t\ta: \"Tropical Drink\",\n\t\tb: \"1F379\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"cocktail\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t7\n\t\t]\n\t},\n\tscorpion: {\n\t\ta: \"Scorpion\",\n\t\tb: \"1F982\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"arachnid\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t26\n\t\t],\n\t\to: 8\n\t},\n\tcinema: {\n\t\ta: \"Cinema\",\n\t\tb: \"1F3A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"record\",\n\t\t\t\"film\",\n\t\t\t\"movie\",\n\t\t\t\"curtain\",\n\t\t\t\"stage\",\n\t\t\t\"theater\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t0\n\t\t]\n\t},\n\tarticulated_lorry: {\n\t\ta: \"Articulated Lorry\",\n\t\tb: \"1F69B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\",\n\t\t\t\"express\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t35\n\t\t]\n\t},\n\tenvelope_with_arrow: {\n\t\ta: \"Envelope with Downwards Arrow Above\",\n\t\tb: \"1F4E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t32\n\t\t]\n\t},\n\tghost: {\n\t\ta: \"Ghost\",\n\t\tb: \"1F47B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"halloween\",\n\t\t\t\"spooky\",\n\t\t\t\"scary\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t42\n\t\t]\n\t},\n\t\"flag-gf\": {\n\t\ta: \"French Guiana Flag\",\n\t\tb: \"1F1EC-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t11\n\t\t]\n\t},\n\tbouquet: {\n\t\ta: \"Bouquet\",\n\t\tb: \"1F490\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"nature\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t42\n\t\t]\n\t},\n\ttractor: {\n\t\ta: \"Tractor\",\n\t\tb: \"1F69C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"car\",\n\t\t\t\"farming\",\n\t\t\t\"agriculture\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t36\n\t\t]\n\t},\n\tbeer: {\n\t\ta: \"Beer Mug\",\n\t\tb: \"1F37A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"relax\",\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"party\",\n\t\t\t\"pub\",\n\t\t\t\"summer\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t8\n\t\t]\n\t},\n\toutbox_tray: {\n\t\ta: \"Outbox Tray\",\n\t\tb: \"1F4E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"inbox\",\n\t\t\t\"email\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t27\n\t\t]\n\t},\n\tlow_brightness: {\n\t\ta: \"Low Brightness Symbol\",\n\t\tb: \"1F505\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sun\",\n\t\t\t\"afternoon\",\n\t\t\t\"warm\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t7\n\t\t]\n\t},\n\talien: {\n\t\ta: \"Extraterrestrial Alien\",\n\t\tb: \"1F47D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"UFO\",\n\t\t\t\"paul\",\n\t\t\t\"weird\",\n\t\t\t\"outer_space\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t49\n\t\t]\n\t},\n\t\"flag-gg\": {\n\t\ta: \"Guernsey Flag\",\n\t\tb: \"1F1EC-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t12\n\t\t]\n\t},\n\tcherry_blossom: {\n\t\ta: \"Cherry Blossom\",\n\t\tb: \"1F338\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"spring\",\n\t\t\t\"flower\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t46\n\t\t]\n\t},\n\tinbox_tray: {\n\t\ta: \"Inbox Tray\",\n\t\tb: \"1F4E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"documents\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-gh\": {\n\t\ta: \"Ghana Flag\",\n\t\tb: \"1F1EC-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t13\n\t\t]\n\t},\n\tbike: {\n\t\ta: \"Bicycle\",\n\t\tb: \"1F6B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"bicycle\",\n\t\t\t\"exercise\",\n\t\t\t\"hipster\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t23\n\t\t]\n\t},\n\tspace_invader: {\n\t\ta: \"Alien Monster\",\n\t\tb: \"1F47E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"arcade\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t50\n\t\t]\n\t},\n\tbeers: {\n\t\ta: \"Clinking Beer Mugs\",\n\t\tb: \"1F37B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"relax\",\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"party\",\n\t\t\t\"pub\",\n\t\t\t\"summer\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t9\n\t\t]\n\t},\n\thigh_brightness: {\n\t\ta: \"High Brightness Symbol\",\n\t\tb: \"1F506\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sun\",\n\t\t\t\"light\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t8\n\t\t]\n\t},\n\t\"package\": {\n\t\ta: \"Package\",\n\t\tb: \"1F4E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mail\",\n\t\t\t\"gift\",\n\t\t\t\"cardboard\",\n\t\t\t\"box\",\n\t\t\t\"moving\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t29\n\t\t]\n\t},\n\tscooter: {\n\t\ta: \"Scooter\",\n\t\tb: \"1F6F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t19\n\t\t],\n\t\to: 9\n\t},\n\twhite_flower: {\n\t\ta: \"White Flower\",\n\t\tb: \"1F4AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t25\n\t\t]\n\t},\n\tclinking_glasses: {\n\t\ta: \"Clinking Glasses\",\n\t\tb: \"1F942\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"party\",\n\t\t\t\"alcohol\",\n\t\t\t\"celebrate\",\n\t\t\t\"cheers\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\trobot_face: {\n\t\ta: \"Robot Face\",\n\t\tb: \"1F916\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t30\n\t\t],\n\t\to: 8\n\t},\n\tsignal_strength: {\n\t\ta: \"Antenna with Bars\",\n\t\tb: \"1F4F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"reception\",\n\t\t\t\"phone\",\n\t\t\t\"internet\",\n\t\t\t\"connection\",\n\t\t\t\"wifi\",\n\t\t\t\"bluetooth\",\n\t\t\t\"bars\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t45\n\t\t]\n\t},\n\t\"flag-gi\": {\n\t\ta: \"Gibraltar Flag\",\n\t\tb: \"1F1EC-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t14\n\t\t]\n\t},\n\t\"flag-gl\": {\n\t\ta: \"Greenland Flag\",\n\t\tb: \"1F1EC-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t15\n\t\t]\n\t},\n\tmotor_scooter: {\n\t\ta: \"Motor Scooter\",\n\t\tb: \"1F6F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"vespa\",\n\t\t\t\"sasha\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t20\n\t\t],\n\t\to: 9\n\t},\n\tmailbox: {\n\t\ta: \"Closed Mailbox with Raised Flag\",\n\t\tb: \"1F4EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t34\n\t\t]\n\t},\n\tvibration_mode: {\n\t\ta: \"Vibration Mode\",\n\t\tb: \"1F4F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"phone\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t42\n\t\t]\n\t},\n\thankey: {\n\t\ta: \"Pile of Poo\",\n\t\tb: \"1F4A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t25,\n\t\t\t15\n\t\t],\n\t\tn: [\n\t\t\t\"poop\",\n\t\t\t\"shit\"\n\t\t]\n\t},\n\trosette: {\n\t\ta: \"Rosette\",\n\t\tb: \"1F3F5-FE0F\",\n\t\tc: \"1F3F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"flower\",\n\t\t\t\"decoration\",\n\t\t\t\"military\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t20\n\t\t],\n\t\to: 7\n\t},\n\ttumbler_glass: {\n\t\ta: \"Tumbler Glass\",\n\t\tb: \"1F943\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"beverage\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"liquor\",\n\t\t\t\"booze\",\n\t\t\t\"bourbon\",\n\t\t\t\"scotch\",\n\t\t\t\"whisky\",\n\t\t\t\"glass\",\n\t\t\t\"shot\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t39\n\t\t],\n\t\to: 9\n\t},\n\tcup_with_straw: {\n\t\ta: \"Cup with Straw\",\n\t\tb: \"1F964\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-gm\": {\n\t\ta: \"Gambia Flag\",\n\t\tb: \"1F1EC-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t16\n\t\t]\n\t},\n\tmailbox_closed: {\n\t\ta: \"Closed Mailbox with Lowered Flag\",\n\t\tb: \"1F4EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"communication\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t33\n\t\t]\n\t},\n\tmobile_phone_off: {\n\t\ta: \"Mobile Phone off\",\n\t\tb: \"1F4F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mute\",\n\t\t\t\"orange-square\",\n\t\t\t\"silence\",\n\t\t\t\"quiet\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t43\n\t\t]\n\t},\n\tbusstop: {\n\t\ta: \"Bus Stop\",\n\t\tb: \"1F68F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"wait\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t23\n\t\t]\n\t},\n\tsmiley_cat: {\n\t\ta: \"Smiling Cat Face with Open Mouth\",\n\t\tb: \"1F63A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"happy\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t30\n\t\t]\n\t},\n\trose: {\n\t\ta: \"Rose\",\n\t\tb: \"1F339\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"valentines\",\n\t\t\t\"love\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t47\n\t\t]\n\t},\n\tmotorway: {\n\t\ta: \"Motorway\",\n\t\tb: \"1F6E3-FE0F\",\n\t\tc: \"1F6E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"road\",\n\t\t\t\"cupertino\",\n\t\t\t\"interstate\",\n\t\t\t\"highway\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\tsmile_cat: {\n\t\ta: \"Grinning Cat Face with Smiling Eyes\",\n\t\tb: \"1F638\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-gn\": {\n\t\ta: \"Guinea Flag\",\n\t\tb: \"1F1EC-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t17\n\t\t]\n\t},\n\twilted_flower: {\n\t\ta: \"Wilted Flower\",\n\t\tb: \"1F940\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"flower\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\tmailbox_with_mail: {\n\t\ta: \"Open Mailbox with Raised Flag\",\n\t\tb: \"1F4EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t35\n\t\t]\n\t},\n\tchopsticks: {\n\t\ta: \"Chopsticks\",\n\t\tb: \"1F962\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t14\n\t\t],\n\t\to: 10\n\t},\n\tfemale_sign: {\n\t\ta: \"Female Sign\",\n\t\tb: \"2640-FE0F\",\n\t\tc: \"2640\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\tmailbox_with_no_mail: {\n\t\ta: \"Open Mailbox with Lowered Flag\",\n\t\tb: \"1F4ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t36\n\t\t]\n\t},\n\tknife_fork_plate: {\n\t\ta: \"Knife Fork Plate\",\n\t\tb: \"1F37D-FE0F\",\n\t\tc: \"1F37D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\thibiscus: {\n\t\ta: \"Hibiscus\",\n\t\tb: \"1F33A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"flowers\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-gp\": {\n\t\ta: \"Guadeloupe Flag\",\n\t\tb: \"1F1EC-1F1F5\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t18\n\t\t]\n\t},\n\trailway_track: {\n\t\ta: \"Railway Track\",\n\t\tb: \"1F6E4-FE0F\",\n\t\tc: \"1F6E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"train\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tmale_sign: {\n\t\ta: \"Male Sign\",\n\t\tb: \"2642-FE0F\",\n\t\tc: \"2642\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\tjoy_cat: {\n\t\ta: \"Cat Face with Tears of Joy\",\n\t\tb: \"1F639\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"haha\",\n\t\t\t\"happy\",\n\t\t\t\"tears\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t29\n\t\t]\n\t},\n\tfuelpump: {\n\t\ta: \"Fuel Pump\",\n\t\tb: \"26FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gas station\",\n\t\t\t\"petroleum\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t13\n\t\t],\n\t\to: 5\n\t},\n\tsunflower: {\n\t\ta: \"Sunflower\",\n\t\tb: \"1F33B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t49\n\t\t]\n\t},\n\tpostbox: {\n\t\ta: \"Postbox\",\n\t\tb: \"1F4EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"letter\",\n\t\t\t\"envelope\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-gq\": {\n\t\ta: \"Equatorial Guinea Flag\",\n\t\tb: \"1F1EC-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t19\n\t\t]\n\t},\n\theart_eyes_cat: {\n\t\ta: \"Smiling Cat Face with Heart-Shaped Eyes\",\n\t\tb: \"1F63B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"cats\",\n\t\t\t\"valentines\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t31\n\t\t]\n\t},\n\tfork_and_knife: {\n\t\ta: \"Fork and Knife\",\n\t\tb: \"1F374\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t2\n\t\t]\n\t},\n\tmedical_symbol: {\n\t\ta: \"Medical Symbol\",\n\t\tb: \"2695-FE0F\",\n\t\tc: \"2695\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t14\n\t\t],\n\t\tn: [\n\t\t\t\"staff_of_aesculapius\"\n\t\t],\n\t\to: 4\n\t},\n\trecycle: {\n\t\ta: \"Black Universal Recycling Symbol\",\n\t\tb: \"267B-FE0F\",\n\t\tc: \"267B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"environment\",\n\t\t\t\"garbage\",\n\t\t\t\"trash\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t9\n\t\t],\n\t\to: 3\n\t},\n\tspoon: {\n\t\ta: \"Spoon\",\n\t\tb: \"1F944\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\",\n\t\t\t\"tableware\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t40\n\t\t],\n\t\to: 9\n\t},\n\tblossom: {\n\t\ta: \"Blossom\",\n\t\tb: \"1F33C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"flowers\",\n\t\t\t\"yellow\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t50\n\t\t]\n\t},\n\trotating_light: {\n\t\ta: \"Police Cars Revolving Light\",\n\t\tb: \"1F6A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"police\",\n\t\t\t\"ambulance\",\n\t\t\t\"911\",\n\t\t\t\"emergency\",\n\t\t\t\"alert\",\n\t\t\t\"error\",\n\t\t\t\"pinged\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t13\n\t\t]\n\t},\n\tsmirk_cat: {\n\t\ta: \"Cat Face with Wry Smile\",\n\t\tb: \"1F63C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"smirk\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t32\n\t\t]\n\t},\n\tballot_box_with_ballot: {\n\t\ta: \"Ballot Box with Ballot\",\n\t\tb: \"1F5F3-FE0F\",\n\t\tc: \"1F5F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-gr\": {\n\t\ta: \"Greece Flag\",\n\t\tb: \"1F1EC-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t20\n\t\t]\n\t},\n\tkissing_cat: {\n\t\ta: \"Kissing Cat Face with Closed Eyes\",\n\t\tb: \"1F63D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t33\n\t\t]\n\t},\n\tpencil2: {\n\t\ta: \"Pencil\",\n\t\tb: \"270F-FE0F\",\n\t\tc: \"270F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"write\",\n\t\t\t\"paper\",\n\t\t\t\"writing\",\n\t\t\t\"school\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\ttraffic_light: {\n\t\ta: \"Horizontal Traffic Light\",\n\t\tb: \"1F6A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"signal\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t10\n\t\t]\n\t},\n\tfleur_de_lis: {\n\t\ta: \"Fleur De Lis\",\n\t\tb: \"269C-FE0F\",\n\t\tc: \"269C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"decorative\",\n\t\t\t\"scout\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t19\n\t\t],\n\t\to: 4\n\t},\n\ttulip: {\n\t\ta: \"Tulip\",\n\t\tb: \"1F337\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"summer\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t45\n\t\t]\n\t},\n\thocho: {\n\t\ta: \"Hocho\",\n\t\tb: \"1F52A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"knife\",\n\t\t\t\"blade\",\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\",\n\t\t\t\"weapon\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t44\n\t\t],\n\t\tn: [\n\t\t\t\"knife\"\n\t\t]\n\t},\n\t\"flag-gs\": {\n\t\ta: \"South Georgia & South Sandwich Islands Flag\",\n\t\tb: \"1F1EC-1F1F8\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t21\n\t\t]\n\t},\n\tseedling: {\n\t\ta: \"Seedling\",\n\t\tb: \"1F331\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t39\n\t\t]\n\t},\n\tamphora: {\n\t\ta: \"Amphora\",\n\t\tb: \"1F3FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vase\",\n\t\t\t\"jar\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tscream_cat: {\n\t\ta: \"Weary Cat Face\",\n\t\tb: \"1F640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"munch\",\n\t\t\t\"scared\",\n\t\t\t\"scream\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t36\n\t\t]\n\t},\n\tvertical_traffic_light: {\n\t\ta: \"Vertical Traffic Light\",\n\t\tb: \"1F6A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"driving\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t11\n\t\t]\n\t},\n\tblack_nib: {\n\t\ta: \"Black Nib\",\n\t\tb: \"2712-FE0F\",\n\t\tc: \"2712\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pen\",\n\t\t\t\"stationery\",\n\t\t\t\"writing\",\n\t\t\t\"write\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-gt\": {\n\t\ta: \"Guatemala Flag\",\n\t\tb: \"1F1EC-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t22\n\t\t]\n\t},\n\ttrident: {\n\t\ta: \"Trident Emblem\",\n\t\tb: \"1F531\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weapon\",\n\t\t\t\"spear\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t51\n\t\t]\n\t},\n\t\"flag-gu\": {\n\t\ta: \"Guam Flag\",\n\t\tb: \"1F1EC-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t23\n\t\t]\n\t},\n\tname_badge: {\n\t\ta: \"Name Badge\",\n\t\tb: \"1F4DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fire\",\n\t\t\t\"forbid\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t18\n\t\t]\n\t},\n\tconstruction: {\n\t\ta: \"Construction Sign\",\n\t\tb: \"1F6A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wip\",\n\t\t\t\"progress\",\n\t\t\t\"caution\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t12\n\t\t]\n\t},\n\tlower_left_fountain_pen: {\n\t\ta: \"Lower Left Fountain Pen\",\n\t\tb: \"1F58B-FE0F\",\n\t\tc: \"1F58B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t29\n\t\t],\n\t\to: 7\n\t},\n\tevergreen_tree: {\n\t\ta: \"Evergreen Tree\",\n\t\tb: \"1F332\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t40\n\t\t]\n\t},\n\tcrying_cat_face: {\n\t\ta: \"Crying Cat Face\",\n\t\tb: \"1F63F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"tears\",\n\t\t\t\"weep\",\n\t\t\t\"sad\",\n\t\t\t\"cats\",\n\t\t\t\"upset\",\n\t\t\t\"cry\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t35\n\t\t]\n\t},\n\t\"flag-gw\": {\n\t\ta: \"Guinea-Bissau Flag\",\n\t\tb: \"1F1EC-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t24\n\t\t]\n\t},\n\tlower_left_ballpoint_pen: {\n\t\ta: \"Lower Left Ballpoint Pen\",\n\t\tb: \"1F58A-FE0F\",\n\t\tc: \"1F58A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t28\n\t\t],\n\t\to: 7\n\t},\n\tpouting_cat: {\n\t\ta: \"Pouting Cat Face\",\n\t\tb: \"1F63E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t34\n\t\t]\n\t},\n\tdeciduous_tree: {\n\t\ta: \"Deciduous Tree\",\n\t\tb: \"1F333\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t41\n\t\t]\n\t},\n\toctagonal_sign: {\n\t\ta: \"Octagonal Sign\",\n\t\tb: \"1F6D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\tbeginner: {\n\t\ta: \"Japanese Symbol for Beginner\",\n\t\tb: \"1F530\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"badge\",\n\t\t\t\"shield\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-gy\": {\n\t\ta: \"Guyana Flag\",\n\t\tb: \"1F1EC-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t25\n\t\t]\n\t},\n\tlower_left_paintbrush: {\n\t\ta: \"Lower Left Paintbrush\",\n\t\tb: \"1F58C-FE0F\",\n\t\tc: \"1F58C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\to: {\n\t\ta: \"Heavy Large Circle\",\n\t\tb: \"2B55\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"circle\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t23\n\t\t],\n\t\to: 5\n\t},\n\tpalm_tree: {\n\t\ta: \"Palm Tree\",\n\t\tb: \"1F334\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"mojito\",\n\t\t\t\"tropical\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t42\n\t\t]\n\t},\n\tanchor: {\n\t\ta: \"Anchor\",\n\t\tb: \"2693\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ship\",\n\t\t\t\"ferry\",\n\t\t\t\"sea\",\n\t\t\t\"boat\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t12\n\t\t],\n\t\to: 4\n\t},\n\tsee_no_evil: {\n\t\ta: \"See-No-Evil Monkey\",\n\t\tb: \"1F648\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monkey\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"haha\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t43\n\t\t]\n\t},\n\tboat: {\n\t\ta: \"Sailboat\",\n\t\tb: \"26F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t48,\n\t\t\t43\n\t\t],\n\t\tn: [\n\t\t\t\"sailboat\"\n\t\t],\n\t\to: 5\n\t},\n\twhite_check_mark: {\n\t\ta: \"White Heavy Check Mark\",\n\t\tb: \"2705\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"green-square\",\n\t\t\t\"ok\",\n\t\t\t\"agree\",\n\t\t\t\"vote\",\n\t\t\t\"election\",\n\t\t\t\"answer\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-hk\": {\n\t\ta: \"Hong Kong Sar China Flag\",\n\t\tb: \"1F1ED-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t26\n\t\t]\n\t},\n\tlower_left_crayon: {\n\t\ta: \"Lower Left Crayon\",\n\t\tb: \"1F58D-FE0F\",\n\t\tc: \"1F58D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t31\n\t\t],\n\t\to: 7\n\t},\n\thear_no_evil: {\n\t\ta: \"Hear-No-Evil Monkey\",\n\t\tb: \"1F649\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"monkey\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t44\n\t\t]\n\t},\n\tcactus: {\n\t\ta: \"Cactus\",\n\t\tb: \"1F335\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t43\n\t\t]\n\t},\n\tear_of_rice: {\n\t\ta: \"Ear of Rice\",\n\t\tb: \"1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t0\n\t\t]\n\t},\n\tspeak_no_evil: {\n\t\ta: \"Speak-No-Evil Monkey\",\n\t\tb: \"1F64A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monkey\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"omg\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t45\n\t\t]\n\t},\n\t\"flag-hm\": {\n\t\ta: \"Heard & Mcdonald Islands Flag\",\n\t\tb: \"1F1ED-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t27\n\t\t]\n\t},\n\tballot_box_with_check: {\n\t\ta: \"Ballot Box with Check\",\n\t\tb: \"2611-FE0F\",\n\t\tc: \"2611\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"agree\",\n\t\t\t\"confirm\",\n\t\t\t\"black-square\",\n\t\t\t\"vote\",\n\t\t\t\"election\",\n\t\t\t\"yes\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t22\n\t\t],\n\t\to: 1\n\t},\n\tcanoe: {\n\t\ta: \"Canoe\",\n\t\tb: \"1F6F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boat\",\n\t\t\t\"paddle\",\n\t\t\t\"water\",\n\t\t\t\"ship\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t21\n\t\t],\n\t\to: 9\n\t},\n\tmemo: {\n\t\ta: \"Memo\",\n\t\tb: \"1F4DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"write\",\n\t\t\t\"documents\",\n\t\t\t\"stationery\",\n\t\t\t\"pencil\",\n\t\t\t\"paper\",\n\t\t\t\"writing\",\n\t\t\t\"legal\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\",\n\t\t\t\"study\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t20\n\t\t],\n\t\tn: [\n\t\t\t\"pencil\"\n\t\t]\n\t},\n\therb: {\n\t\ta: \"Herb\",\n\t\tb: \"1F33F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"medicine\",\n\t\t\t\"weed\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-hn\": {\n\t\ta: \"Honduras Flag\",\n\t\tb: \"1F1ED-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t28\n\t\t]\n\t},\n\theavy_check_mark: {\n\t\ta: \"Heavy Check Mark\",\n\t\tb: \"2714-FE0F\",\n\t\tc: \"2714\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"nike\",\n\t\t\t\"answer\",\n\t\t\t\"yes\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t44\n\t\t],\n\t\to: 1\n\t},\n\tbriefcase: {\n\t\ta: \"Briefcase\",\n\t\tb: \"1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"documents\",\n\t\t\t\"work\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"job\",\n\t\t\t\"career\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t39\n\t\t]\n\t},\n\tspeedboat: {\n\t\ta: \"Speedboat\",\n\t\tb: \"1F6A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ship\",\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t9\n\t\t]\n\t},\n\tbaby: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F476-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F476-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F476-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F476-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F476-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Baby\",\n\t\tb: \"1F476\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"child\",\n\t\t\t\"boy\",\n\t\t\t\"girl\",\n\t\t\t\"toddler\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t10\n\t\t]\n\t},\n\theavy_multiplication_x: {\n\t\ta: \"Heavy Multiplication X\",\n\t\tb: \"2716-FE0F\",\n\t\tc: \"2716\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t45\n\t\t],\n\t\to: 1\n\t},\n\tchild: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D2-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D2-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D2-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D2-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D2-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Child\",\n\t\tb: \"1F9D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t4\n\t\t],\n\t\to: 10\n\t},\n\tshamrock: {\n\t\ta: \"Shamrock\",\n\t\tb: \"2618-FE0F\",\n\t\tc: \"2618\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"irish\",\n\t\t\t\"clover\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t25\n\t\t],\n\t\to: 4\n\t},\n\tpassenger_ship: {\n\t\ta: \"Passenger Ship\",\n\t\tb: \"1F6F3-FE0F\",\n\t\tc: \"1F6F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"yacht\",\n\t\t\t\"cruise\",\n\t\t\t\"ferry\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-hr\": {\n\t\ta: \"Croatia Flag\",\n\t\tb: \"1F1ED-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t29\n\t\t]\n\t},\n\tfile_folder: {\n\t\ta: \"File Folder\",\n\t\tb: \"1F4C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"business\",\n\t\t\t\"office\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t44\n\t\t]\n\t},\n\tx: {\n\t\ta: \"Cross Mark\",\n\t\tb: \"274C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"no\",\n\t\t\t\"delete\",\n\t\t\t\"remove\",\n\t\t\t\"cancel\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t1\n\t\t]\n\t},\n\tfour_leaf_clover: {\n\t\ta: \"Four Leaf Clover\",\n\t\tb: \"1F340\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"lucky\",\n\t\t\t\"irish\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t2\n\t\t]\n\t},\n\topen_file_folder: {\n\t\ta: \"Open File Folder\",\n\t\tb: \"1F4C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"load\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t45\n\t\t]\n\t},\n\tboy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F466-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F466-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F466-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F466-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F466-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Boy\",\n\t\tb: \"1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"guy\",\n\t\t\t\"teenager\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t42\n\t\t]\n\t},\n\tferry: {\n\t\ta: \"Ferry\",\n\t\tb: \"26F4-FE0F\",\n\t\tc: \"26F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boat\",\n\t\t\t\"ship\",\n\t\t\t\"yacht\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t42\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-ht\": {\n\t\ta: \"Haiti Flag\",\n\t\tb: \"1F1ED-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t30\n\t\t]\n\t},\n\tgirl: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F467-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F467-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F467-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F467-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fe.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F467-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3ff.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Girl\",\n\t\tb: \"1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"woman\",\n\t\t\t\"teenager\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t48\n\t\t]\n\t},\n\tnegative_squared_cross_mark: {\n\t\ta: \"Negative Squared Cross Mark\",\n\t\tb: \"274E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"x\",\n\t\t\t\"green-square\",\n\t\t\t\"no\",\n\t\t\t\"deny\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-hu\": {\n\t\ta: \"Hungary Flag\",\n\t\tb: \"1F1ED-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t31\n\t\t]\n\t},\n\tcard_index_dividers: {\n\t\ta: \"Card Index Dividers\",\n\t\tb: \"1F5C2-FE0F\",\n\t\tc: \"1F5C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"organizing\",\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\tmaple_leaf: {\n\t\ta: \"Maple Leaf\",\n\t\tb: \"1F341\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"ca\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t3\n\t\t]\n\t},\n\tmotor_boat: {\n\t\ta: \"Motor Boat\",\n\t\tb: \"1F6E5-FE0F\",\n\t\tc: \"1F6E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"ship\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ic\": {\n\t\ta: \"Canary Islands Flag\",\n\t\tb: \"1F1EE-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t32\n\t\t]\n\t},\n\tfallen_leaf: {\n\t\ta: \"Fallen Leaf\",\n\t\tb: \"1F342\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"leaves\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t4\n\t\t]\n\t},\n\tadult: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D1-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fb.png\",\n\t\t\t\tsheet_x: 42,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D1-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D1-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D1-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D1-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Adult\",\n\t\tb: \"1F9D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t50\n\t\t],\n\t\to: 10\n\t},\n\tship: {\n\t\ta: \"Ship\",\n\t\tb: \"1F6A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"titanic\",\n\t\t\t\"deploy\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t42\n\t\t]\n\t},\n\theavy_plus_sign: {\n\t\ta: \"Heavy Plus Sign\",\n\t\tb: \"2795\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\",\n\t\t\t\"addition\",\n\t\t\t\"more\",\n\t\t\t\"increase\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t9\n\t\t]\n\t},\n\tdate: {\n\t\ta: \"Calendar\",\n\t\tb: \"1F4C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"calendar\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t48\n\t\t]\n\t},\n\tman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Man\",\n\t\tb: \"1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mustache\",\n\t\t\t\"father\",\n\t\t\t\"dad\",\n\t\t\t\"guy\",\n\t\t\t\"classy\",\n\t\t\t\"sir\",\n\t\t\t\"moustache\"\n\t\t],\n\t\tk: [\n\t\t\t18,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-id\": {\n\t\ta: \"Indonesia Flag\",\n\t\tb: \"1F1EE-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t33\n\t\t]\n\t},\n\tleaves: {\n\t\ta: \"Leaf Fluttering in Wind\",\n\t\tb: \"1F343\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"tree\",\n\t\t\t\"vegetable\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t5\n\t\t]\n\t},\n\theavy_minus_sign: {\n\t\ta: \"Heavy Minus Sign\",\n\t\tb: \"2796\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\",\n\t\t\t\"subtract\",\n\t\t\t\"less\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t10\n\t\t]\n\t},\n\tcalendar: {\n\t\ta: \"Tear-off Calendar\",\n\t\tb: \"1F4C6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"schedule\",\n\t\t\t\"date\",\n\t\t\t\"planning\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t49\n\t\t]\n\t},\n\tairplane: {\n\t\ta: \"Airplane\",\n\t\tb: \"2708-FE0F\",\n\t\tc: \"2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\",\n\t\t\t\"flight\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t16\n\t\t],\n\t\to: 1\n\t},\n\tspiral_note_pad: {\n\t\ta: \"Spiral Note Pad\",\n\t\tb: \"1F5D2-FE0F\",\n\t\tc: \"1F5D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t8\n\t\t],\n\t\to: 7\n\t},\n\theavy_division_sign: {\n\t\ta: \"Heavy Division Sign\",\n\t\tb: \"2797\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"divide\",\n\t\t\t\"math\",\n\t\t\t\"calculation\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t11\n\t\t]\n\t},\n\tsmall_airplane: {\n\t\ta: \"Small Airplane\",\n\t\tb: \"1F6E9-FE0F\",\n\t\tc: \"1F6E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"flight\",\n\t\t\t\"transportation\",\n\t\t\t\"fly\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\twoman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Woman\",\n\t\tb: \"1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girls\",\n\t\t\t\"lady\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-ie\": {\n\t\ta: \"Ireland Flag\",\n\t\tb: \"1F1EE-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t34\n\t\t]\n\t},\n\tcurly_loop: {\n\t\ta: \"Curly Loop\",\n\t\tb: \"27B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"scribble\",\n\t\t\t\"draw\",\n\t\t\t\"shape\",\n\t\t\t\"squiggle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-il\": {\n\t\ta: \"Israel Flag\",\n\t\tb: \"1F1EE-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t35\n\t\t]\n\t},\n\tairplane_departure: {\n\t\ta: \"Airplane Departure\",\n\t\tb: \"1F6EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tspiral_calendar_pad: {\n\t\ta: \"Spiral Calendar Pad\",\n\t\tb: \"1F5D3-FE0F\",\n\t\tc: \"1F5D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t9\n\t\t],\n\t\to: 7\n\t},\n\tolder_adult: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Older Adult\",\n\t\tb: \"1F9D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tairplane_arriving: {\n\t\ta: \"Airplane Arriving\",\n\t\tb: \"1F6EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\tcard_index: {\n\t\ta: \"Card Index\",\n\t\tb: \"1F4C7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t50\n\t\t]\n\t},\n\tloop: {\n\t\ta: \"Double Curly Loop\",\n\t\tb: \"27BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tape\",\n\t\t\t\"cassette\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t14\n\t\t]\n\t},\n\tolder_man: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F474-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F474-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F474-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F474-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F474-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Older Man\",\n\t\tb: \"1F474\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"human\",\n\t\t\t\"male\",\n\t\t\t\"men\",\n\t\t\t\"old\",\n\t\t\t\"elder\",\n\t\t\t\"senior\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-im\": {\n\t\ta: \"Isle of Man Flag\",\n\t\tb: \"1F1EE-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-in\": {\n\t\ta: \"India Flag\",\n\t\tb: \"1F1EE-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t37\n\t\t]\n\t},\n\tchart_with_upwards_trend: {\n\t\ta: \"Chart with Upwards Trend\",\n\t\tb: \"1F4C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"recovery\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"good\",\n\t\t\t\"success\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t51\n\t\t]\n\t},\n\tpart_alternation_mark: {\n\t\ta: \"Part Alternation Mark\",\n\t\tb: \"303D-FE0F\",\n\t\tc: \"303D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"bad\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t25\n\t\t],\n\t\to: 3\n\t},\n\tseat: {\n\t\ta: \"Seat\",\n\t\tb: \"1F4BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sit\",\n\t\t\t\"airplane\",\n\t\t\t\"transport\",\n\t\t\t\"bus\",\n\t\t\t\"flight\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t37\n\t\t]\n\t},\n\tolder_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F475-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F475-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F475-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F475-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F475-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Older Woman\",\n\t\tb: \"1F475\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"human\",\n\t\t\t\"female\",\n\t\t\t\"women\",\n\t\t\t\"lady\",\n\t\t\t\"old\",\n\t\t\t\"elder\",\n\t\t\t\"senior\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t4\n\t\t]\n\t},\n\teight_spoked_asterisk: {\n\t\ta: \"Eight Spoked Asterisk\",\n\t\tb: \"2733-FE0F\",\n\t\tc: \"2733\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"star\",\n\t\t\t\"sparkle\",\n\t\t\t\"green-square\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t49\n\t\t],\n\t\to: 1\n\t},\n\tchart_with_downwards_trend: {\n\t\ta: \"Chart with Downwards Trend\",\n\t\tb: \"1F4C9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"recession\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bad\",\n\t\t\t\"failure\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t0\n\t\t]\n\t},\n\t\"flag-io\": {\n\t\ta: \"British Indian Ocean Territory Flag\",\n\t\tb: \"1F1EE-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t38\n\t\t]\n\t},\n\t\"male-doctor\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2695\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Doctor\",\n\t\tb: \"1F468-200D-2695-FE0F\",\n\t\tc: \"1F468-200D-2695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t43\n\t\t]\n\t},\n\thelicopter: {\n\t\ta: \"Helicopter\",\n\t\tb: \"1F681\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t9\n\t\t]\n\t},\n\t\"female-doctor\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2695\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Doctor\",\n\t\tb: \"1F469-200D-2695-FE0F\",\n\t\tc: \"1F469-200D-2695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t1\n\t\t]\n\t},\n\tsuspension_railway: {\n\t\ta: \"Suspension Railway\",\n\t\tb: \"1F69F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t39\n\t\t]\n\t},\n\tbar_chart: {\n\t\ta: \"Bar Chart\",\n\t\tb: \"1F4CA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-iq\": {\n\t\ta: \"Iraq Flag\",\n\t\tb: \"1F1EE-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t39\n\t\t]\n\t},\n\teight_pointed_black_star: {\n\t\ta: \"Eight Pointed Black Star\",\n\t\tb: \"2734-FE0F\",\n\t\tc: \"2734\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"shape\",\n\t\t\t\"polygon\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t50\n\t\t],\n\t\to: 1\n\t},\n\tmountain_cableway: {\n\t\ta: \"Mountain Cableway\",\n\t\tb: \"1F6A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"ski\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t40\n\t\t]\n\t},\n\t\"male-student\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Student\",\n\t\tb: \"1F468-200D-1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t14\n\t\t]\n\t},\n\tclipboard: {\n\t\ta: \"Clipboard\",\n\t\tb: \"1F4CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"documents\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-ir\": {\n\t\ta: \"Iran Flag\",\n\t\tb: \"1F1EE-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t40\n\t\t]\n\t},\n\tsparkle: {\n\t\ta: \"Sparkle\",\n\t\tb: \"2747-FE0F\",\n\t\tc: \"2747\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"green-square\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"fireworks\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t0\n\t\t],\n\t\to: 1\n\t},\n\t\"female-student\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Student\",\n\t\tb: \"1F469-200D-1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t29\n\t\t]\n\t},\n\tpushpin: {\n\t\ta: \"Pushpin\",\n\t\tb: \"1F4CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"mark\",\n\t\t\t\"here\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t3\n\t\t]\n\t},\n\taerial_tramway: {\n\t\ta: \"Aerial Tramway\",\n\t\tb: \"1F6A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"ski\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-is\": {\n\t\ta: \"Iceland Flag\",\n\t\tb: \"1F1EE-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t41\n\t\t]\n\t},\n\tbangbang: {\n\t\ta: \"Double Exclamation Mark\",\n\t\tb: \"203C-FE0F\",\n\t\tc: \"203C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"exclamation\",\n\t\t\t\"surprise\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t29\n\t\t],\n\t\to: 1\n\t},\n\tinterrobang: {\n\t\ta: \"Exclamation Question Mark\",\n\t\tb: \"2049-FE0F\",\n\t\tc: \"2049\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wat\",\n\t\t\t\"punctuation\",\n\t\t\t\"surprise\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t30\n\t\t],\n\t\to: 3\n\t},\n\tsatellite: {\n\t\ta: \"Satellite\",\n\t\tb: \"1F6F0-FE0F\",\n\t\tc: \"1F6F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"future\",\n\t\t\t\"radio\",\n\t\t\t\"space\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\tit: {\n\t\ta: \"Italy Flag\",\n\t\tb: \"1F1EE-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"italy\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t42\n\t\t],\n\t\tn: [\n\t\t\t\"flag-it\"\n\t\t]\n\t},\n\t\"male-teacher\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Teacher\",\n\t\tb: \"1F468-200D-1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t32\n\t\t]\n\t},\n\tround_pushpin: {\n\t\ta: \"Round Pushpin\",\n\t\tb: \"1F4CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"location\",\n\t\t\t\"map\",\n\t\t\t\"here\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-je\": {\n\t\ta: \"Jersey Flag\",\n\t\tb: \"1F1EF-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t43\n\t\t]\n\t},\n\tquestion: {\n\t\ta: \"Black Question Mark Ornament\",\n\t\tb: \"2753\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"doubt\",\n\t\t\t\"confused\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t3\n\t\t]\n\t},\n\trocket: {\n\t\ta: \"Rocket\",\n\t\tb: \"1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"launch\",\n\t\t\t\"ship\",\n\t\t\t\"staffmode\",\n\t\t\t\"NASA\",\n\t\t\t\"outer space\",\n\t\t\t\"outer_space\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t8\n\t\t]\n\t},\n\t\"female-teacher\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Teacher\",\n\t\tb: \"1F469-200D-1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t47\n\t\t]\n\t},\n\tpaperclip: {\n\t\ta: \"Paperclip\",\n\t\tb: \"1F4CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t5\n\t\t]\n\t},\n\tlinked_paperclips: {\n\t\ta: \"Linked Paperclips\",\n\t\tb: \"1F587-FE0F\",\n\t\tc: \"1F587\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t27\n\t\t],\n\t\to: 7\n\t},\n\tflying_saucer: {\n\t\ta: \"Flying Saucer\",\n\t\tb: \"1F6F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\t\"male-judge\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2696\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Judge\",\n\t\tb: \"1F468-200D-2696-FE0F\",\n\t\tc: \"1F468-200D-2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t49\n\t\t]\n\t},\n\tgrey_question: {\n\t\ta: \"White Question Mark Ornament\",\n\t\tb: \"2754\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"doubts\",\n\t\t\t\"gray\",\n\t\t\t\"huh\",\n\t\t\t\"confused\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-jm\": {\n\t\ta: \"Jamaica Flag\",\n\t\tb: \"1F1EF-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t44\n\t\t]\n\t},\n\tbellhop_bell: {\n\t\ta: \"Bellhop Bell\",\n\t\tb: \"1F6CE-FE0F\",\n\t\tc: \"1F6CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"service\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t3\n\t\t],\n\t\to: 7\n\t},\n\tstraight_ruler: {\n\t\ta: \"Straight Ruler\",\n\t\tb: \"1F4CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"calculate\",\n\t\t\t\"length\",\n\t\t\t\"math\",\n\t\t\t\"school\",\n\t\t\t\"drawing\",\n\t\t\t\"architect\",\n\t\t\t\"sketch\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-jo\": {\n\t\ta: \"Jordan Flag\",\n\t\tb: \"1F1EF-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t45\n\t\t]\n\t},\n\t\"female-judge\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2696\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Judge\",\n\t\tb: \"1F469-200D-2696-FE0F\",\n\t\tc: \"1F469-200D-2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t7\n\t\t]\n\t},\n\tgrey_exclamation: {\n\t\ta: \"White Exclamation Mark Ornament\",\n\t\tb: \"2755\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"surprise\",\n\t\t\t\"punctuation\",\n\t\t\t\"gray\",\n\t\t\t\"wow\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t5\n\t\t]\n\t},\n\tdoor: {\n\t\ta: \"Door\",\n\t\tb: \"1F6AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"house\",\n\t\t\t\"entry\",\n\t\t\t\"exit\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t15\n\t\t]\n\t},\n\t\"male-farmer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Farmer\",\n\t\tb: \"1F468-200D-1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t2\n\t\t]\n\t},\n\tjp: {\n\t\ta: \"Japan Flag\",\n\t\tb: \"1F1EF-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t46\n\t\t],\n\t\tn: [\n\t\t\t\"flag-jp\"\n\t\t]\n\t},\n\ttriangular_ruler: {\n\t\ta: \"Triangular Ruler\",\n\t\tb: \"1F4D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"math\",\n\t\t\t\"architect\",\n\t\t\t\"sketch\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t7\n\t\t]\n\t},\n\texclamation: {\n\t\ta: \"Heavy Exclamation Mark Symbol\",\n\t\tb: \"2757\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"heavy_exclamation_mark\",\n\t\t\t\"danger\",\n\t\t\t\"surprise\",\n\t\t\t\"punctuation\",\n\t\t\t\"wow\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t6\n\t\t],\n\t\tn: [\n\t\t\t\"heavy_exclamation_mark\"\n\t\t],\n\t\to: 5\n\t},\n\tbed: {\n\t\ta: \"Bed\",\n\t\tb: \"1F6CF-FE0F\",\n\t\tc: \"1F6CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sleep\",\n\t\t\t\"rest\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\t\"female-farmer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Farmer\",\n\t\tb: \"1F469-200D-1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t17\n\t\t]\n\t},\n\tscissors: {\n\t\ta: \"Black Scissors\",\n\t\tb: \"2702-FE0F\",\n\t\tc: \"2702\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"cut\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t14\n\t\t],\n\t\to: 1\n\t},\n\twavy_dash: {\n\t\ta: \"Wavy Dash\",\n\t\tb: \"3030-FE0F\",\n\t\tc: \"3030\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"draw\",\n\t\t\t\"line\",\n\t\t\t\"moustache\",\n\t\t\t\"mustache\",\n\t\t\t\"squiggle\",\n\t\t\t\"scribble\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t24\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ke\": {\n\t\ta: \"Kenya Flag\",\n\t\tb: \"1F1F0-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t47\n\t\t]\n\t},\n\t\"flag-kg\": {\n\t\ta: \"Kyrgyzstan Flag\",\n\t\tb: \"1F1F0-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t48\n\t\t]\n\t},\n\tcouch_and_lamp: {\n\t\ta: \"Couch and Lamp\",\n\t\tb: \"1F6CB-FE0F\",\n\t\tc: \"1F6CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"chill\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\t\"male-cook\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Cook\",\n\t\tb: \"1F468-200D-1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t8\n\t\t]\n\t},\n\tcard_file_box: {\n\t\ta: \"Card File Box\",\n\t\tb: \"1F5C3-FE0F\",\n\t\tc: \"1F5C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\tcopyright: {\n\t\ta: \"Copyright Sign\",\n\t\tb: \"00A9-FE0F\",\n\t\tc: \"00A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"ip\",\n\t\t\t\"license\",\n\t\t\t\"circle\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t12\n\t\t],\n\t\to: 1\n\t},\n\tfile_cabinet: {\n\t\ta: \"File Cabinet\",\n\t\tb: \"1F5C4-FE0F\",\n\t\tc: \"1F5C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"filing\",\n\t\t\t\"organizing\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\tregistered: {\n\t\ta: \"Registered Sign\",\n\t\tb: \"00AE-FE0F\",\n\t\tc: \"00AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t13\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-kh\": {\n\t\ta: \"Cambodia Flag\",\n\t\tb: \"1F1F0-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t49\n\t\t]\n\t},\n\t\"female-cook\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Cook\",\n\t\tb: \"1F469-200D-1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t23\n\t\t]\n\t},\n\ttoilet: {\n\t\ta: \"Toilet\",\n\t\tb: \"1F6BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"restroom\",\n\t\t\t\"wc\",\n\t\t\t\"washroom\",\n\t\t\t\"bathroom\",\n\t\t\t\"potty\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t33\n\t\t]\n\t},\n\twastebasket: {\n\t\ta: \"Wastebasket\",\n\t\tb: \"1F5D1-FE0F\",\n\t\tc: \"1F5D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"bin\",\n\t\t\t\"trash\",\n\t\t\t\"rubbish\",\n\t\t\t\"garbage\",\n\t\t\t\"toss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t7\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ki\": {\n\t\ta: \"Kiribati Flag\",\n\t\tb: \"1F1F0-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t50\n\t\t]\n\t},\n\tshower: {\n\t\ta: \"Shower\",\n\t\tb: \"1F6BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"water\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-mechanic\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Mechanic\",\n\t\tb: \"1F468-200D-1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t19\n\t\t]\n\t},\n\ttm: {\n\t\ta: \"Trade Mark Sign\",\n\t\tb: \"2122-FE0F\",\n\t\tc: \"2122\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"trademark\",\n\t\t\t\"brand\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t31\n\t\t],\n\t\to: 1\n\t},\n\thash: {\n\t\ta: \"Hash Key\",\n\t\tb: \"0023-FE0F-20E3\",\n\t\tc: \"0023-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"symbol\",\n\t\t\t\"blue-square\",\n\t\t\t\"twitter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-km\": {\n\t\ta: \"Comoros Flag\",\n\t\tb: \"1F1F0-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t51\n\t\t]\n\t},\n\tbathtub: {\n\t\ta: \"Bathtub\",\n\t\tb: \"1F6C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"shower\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t42\n\t\t]\n\t},\n\t\"female-mechanic\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Mechanic\",\n\t\tb: \"1F469-200D-1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t29\n\t\t]\n\t},\n\tlock: {\n\t\ta: \"Lock\",\n\t\tb: \"1F512\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"password\",\n\t\t\t\"padlock\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t20\n\t\t]\n\t},\n\t\"male-factory-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Factory Worker\",\n\t\tb: \"1F468-200D-1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t38\n\t\t]\n\t},\n\t\"flag-kn\": {\n\t\ta: \"St. Kitts & Nevis Flag\",\n\t\tb: \"1F1F0-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t0\n\t\t]\n\t},\n\thourglass: {\n\t\ta: \"Hourglass\",\n\t\tb: \"231B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"clock\",\n\t\t\t\"oldschool\",\n\t\t\t\"limit\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\tkeycap_star: {\n\t\ta: \"Keycap Star\",\n\t\tb: \"002A-FE0F-20E3\",\n\t\tc: \"002A-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t0,\n\t\t\t1\n\t\t],\n\t\to: 3\n\t},\n\tunlock: {\n\t\ta: \"Open Lock\",\n\t\tb: \"1F513\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"privacy\",\n\t\t\t\"security\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-kp\": {\n\t\ta: \"North Korea Flag\",\n\t\tb: \"1F1F0-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t1\n\t\t]\n\t},\n\t\"female-factory-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Factory Worker\",\n\t\tb: \"1F469-200D-1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t1\n\t\t]\n\t},\n\tzero: {\n\t\ta: \"Keycap 0\",\n\t\tb: \"0030-FE0F-20E3\",\n\t\tc: \"0030-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"0\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"null\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t2\n\t\t],\n\t\to: 3\n\t},\n\tlock_with_ink_pen: {\n\t\ta: \"Lock with Ink Pen\",\n\t\tb: \"1F50F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"secret\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t17\n\t\t]\n\t},\n\thourglass_flowing_sand: {\n\t\ta: \"Hourglass with Flowing Sand\",\n\t\tb: \"23F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"oldschool\",\n\t\t\t\"time\",\n\t\t\t\"countdown\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t3\n\t\t]\n\t},\n\tone: {\n\t\ta: \"Keycap 1\",\n\t\tb: \"0031-FE0F-20E3\",\n\t\tc: \"0031-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\",\n\t\t\t\"1\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t3\n\t\t],\n\t\to: 3\n\t},\n\tkr: {\n\t\ta: \"South Korea Flag\",\n\t\tb: \"1F1F0-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"south\",\n\t\t\t\"korea\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t3,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"flag-kr\"\n\t\t]\n\t},\n\twatch: {\n\t\ta: \"Watch\",\n\t\tb: \"231A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"accessories\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t41\n\t\t],\n\t\to: 1\n\t},\n\t\"male-office-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Office Worker\",\n\t\tb: \"1F468-200D-1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t13\n\t\t]\n\t},\n\tclosed_lock_with_key: {\n\t\ta: \"Closed Lock with Key\",\n\t\tb: \"1F510\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"privacy\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-office-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Office Worker\",\n\t\tb: \"1F469-200D-1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t23\n\t\t]\n\t},\n\ttwo: {\n\t\ta: \"Keycap 2\",\n\t\tb: \"0032-FE0F-20E3\",\n\t\tc: \"0032-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"2\",\n\t\t\t\"prime\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t4\n\t\t],\n\t\to: 3\n\t},\n\talarm_clock: {\n\t\ta: \"Alarm Clock\",\n\t\tb: \"23F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"wake\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t0\n\t\t]\n\t},\n\tkey: {\n\t\ta: \"Key\",\n\t\tb: \"1F511\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"door\",\n\t\t\t\"password\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-kw\": {\n\t\ta: \"Kuwait Flag\",\n\t\tb: \"1F1F0-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t3\n\t\t]\n\t},\n\tstopwatch: {\n\t\ta: \"Stopwatch\",\n\t\tb: \"23F1-FE0F\",\n\t\tc: \"23F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"deadline\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t1\n\t\t]\n\t},\n\t\"male-scientist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Scientist\",\n\t\tb: \"1F468-200D-1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t25\n\t\t]\n\t},\n\tthree: {\n\t\ta: \"Keycap 3\",\n\t\tb: \"0033-FE0F-20E3\",\n\t\tc: \"0033-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"3\",\n\t\t\t\"numbers\",\n\t\t\t\"prime\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t5\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-ky\": {\n\t\ta: \"Cayman Islands Flag\",\n\t\tb: \"1F1F0-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t4\n\t\t]\n\t},\n\told_key: {\n\t\ta: \"Old Key\",\n\t\tb: \"1F5DD-FE0F\",\n\t\tc: \"1F5DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"door\",\n\t\t\t\"password\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-kz\": {\n\t\ta: \"Kazakhstan Flag\",\n\t\tb: \"1F1F0-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t5\n\t\t]\n\t},\n\thammer: {\n\t\ta: \"Hammer\",\n\t\tb: \"1F528\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t42\n\t\t]\n\t},\n\t\"female-scientist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Scientist\",\n\t\tb: \"1F469-200D-1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t35\n\t\t]\n\t},\n\ttimer_clock: {\n\t\ta: \"Timer Clock\",\n\t\tb: \"23F2-FE0F\",\n\t\tc: \"23F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"alarm\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t2\n\t\t]\n\t},\n\tfour: {\n\t\ta: \"Keycap 4\",\n\t\tb: \"0034-FE0F-20E3\",\n\t\tc: \"0034-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"4\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t6\n\t\t],\n\t\to: 3\n\t},\n\t\"male-technologist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Technologist\",\n\t\tb: \"1F468-200D-1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t7\n\t\t]\n\t},\n\tmantelpiece_clock: {\n\t\ta: \"Mantelpiece Clock\",\n\t\tb: \"1F570-FE0F\",\n\t\tc: \"1F570\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"time\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tfive: {\n\t\ta: \"Keycap 5\",\n\t\tb: \"0035-FE0F-20E3\",\n\t\tc: \"0035-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"5\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"prime\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t7\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-la\": {\n\t\ta: \"Laos Flag\",\n\t\tb: \"1F1F1-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t6\n\t\t]\n\t},\n\tpick: {\n\t\ta: \"Pick\",\n\t\tb: \"26CF-FE0F\",\n\t\tc: \"26CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"dig\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t32\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-lb\": {\n\t\ta: \"Lebanon Flag\",\n\t\tb: \"1F1F1-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t7\n\t\t]\n\t},\n\tclock12: {\n\t\ta: \"Clock Face Twelve Oclock\",\n\t\tb: \"1F55B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"noon\",\n\t\t\t\"midnight\",\n\t\t\t\"midday\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t29\n\t\t]\n\t},\n\thammer_and_pick: {\n\t\ta: \"Hammer and Pick\",\n\t\tb: \"2692-FE0F\",\n\t\tc: \"2692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t11\n\t\t],\n\t\to: 4\n\t},\n\tsix: {\n\t\ta: \"Keycap 6\",\n\t\tb: \"0036-FE0F-20E3\",\n\t\tc: \"0036-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"6\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t8\n\t\t],\n\t\to: 3\n\t},\n\t\"female-technologist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Technologist\",\n\t\tb: \"1F469-200D-1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t17\n\t\t]\n\t},\n\thammer_and_wrench: {\n\t\ta: \"Hammer and Wrench\",\n\t\tb: \"1F6E0-FE0F\",\n\t\tc: \"1F6E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t8\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-lc\": {\n\t\ta: \"St. Lucia Flag\",\n\t\tb: \"1F1F1-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t8\n\t\t]\n\t},\n\tclock1230: {\n\t\ta: \"Clock Face Twelve-Thirty\",\n\t\tb: \"1F567\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t41\n\t\t]\n\t},\n\tseven: {\n\t\ta: \"Keycap 7\",\n\t\tb: \"0037-FE0F-20E3\",\n\t\tc: \"0037-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"7\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"prime\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t9\n\t\t],\n\t\to: 3\n\t},\n\t\"male-singer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Singer\",\n\t\tb: \"1F468-200D-1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t20\n\t\t]\n\t},\n\teight: {\n\t\ta: \"Keycap 8\",\n\t\tb: \"0038-FE0F-20E3\",\n\t\tc: \"0038-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"8\",\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t10\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-li\": {\n\t\ta: \"Liechtenstein Flag\",\n\t\tb: \"1F1F1-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t9\n\t\t]\n\t},\n\tdagger_knife: {\n\t\ta: \"Dagger Knife\",\n\t\tb: \"1F5E1-FE0F\",\n\t\tc: \"1F5E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\tclock1: {\n\t\ta: \"Clock Face One Oclock\",\n\t\tb: \"1F550\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-singer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Singer\",\n\t\tb: \"1F469-200D-1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-artist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Artist\",\n\t\tb: \"1F468-200D-1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t26\n\t\t]\n\t},\n\tcrossed_swords: {\n\t\ta: \"Crossed Swords\",\n\t\tb: \"2694-FE0F\",\n\t\tc: \"2694\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weapon\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t13\n\t\t],\n\t\to: 4\n\t},\n\tnine: {\n\t\ta: \"Keycap 9\",\n\t\tb: \"0039-FE0F-20E3\",\n\t\tc: \"0039-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\",\n\t\t\t\"9\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t11\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-lk\": {\n\t\ta: \"Sri Lanka Flag\",\n\t\tb: \"1F1F1-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t10\n\t\t]\n\t},\n\tclock130: {\n\t\ta: \"Clock Face One-Thirty\",\n\t\tb: \"1F55C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t30\n\t\t]\n\t},\n\tclock2: {\n\t\ta: \"Clock Face Two Oclock\",\n\t\tb: \"1F551\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t19\n\t\t]\n\t},\n\tgun: {\n\t\ta: \"Pistol\",\n\t\tb: \"1F52B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"violence\",\n\t\t\t\"weapon\",\n\t\t\t\"pistol\",\n\t\t\t\"revolver\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t45\n\t\t]\n\t},\n\tkeycap_ten: {\n\t\ta: \"Keycap Ten\",\n\t\tb: \"1F51F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"10\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t33\n\t\t]\n\t},\n\t\"female-artist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Artist\",\n\t\tb: \"1F469-200D-1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-lr\": {\n\t\ta: \"Liberia Flag\",\n\t\tb: \"1F1F1-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t11\n\t\t]\n\t},\n\tclock230: {\n\t\ta: \"Clock Face Two-Thirty\",\n\t\tb: \"1F55D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t31\n\t\t]\n\t},\n\tbow_and_arrow: {\n\t\ta: \"Bow and Arrow\",\n\t\tb: \"1F3F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t23\n\t\t],\n\t\to: 8\n\t},\n\t\"male-pilot\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2708\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Pilot\",\n\t\tb: \"1F468-200D-2708-FE0F\",\n\t\tc: \"1F468-200D-2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-ls\": {\n\t\ta: \"Lesotho Flag\",\n\t\tb: \"1F1F1-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-lt\": {\n\t\ta: \"Lithuania Flag\",\n\t\tb: \"1F1F1-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t13\n\t\t]\n\t},\n\tcapital_abcd: {\n\t\ta: \"Input Symbol for Latin Capital Letters\",\n\t\tb: \"1F520\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t34\n\t\t]\n\t},\n\t\"female-pilot\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2708\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Pilot\",\n\t\tb: \"1F469-200D-2708-FE0F\",\n\t\tc: \"1F469-200D-2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t13\n\t\t]\n\t},\n\tclock3: {\n\t\ta: \"Clock Face Three Oclock\",\n\t\tb: \"1F552\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t20\n\t\t]\n\t},\n\tshield: {\n\t\ta: \"Shield\",\n\t\tb: \"1F6E1-FE0F\",\n\t\tc: \"1F6E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"protection\",\n\t\t\t\"security\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t9\n\t\t],\n\t\to: 7\n\t},\n\t\"male-astronaut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Astronaut\",\n\t\tb: \"1F468-200D-1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t31\n\t\t]\n\t},\n\tabcd: {\n\t\ta: \"Input Symbol for Latin Small Letters\",\n\t\tb: \"1F521\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t35\n\t\t]\n\t},\n\tclock330: {\n\t\ta: \"Clock Face Three-Thirty\",\n\t\tb: \"1F55E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t32\n\t\t]\n\t},\n\t\"flag-lu\": {\n\t\ta: \"Luxembourg Flag\",\n\t\tb: \"1F1F1-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t14\n\t\t]\n\t},\n\twrench: {\n\t\ta: \"Wrench\",\n\t\tb: \"1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"diy\",\n\t\t\t\"ikea\",\n\t\t\t\"fix\",\n\t\t\t\"maintainer\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t41\n\t\t]\n\t},\n\tnut_and_bolt: {\n\t\ta: \"Nut and Bolt\",\n\t\tb: \"1F529\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"handy\",\n\t\t\t\"tools\",\n\t\t\t\"fix\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t43\n\t\t]\n\t},\n\tclock4: {\n\t\ta: \"Clock Face Four Oclock\",\n\t\tb: \"1F553\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t21\n\t\t]\n\t},\n\t\"female-astronaut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Astronaut\",\n\t\tb: \"1F469-200D-1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-lv\": {\n\t\ta: \"Latvia Flag\",\n\t\tb: \"1F1F1-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t15\n\t\t]\n\t},\n\tgear: {\n\t\ta: \"Gear\",\n\t\tb: \"2699-FE0F\",\n\t\tc: \"2699\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"cog\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t17\n\t\t],\n\t\to: 4\n\t},\n\t\"male-firefighter\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Firefighter\",\n\t\tb: \"1F468-200D-1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-ly\": {\n\t\ta: \"Libya Flag\",\n\t\tb: \"1F1F1-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t16\n\t\t]\n\t},\n\tsymbols: {\n\t\ta: \"Input Symbol for Symbols\",\n\t\tb: \"1F523\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"music\",\n\t\t\t\"note\",\n\t\t\t\"ampersand\",\n\t\t\t\"percent\",\n\t\t\t\"glyphs\",\n\t\t\t\"characters\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t37\n\t\t]\n\t},\n\tclock430: {\n\t\ta: \"Clock Face Four-Thirty\",\n\t\tb: \"1F55F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t33\n\t\t]\n\t},\n\t\"flag-ma\": {\n\t\ta: \"Morocco Flag\",\n\t\tb: \"1F1F2-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t17\n\t\t]\n\t},\n\tcompression: {\n\t\ta: \"Compression\",\n\t\tb: \"1F5DC-FE0F\",\n\t\tc: \"1F5DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t10\n\t\t],\n\t\to: 7\n\t},\n\t\"female-firefighter\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f692.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Firefighter\",\n\t\tb: \"1F469-200D-1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t47\n\t\t]\n\t},\n\tabc: {\n\t\ta: \"Input Symbol for Latin Letters\",\n\t\tb: \"1F524\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t38\n\t\t]\n\t},\n\tclock5: {\n\t\ta: \"Clock Face Five Oclock\",\n\t\tb: \"1F554\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t22\n\t\t]\n\t},\n\tclock530: {\n\t\ta: \"Clock Face Five-Thirty\",\n\t\tb: \"1F560\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t34\n\t\t]\n\t},\n\ta: {\n\t\ta: \"Negative Squared Latin Capital Letter a\",\n\t\tb: \"1F170-FE0F\",\n\t\tc: \"1F170\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t16\n\t\t]\n\t},\n\talembic: {\n\t\ta: \"Alembic\",\n\t\tb: \"2697-FE0F\",\n\t\tc: \"2697\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"distilling\",\n\t\t\t\"science\",\n\t\t\t\"experiment\",\n\t\t\t\"chemistry\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t16\n\t\t],\n\t\to: 4\n\t},\n\t\"flag-mc\": {\n\t\ta: \"Monaco Flag\",\n\t\tb: \"1F1F2-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t18\n\t\t]\n\t},\n\tcop: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fb.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fc.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fd.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fe.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3ff.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F46E-200D-2642-FE0F\",\n\t\ta: \"Police Officer\",\n\t\tb: \"1F46E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t45\n\t\t]\n\t},\n\tscales: {\n\t\ta: \"Scales\",\n\t\tb: \"2696-FE0F\",\n\t\tc: \"2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t15\n\t\t],\n\t\to: 4\n\t},\n\tclock6: {\n\t\ta: \"Clock Face Six Oclock\",\n\t\tb: \"1F555\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\",\n\t\t\t\"dawn\",\n\t\t\t\"dusk\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-md\": {\n\t\ta: \"Moldova Flag\",\n\t\tb: \"1F1F2-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t19\n\t\t]\n\t},\n\tab: {\n\t\ta: \"Negative Squared Ab\",\n\t\tb: \"1F18E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t20\n\t\t]\n\t},\n\t\"male-police-officer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F46E\",\n\t\ta: \"Male Police Officer\",\n\t\tb: \"1F46E-200D-2642-FE0F\",\n\t\tc: \"1F46E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t39\n\t\t]\n\t},\n\tlink: {\n\t\ta: \"Link Symbol\",\n\t\tb: \"1F517\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rings\",\n\t\t\t\"url\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-me\": {\n\t\ta: \"Montenegro Flag\",\n\t\tb: \"1F1F2-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t20\n\t\t]\n\t},\n\tclock630: {\n\t\ta: \"Clock Face Six-Thirty\",\n\t\tb: \"1F561\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t35\n\t\t]\n\t},\n\tb: {\n\t\ta: \"Negative Squared Latin Capital Letter B\",\n\t\tb: \"1F171-FE0F\",\n\t\tc: \"1F171\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t17\n\t\t]\n\t},\n\t\"female-police-officer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Police Officer\",\n\t\tb: \"1F46E-200D-2640-FE0F\",\n\t\tc: \"1F46E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t33\n\t\t]\n\t},\n\tclock7: {\n\t\ta: \"Clock Face Seven Oclock\",\n\t\tb: \"1F556\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t24\n\t\t]\n\t},\n\tcl: {\n\t\ta: \"Squared Cl\",\n\t\tb: \"1F191\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"words\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t21\n\t\t]\n\t},\n\tsleuth_or_spy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F575-FE0F-200D-2642-FE0F\",\n\t\ta: \"Sleuth or Spy\",\n\t\tb: \"1F575-FE0F\",\n\t\tc: \"1F575\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-mf\": {\n\t\ta: \"St. Martin Flag\",\n\t\tb: \"1F1F2-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t21\n\t\t]\n\t},\n\tchains: {\n\t\ta: \"Chains\",\n\t\tb: \"26D3-FE0F\",\n\t\tc: \"26D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"arrest\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t34\n\t\t],\n\t\to: 5\n\t},\n\tsyringe: {\n\t\ta: \"Syringe\",\n\t\tb: \"1F489\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"hospital\",\n\t\t\t\"drugs\",\n\t\t\t\"blood\",\n\t\t\t\"medicine\",\n\t\t\t\"needle\",\n\t\t\t\"doctor\",\n\t\t\t\"nurse\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-detective\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f575-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F575-FE0F\",\n\t\ta: \"Male Detective\",\n\t\tb: \"1F575-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\tcool: {\n\t\ta: \"Squared Cool\",\n\t\tb: \"1F192\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t22\n\t\t]\n\t},\n\tclock730: {\n\t\ta: \"Clock Face Seven-Thirty\",\n\t\tb: \"1F562\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-mg\": {\n\t\ta: \"Madagascar Flag\",\n\t\tb: \"1F1F2-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t22\n\t\t]\n\t},\n\tfree: {\n\t\ta: \"Squared Free\",\n\t\tb: \"1F193\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-mh\": {\n\t\ta: \"Marshall Islands Flag\",\n\t\tb: \"1F1F2-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t23\n\t\t]\n\t},\n\tclock8: {\n\t\ta: \"Clock Face Eight Oclock\",\n\t\tb: \"1F557\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t25\n\t\t]\n\t},\n\tpill: {\n\t\ta: \"Pill\",\n\t\tb: \"1F48A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"medicine\",\n\t\t\t\"doctor\",\n\t\t\t\"pharmacy\",\n\t\t\t\"drug\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t36\n\t\t]\n\t},\n\t\"female-detective\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f575-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Detective\",\n\t\tb: \"1F575-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t51\n\t\t],\n\t\to: 7\n\t},\n\tclock830: {\n\t\ta: \"Clock Face Eight-Thirty\",\n\t\tb: \"1F563\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t37\n\t\t]\n\t},\n\tguardsman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F482-200D-2642-FE0F\",\n\t\ta: \"Guardsman\",\n\t\tb: \"1F482\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"uk\",\n\t\t\t\"gb\",\n\t\t\t\"british\",\n\t\t\t\"male\",\n\t\t\t\"guy\",\n\t\t\t\"royal\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t31\n\t\t]\n\t},\n\tinformation_source: {\n\t\ta: \"Information Source\",\n\t\tb: \"2139-FE0F\",\n\t\tc: \"2139\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t32\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-mk\": {\n\t\ta: \"Macedonia Flag\",\n\t\tb: \"1F1F2-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t24\n\t\t]\n\t},\n\tsmoking: {\n\t\ta: \"Smoking Symbol\",\n\t\tb: \"1F6AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kills\",\n\t\t\t\"tobacco\",\n\t\t\t\"cigarette\",\n\t\t\t\"joint\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t17\n\t\t]\n\t},\n\tid: {\n\t\ta: \"Squared Id\",\n\t\tb: \"1F194\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t24\n\t\t]\n\t},\n\tclock9: {\n\t\ta: \"Clock Face Nine Oclock\",\n\t\tb: \"1F558\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t26\n\t\t]\n\t},\n\t\"flag-ml\": {\n\t\ta: \"Mali Flag\",\n\t\tb: \"1F1F2-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t25\n\t\t]\n\t},\n\tcoffin: {\n\t\ta: \"Coffin\",\n\t\tb: \"26B0-FE0F\",\n\t\tc: \"26B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vampire\",\n\t\t\t\"dead\",\n\t\t\t\"die\",\n\t\t\t\"death\",\n\t\t\t\"rip\",\n\t\t\t\"graveyard\",\n\t\t\t\"cemetery\",\n\t\t\t\"casket\",\n\t\t\t\"funeral\",\n\t\t\t\"box\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t24\n\t\t],\n\t\to: 4\n\t},\n\t\"male-guard\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f482-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F482\",\n\t\ta: \"Male Guard\",\n\t\tb: \"1F482-200D-2642-FE0F\",\n\t\tc: \"1F482-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t25\n\t\t]\n\t},\n\tm: {\n\t\ta: \"Circled Latin Capital Letter M\",\n\t\tb: \"24C2-FE0F\",\n\t\tc: \"24C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"blue-circle\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tfuneral_urn: {\n\t\ta: \"Funeral Urn\",\n\t\tb: \"26B1-FE0F\",\n\t\tc: \"26B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dead\",\n\t\t\t\"die\",\n\t\t\t\"death\",\n\t\t\t\"rip\",\n\t\t\t\"ashes\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t25\n\t\t],\n\t\to: 4\n\t},\n\t\"female-guard\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f482-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Guard\",\n\t\tb: \"1F482-200D-2640-FE0F\",\n\t\tc: \"1F482-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-mm\": {\n\t\ta: \"Myanmar (burma) Flag\",\n\t\tb: \"1F1F2-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t26\n\t\t]\n\t},\n\tclock930: {\n\t\ta: \"Clock Face Nine-Thirty\",\n\t\tb: \"1F564\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t38\n\t\t]\n\t},\n\tmoyai: {\n\t\ta: \"Moyai\",\n\t\tb: \"1F5FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rock\",\n\t\t\t\"easter island\",\n\t\t\t\"moai\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t23\n\t\t]\n\t},\n\t\"new\": {\n\t\ta: \"Squared New\",\n\t\tb: \"1F195\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\",\n\t\t\t\"start\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-mn\": {\n\t\ta: \"Mongolia Flag\",\n\t\tb: \"1F1F2-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t27\n\t\t]\n\t},\n\tconstruction_worker: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F477-200D-2642-FE0F\",\n\t\ta: \"Construction Worker\",\n\t\tb: \"1F477\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t22,\n\t\t\t28\n\t\t]\n\t},\n\tclock10: {\n\t\ta: \"Clock Face Ten Oclock\",\n\t\tb: \"1F559\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t27\n\t\t]\n\t},\n\tclock1030: {\n\t\ta: \"Clock Face Ten-Thirty\",\n\t\tb: \"1F565\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t39\n\t\t]\n\t},\n\tng: {\n\t\ta: \"Squared Ng\",\n\t\tb: \"1F196\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\",\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t26\n\t\t]\n\t},\n\t\"male-construction-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f477-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F477\",\n\t\ta: \"Male Construction Worker\",\n\t\tb: \"1F477-200D-2642-FE0F\",\n\t\tc: \"1F477-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t22,\n\t\t\t22\n\t\t]\n\t},\n\t\"flag-mo\": {\n\t\ta: \"Macau Sar China Flag\",\n\t\tb: \"1F1F2-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t28\n\t\t]\n\t},\n\toil_drum: {\n\t\ta: \"Oil Drum\",\n\t\tb: \"1F6E2-FE0F\",\n\t\tc: \"1F6E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"barrell\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t10\n\t\t],\n\t\to: 7\n\t},\n\to2: {\n\t\ta: \"Negative Squared Latin Capital Letter O\",\n\t\tb: \"1F17E-FE0F\",\n\t\tc: \"1F17E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"red-square\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-construction-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f477-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Construction Worker\",\n\t\tb: \"1F477-200D-2640-FE0F\",\n\t\tc: \"1F477-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t22,\n\t\t\t16\n\t\t]\n\t},\n\tclock11: {\n\t\ta: \"Clock Face Eleven Oclock\",\n\t\tb: \"1F55A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t28\n\t\t]\n\t},\n\tcrystal_ball: {\n\t\ta: \"Crystal Ball\",\n\t\tb: \"1F52E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"disco\",\n\t\t\t\"party\",\n\t\t\t\"magic\",\n\t\t\t\"circus\",\n\t\t\t\"fortune_teller\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-mp\": {\n\t\ta: \"Northern Mariana Islands Flag\",\n\t\tb: \"1F1F2-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t29\n\t\t]\n\t},\n\t\"flag-mq\": {\n\t\ta: \"Martinique Flag\",\n\t\tb: \"1F1F2-1F1F6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t30\n\t\t]\n\t},\n\tprince: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F934-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F934-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F934-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F934-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F934-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Prince\",\n\t\tb: \"1F934\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boy\",\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"crown\",\n\t\t\t\"royal\",\n\t\t\t\"king\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t28\n\t\t],\n\t\to: 9\n\t},\n\tok: {\n\t\ta: \"Squared Ok\",\n\t\tb: \"1F197\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"agree\",\n\t\t\t\"yes\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t27\n\t\t]\n\t},\n\tclock1130: {\n\t\ta: \"Clock Face Eleven-Thirty\",\n\t\tb: \"1F566\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t40\n\t\t]\n\t},\n\tshopping_trolley: {\n\t\ta: \"Shopping Trolley\",\n\t\tb: \"1F6D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t7\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-mr\": {\n\t\ta: \"Mauritania Flag\",\n\t\tb: \"1F1F2-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t31\n\t\t]\n\t},\n\tprincess: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F478-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F478-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F478-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F478-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F478-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Princess\",\n\t\tb: \"1F478\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"girl\",\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"blond\",\n\t\t\t\"crown\",\n\t\t\t\"royal\",\n\t\t\t\"queen\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t34\n\t\t]\n\t},\n\tnew_moon: {\n\t\ta: \"New Moon Symbol\",\n\t\tb: \"1F311\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t9\n\t\t]\n\t},\n\tparking: {\n\t\ta: \"Negative Squared Latin Capital Letter P\",\n\t\tb: \"1F17F-FE0F\",\n\t\tc: \"1F17F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cars\",\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t19\n\t\t],\n\t\to: 5\n\t},\n\tsos: {\n\t\ta: \"Squared Sos\",\n\t\tb: \"1F198\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"help\",\n\t\t\t\"red-square\",\n\t\t\t\"words\",\n\t\t\t\"emergency\",\n\t\t\t\"911\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t28\n\t\t]\n\t},\n\tman_with_turban: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F473-200D-2642-FE0F\",\n\t\ta: \"Man with Turban\",\n\t\tb: \"1F473\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"indian\",\n\t\t\t\"hinduism\",\n\t\t\t\"arabs\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t44\n\t\t]\n\t},\n\t\"flag-ms\": {\n\t\ta: \"Montserrat Flag\",\n\t\tb: \"1F1F2-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t32\n\t\t]\n\t},\n\twaxing_crescent_moon: {\n\t\ta: \"Waxing Crescent Moon Symbol\",\n\t\tb: \"1F312\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t10\n\t\t]\n\t},\n\tup: {\n\t\ta: \"Squared Up with Exclamation Mark\",\n\t\tb: \"1F199\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"above\",\n\t\t\t\"high\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t29\n\t\t]\n\t},\n\tfirst_quarter_moon: {\n\t\ta: \"First Quarter Moon Symbol\",\n\t\tb: \"1F313\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-mt\": {\n\t\ta: \"Malta Flag\",\n\t\tb: \"1F1F2-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t33\n\t\t]\n\t},\n\t\"man-wearing-turban\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f473-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F473\",\n\t\ta: \"Man Wearing Turban\",\n\t\tb: \"1F473-200D-2642-FE0F\",\n\t\tc: \"1F473-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t38\n\t\t]\n\t},\n\tmoon: {\n\t\ta: \"Waxing Gibbous Moon Symbol\",\n\t\tb: \"1F314\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t6,\n\t\t\t12\n\t\t],\n\t\tn: [\n\t\t\t\"waxing_gibbous_moon\"\n\t\t]\n\t},\n\t\"woman-wearing-turban\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f473-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Wearing Turban\",\n\t\tb: \"1F473-200D-2640-FE0F\",\n\t\tc: \"1F473-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t32\n\t\t]\n\t},\n\tvs: {\n\t\ta: \"Squared Vs\",\n\t\tb: \"1F19A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-mu\": {\n\t\ta: \"Mauritius Flag\",\n\t\tb: \"1F1F2-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t34\n\t\t]\n\t},\n\tman_with_gua_pi_mao: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F472-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F472-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F472-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F472-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F472-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Man with Gua Pi Mao\",\n\t\tb: \"1F472\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"boy\",\n\t\t\t\"chinese\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t26\n\t\t]\n\t},\n\tkoko: {\n\t\ta: \"Squared Katakana Koko\",\n\t\tb: \"1F201\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"here\",\n\t\t\t\"katakana\",\n\t\t\t\"japanese\",\n\t\t\t\"destination\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t29\n\t\t]\n\t},\n\tfull_moon: {\n\t\ta: \"Full Moon Symbol\",\n\t\tb: \"1F315\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"yellow\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-mv\": {\n\t\ta: \"Maldives Flag\",\n\t\tb: \"1F1F2-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t35\n\t\t]\n\t},\n\tperson_with_headscarf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D5-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D5-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D5-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D5-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D5-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Person with Headscarf\",\n\t\tb: \"1F9D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\twaning_gibbous_moon: {\n\t\ta: \"Waning Gibbous Moon Symbol\",\n\t\tb: \"1F316\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\",\n\t\t\t\"waxing_gibbous_moon\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t14\n\t\t]\n\t},\n\tsa: {\n\t\ta: \"Squared Katakana Sa\",\n\t\tb: \"1F202-FE0F\",\n\t\tc: \"1F202\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"blue-square\",\n\t\t\t\"katakana\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-mw\": {\n\t\ta: \"Malawi Flag\",\n\t\tb: \"1F1F2-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t36\n\t\t]\n\t},\n\tlast_quarter_moon: {\n\t\ta: \"Last Quarter Moon Symbol\",\n\t\tb: \"1F317\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t15\n\t\t]\n\t},\n\tu6708: {\n\t\ta: \"Squared Cjk Unified Ideograph-6708\",\n\t\tb: \"1F237-FE0F\",\n\t\tc: \"1F237\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"month\",\n\t\t\t\"moon\",\n\t\t\t\"japanese\",\n\t\t\t\"orange-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t38\n\t\t]\n\t},\n\tbearded_person: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Bearded Person\",\n\t\tb: \"1F9D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-mx\": {\n\t\ta: \"Mexico Flag\",\n\t\tb: \"1F1F2-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t37\n\t\t]\n\t},\n\tu6709: {\n\t\ta: \"Squared Cjk Unified Ideograph-6709\",\n\t\tb: \"1F236\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"chinese\",\n\t\t\t\"have\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t37\n\t\t]\n\t},\n\tperson_with_blond_hair: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F471-200D-2642-FE0F\",\n\t\ta: \"Person with Blond Hair\",\n\t\tb: \"1F471\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t21,\n\t\t\t20\n\t\t]\n\t},\n\twaning_crescent_moon: {\n\t\ta: \"Waning Crescent Moon Symbol\",\n\t\tb: \"1F318\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-my\": {\n\t\ta: \"Malaysia Flag\",\n\t\tb: \"1F1F2-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t38\n\t\t]\n\t},\n\tu6307: {\n\t\ta: \"Squared Cjk Unified Ideograph-6307\",\n\t\tb: \"1F22F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"point\",\n\t\t\t\"green-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t32\n\t\t],\n\t\to: 5\n\t},\n\t\"blond-haired-man\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f471-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F471\",\n\t\ta: \"Blond Haired Man\",\n\t\tb: \"1F471-200D-2642-FE0F\",\n\t\tc: \"1F471-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t14\n\t\t]\n\t},\n\tcrescent_moon: {\n\t\ta: \"Crescent Moon\",\n\t\tb: \"1F319\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"sleep\",\n\t\t\t\"sky\",\n\t\t\t\"evening\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t17\n\t\t]\n\t},\n\t\"flag-mz\": {\n\t\ta: \"Mozambique Flag\",\n\t\tb: \"1F1F2-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t39\n\t\t]\n\t},\n\tnew_moon_with_face: {\n\t\ta: \"New Moon with Face\",\n\t\tb: \"1F31A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-na\": {\n\t\ta: \"Namibia Flag\",\n\t\tb: \"1F1F3-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t40\n\t\t]\n\t},\n\t\"blond-haired-woman\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f471-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Blond Haired Woman\",\n\t\tb: \"1F471-200D-2640-FE0F\",\n\t\tc: \"1F471-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t8\n\t\t]\n\t},\n\tideograph_advantage: {\n\t\ta: \"Circled Ideograph Advantage\",\n\t\tb: \"1F250\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"obtain\",\n\t\t\t\"get\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t42\n\t\t]\n\t},\n\tfirst_quarter_moon_with_face: {\n\t\ta: \"First Quarter Moon with Face\",\n\t\tb: \"1F31B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t19\n\t\t]\n\t},\n\tman_in_tuxedo: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F935-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F935-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F935-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F935-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F935-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Tuxedo\",\n\t\tb: \"1F935\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"wedding\",\n\t\t\t\"groom\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t34\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-nc\": {\n\t\ta: \"New Caledonia Flag\",\n\t\tb: \"1F1F3-1F1E8\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t41\n\t\t]\n\t},\n\tu5272: {\n\t\ta: \"Squared Cjk Unified Ideograph-5272\",\n\t\tb: \"1F239\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cut\",\n\t\t\t\"divide\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"pink-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-ne\": {\n\t\ta: \"Niger Flag\",\n\t\tb: \"1F1F3-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t42\n\t\t]\n\t},\n\tlast_quarter_moon_with_face: {\n\t\ta: \"Last Quarter Moon with Face\",\n\t\tb: \"1F31C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t20\n\t\t]\n\t},\n\tu7121: {\n\t\ta: \"Squared Cjk Unified Ideograph-7121\",\n\t\tb: \"1F21A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nothing\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t31\n\t\t],\n\t\to: 5\n\t},\n\tbride_with_veil: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F470-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F470-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F470-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F470-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F470-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Bride with Veil\",\n\t\tb: \"1F470\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"wedding\",\n\t\t\t\"woman\",\n\t\t\t\"bride\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t2\n\t\t]\n\t},\n\tu7981: {\n\t\ta: \"Squared Cjk Unified Ideograph-7981\",\n\t\tb: \"1F232\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"forbidden\",\n\t\t\t\"limit\",\n\t\t\t\"restricted\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t33\n\t\t]\n\t},\n\tpregnant_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F930-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F930-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F930-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F930-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F930-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Pregnant Woman\",\n\t\tb: \"1F930\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"baby\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\tthermometer: {\n\t\ta: \"Thermometer\",\n\t\tb: \"1F321-FE0F\",\n\t\tc: \"1F321\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"temperature\",\n\t\t\t\"hot\",\n\t\t\t\"cold\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t25\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-nf\": {\n\t\ta: \"Norfolk Island Flag\",\n\t\tb: \"1F1F3-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t43\n\t\t]\n\t},\n\tsunny: {\n\t\ta: \"Black Sun with Rays\",\n\t\tb: \"2600-FE0F\",\n\t\tc: \"2600\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"nature\",\n\t\t\t\"brightness\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t16\n\t\t],\n\t\to: 1\n\t},\n\taccept: {\n\t\ta: \"Circled Ideograph Accept\",\n\t\tb: \"1F251\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"good\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"agree\",\n\t\t\t\"yes\",\n\t\t\t\"orange-circle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t43\n\t\t]\n\t},\n\t\"flag-ng\": {\n\t\ta: \"Nigeria Flag\",\n\t\tb: \"1F1F3-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t44\n\t\t]\n\t},\n\t\"breast-feeding\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F931-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F931-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F931-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F931-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F931-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Breast-Feeding\",\n\t\tb: \"1F931\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tfull_moon_with_face: {\n\t\ta: \"Full Moon with Face\",\n\t\tb: \"1F31D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-ni\": {\n\t\ta: \"Nicaragua Flag\",\n\t\tb: \"1F1F3-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t45\n\t\t]\n\t},\n\tu7533: {\n\t\ta: \"Squared Cjk Unified Ideograph-7533\",\n\t\tb: \"1F238\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"japanese\",\n\t\t\t\"kanji\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t39\n\t\t]\n\t},\n\tangel: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F47C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F47C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F47C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F47C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F47C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Baby Angel\",\n\t\tb: \"1F47C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"heaven\",\n\t\t\t\"wings\",\n\t\t\t\"halo\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t43\n\t\t]\n\t},\n\tsun_with_face: {\n\t\ta: \"Sun with Face\",\n\t\tb: \"1F31E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"morning\",\n\t\t\t\"sky\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t22\n\t\t]\n\t},\n\tsanta: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F385-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fb.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F385-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fc.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F385-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fd.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F385-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fe.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F385-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3ff.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Father Christmas\",\n\t\tb: \"1F385\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"xmas\",\n\t\t\t\"father christmas\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t19\n\t\t]\n\t},\n\tu5408: {\n\t\ta: \"Squared Cjk Unified Ideograph-5408\",\n\t\tb: \"1F234\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"join\",\n\t\t\t\"kanji\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t35\n\t\t]\n\t},\n\t\"flag-nl\": {\n\t\ta: \"Netherlands Flag\",\n\t\tb: \"1F1F3-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t46\n\t\t]\n\t},\n\tmrs_claus: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F936-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F936-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F936-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F936-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F936-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Mother Christmas\",\n\t\tb: \"1F936\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"xmas\",\n\t\t\t\"mother christmas\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t40\n\t\t],\n\t\tn: [\n\t\t\t\"mother_christmas\"\n\t\t],\n\t\to: 9\n\t},\n\tu7a7a: {\n\t\ta: \"Squared Cjk Unified Ideograph-7a7a\",\n\t\tb: \"1F233\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"empty\",\n\t\t\t\"sky\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t34\n\t\t]\n\t},\n\tstar: {\n\t\ta: \"White Medium Star\",\n\t\tb: \"2B50\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"yellow\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t22\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-no\": {\n\t\ta: \"Norway Flag\",\n\t\tb: \"1F1F3-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t47\n\t\t]\n\t},\n\tmage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D9-200D-2640-FE0F\",\n\t\ta: \"Mage\",\n\t\tb: \"1F9D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t42\n\t\t],\n\t\to: 10\n\t},\n\tstar2: {\n\t\ta: \"Glowing Star\",\n\t\tb: \"1F31F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"sparkle\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-np\": {\n\t\ta: \"Nepal Flag\",\n\t\tb: \"1F1F3-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t48\n\t\t]\n\t},\n\tcongratulations: {\n\t\ta: \"Circled Ideograph Congratulation\",\n\t\tb: \"3297-FE0F\",\n\t\tc: \"3297\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"red-circle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t26\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nr\": {\n\t\ta: \"Nauru Flag\",\n\t\tb: \"1F1F3-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t49\n\t\t]\n\t},\n\tstars: {\n\t\ta: \"Shooting Star\",\n\t\tb: \"1F320\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t24\n\t\t]\n\t},\n\tfemale_mage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D9\",\n\t\ta: \"Female Mage\",\n\t\tb: \"1F9D9-200D-2640-FE0F\",\n\t\tc: \"1F9D9-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t30\n\t\t],\n\t\to: 10\n\t},\n\tsecret: {\n\t\ta: \"Circled Ideograph Secret\",\n\t\tb: \"3299-FE0F\",\n\t\tc: \"3299\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"privacy\",\n\t\t\t\"chinese\",\n\t\t\t\"sshh\",\n\t\t\t\"kanji\",\n\t\t\t\"red-circle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t27\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nu\": {\n\t\ta: \"Niue Flag\",\n\t\tb: \"1F1F3-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t50\n\t\t]\n\t},\n\tu55b6: {\n\t\ta: \"Squared Cjk Unified Ideograph-55b6\",\n\t\tb: \"1F23A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"opening hours\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t41\n\t\t]\n\t},\n\tmale_mage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Mage\",\n\t\tb: \"1F9D9-200D-2642-FE0F\",\n\t\tc: \"1F9D9-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t36\n\t\t],\n\t\to: 10\n\t},\n\tcloud: {\n\t\ta: \"Cloud\",\n\t\tb: \"2601-FE0F\",\n\t\tc: \"2601\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"sky\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t17\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nz\": {\n\t\ta: \"New Zealand Flag\",\n\t\tb: \"1F1F3-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t51\n\t\t]\n\t},\n\tpartly_sunny: {\n\t\ta: \"Sun Behind Cloud\",\n\t\tb: \"26C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"nature\",\n\t\t\t\"cloudy\",\n\t\t\t\"morning\",\n\t\t\t\"fall\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t29\n\t\t],\n\t\to: 5\n\t},\n\tfairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DA-200D-2640-FE0F\",\n\t\ta: \"Fairy\",\n\t\tb: \"1F9DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t8\n\t\t],\n\t\to: 10\n\t},\n\tu6e80: {\n\t\ta: \"Squared Cjk Unified Ideograph-6e80\",\n\t\tb: \"1F235\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"full\",\n\t\t\t\"chinese\",\n\t\t\t\"japanese\",\n\t\t\t\"red-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t36\n\t\t]\n\t},\n\tblack_small_square: {\n\t\ta: \"Black Small Square\",\n\t\tb: \"25AA-FE0F\",\n\t\tc: \"25AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t8\n\t\t],\n\t\to: 1\n\t},\n\tthunder_cloud_and_rain: {\n\t\ta: \"Thunder Cloud and Rain\",\n\t\tb: \"26C8-FE0F\",\n\t\tc: \"26C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t30\n\t\t],\n\t\to: 5\n\t},\n\tfemale_fairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DA\",\n\t\ta: \"Female Fairy\",\n\t\tb: \"1F9DA-200D-2640-FE0F\",\n\t\tc: \"1F9DA-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t48\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-om\": {\n\t\ta: \"Oman Flag\",\n\t\tb: \"1F1F4-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t0\n\t\t]\n\t},\n\twhite_small_square: {\n\t\ta: \"White Small Square\",\n\t\tb: \"25AB-FE0F\",\n\t\tc: \"25AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t9\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-pa\": {\n\t\ta: \"Panama Flag\",\n\t\tb: \"1F1F5-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t1\n\t\t]\n\t},\n\tmostly_sunny: {\n\t\ta: \"Mostly Sunny\",\n\t\tb: \"1F324-FE0F\",\n\t\tc: \"1F324\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t26\n\t\t],\n\t\tn: [\n\t\t\t\"sun_small_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\tmale_fairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Fairy\",\n\t\tb: \"1F9DA-200D-2642-FE0F\",\n\t\tc: \"1F9DA-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t2\n\t\t],\n\t\to: 10\n\t},\n\tbarely_sunny: {\n\t\ta: \"Barely Sunny\",\n\t\tb: \"1F325-FE0F\",\n\t\tc: \"1F325\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t27\n\t\t],\n\t\tn: [\n\t\t\t\"sun_behind_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\twhite_medium_square: {\n\t\ta: \"White Medium Square\",\n\t\tb: \"25FB-FE0F\",\n\t\tc: \"25FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"stone\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t12\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-pe\": {\n\t\ta: \"Peru Flag\",\n\t\tb: \"1F1F5-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t2\n\t\t]\n\t},\n\tvampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DB-200D-2640-FE0F\",\n\t\ta: \"Vampire\",\n\t\tb: \"1F9DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t26\n\t\t],\n\t\to: 10\n\t},\n\tfemale_vampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DB\",\n\t\ta: \"Female Vampire\",\n\t\tb: \"1F9DB-200D-2640-FE0F\",\n\t\tc: \"1F9DB-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t14\n\t\t],\n\t\to: 10\n\t},\n\tpartly_sunny_rain: {\n\t\ta: \"Partly Sunny Rain\",\n\t\tb: \"1F326-FE0F\",\n\t\tc: \"1F326\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t28\n\t\t],\n\t\tn: [\n\t\t\t\"sun_behind_rain_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pf\": {\n\t\ta: \"French Polynesia Flag\",\n\t\tb: \"1F1F5-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t3\n\t\t]\n\t},\n\tblack_medium_square: {\n\t\ta: \"Black Medium Square\",\n\t\tb: \"25FC-FE0F\",\n\t\tc: \"25FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"button\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t13\n\t\t],\n\t\to: 3\n\t},\n\twhite_medium_small_square: {\n\t\ta: \"White Medium Small Square\",\n\t\tb: \"25FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"stone\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t14\n\t\t],\n\t\to: 3\n\t},\n\train_cloud: {\n\t\ta: \"Rain Cloud\",\n\t\tb: \"1F327-FE0F\",\n\t\tc: \"1F327\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t29\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pg\": {\n\t\ta: \"Papua New Guinea Flag\",\n\t\tb: \"1F1F5-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t4\n\t\t]\n\t},\n\tmale_vampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Vampire\",\n\t\tb: \"1F9DB-200D-2642-FE0F\",\n\t\tc: \"1F9DB-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ph\": {\n\t\ta: \"Philippines Flag\",\n\t\tb: \"1F1F5-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t5\n\t\t]\n\t},\n\tmerperson: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DC-200D-2642-FE0F\",\n\t\ta: \"Merperson\",\n\t\tb: \"1F9DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t44\n\t\t],\n\t\to: 10\n\t},\n\tblack_medium_small_square: {\n\t\ta: \"Black Medium Small Square\",\n\t\tb: \"25FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"icon\",\n\t\t\t\"shape\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t15\n\t\t],\n\t\to: 3\n\t},\n\tsnow_cloud: {\n\t\ta: \"Snow Cloud\",\n\t\tb: \"1F328-FE0F\",\n\t\tc: \"1F328\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\tlightning: {\n\t\ta: \"Lightning\",\n\t\tb: \"1F329-FE0F\",\n\t\tc: \"1F329\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"lightning_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\tblack_large_square: {\n\t\ta: \"Black Large Square\",\n\t\tb: \"2B1B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t20\n\t\t],\n\t\to: 5\n\t},\n\tmermaid: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Mermaid\",\n\t\tb: \"1F9DC-200D-2640-FE0F\",\n\t\tc: \"1F9DC-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t32\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-pk\": {\n\t\ta: \"Pakistan Flag\",\n\t\tb: \"1F1F5-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t6\n\t\t]\n\t},\n\tmerman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DC\",\n\t\ta: \"Merman\",\n\t\tb: \"1F9DC-200D-2642-FE0F\",\n\t\tc: \"1F9DC-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t38\n\t\t],\n\t\to: 10\n\t},\n\twhite_large_square: {\n\t\ta: \"White Large Square\",\n\t\tb: \"2B1C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"stone\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t21\n\t\t],\n\t\to: 5\n\t},\n\ttornado: {\n\t\ta: \"Tornado\",\n\t\tb: \"1F32A-FE0F\",\n\t\tc: \"1F32A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"cyclone\",\n\t\t\t\"twister\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t32\n\t\t],\n\t\tn: [\n\t\t\t\"tornado_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pl\": {\n\t\ta: \"Poland Flag\",\n\t\tb: \"1F1F5-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t7\n\t\t]\n\t},\n\telf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fb.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fc.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fd.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fe.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3ff.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DD-200D-2642-FE0F\",\n\t\ta: \"Elf\",\n\t\tb: \"1F9DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tfog: {\n\t\ta: \"Fog\",\n\t\tb: \"1F32B-FE0F\",\n\t\tc: \"1F32B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t33\n\t\t],\n\t\to: 7\n\t},\n\tlarge_orange_diamond: {\n\t\ta: \"Large Orange Diamond\",\n\t\tb: \"1F536\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-pm\": {\n\t\ta: \"St. Pierre & Miquelon Flag\",\n\t\tb: \"1F1F5-1F1F2\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t8\n\t\t]\n\t},\n\t\"flag-pn\": {\n\t\ta: \"Pitcairn Islands Flag\",\n\t\tb: \"1F1F5-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t9\n\t\t]\n\t},\n\twind_blowing_face: {\n\t\ta: \"Wind Blowing Face\",\n\t\tb: \"1F32C-FE0F\",\n\t\tc: \"1F32C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t34\n\t\t],\n\t\to: 7\n\t},\n\tfemale_elf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Elf\",\n\t\tb: \"1F9DD-200D-2640-FE0F\",\n\t\tc: \"1F9DD-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t50\n\t\t],\n\t\to: 10\n\t},\n\tlarge_blue_diamond: {\n\t\ta: \"Large Blue Diamond\",\n\t\tb: \"1F537\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t5\n\t\t]\n\t},\n\tmale_elf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DD\",\n\t\ta: \"Male Elf\",\n\t\tb: \"1F9DD-200D-2642-FE0F\",\n\t\tc: \"1F9DD-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t4\n\t\t],\n\t\to: 10\n\t},\n\tsmall_orange_diamond: {\n\t\ta: \"Small Orange Diamond\",\n\t\tb: \"1F538\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-pr\": {\n\t\ta: \"Puerto Rico Flag\",\n\t\tb: \"1F1F5-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t10\n\t\t]\n\t},\n\tcyclone: {\n\t\ta: \"Cyclone\",\n\t\tb: \"1F300\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"swirl\",\n\t\t\t\"blue\",\n\t\t\t\"cloud\",\n\t\t\t\"vortex\",\n\t\t\t\"spiral\",\n\t\t\t\"whirlpool\",\n\t\t\t\"spin\",\n\t\t\t\"tornado\",\n\t\t\t\"hurricane\",\n\t\t\t\"typhoon\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t44\n\t\t]\n\t},\n\trainbow: {\n\t\ta: \"Rainbow\",\n\t\tb: \"1F308\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"happy\",\n\t\t\t\"unicorn_face\",\n\t\t\t\"photo\",\n\t\t\t\"sky\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t0\n\t\t]\n\t},\n\tsmall_blue_diamond: {\n\t\ta: \"Small Blue Diamond\",\n\t\tb: \"1F539\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t7\n\t\t]\n\t},\n\tgenie: {\n\t\tobsoleted_by: \"1F9DE-200D-2642-FE0F\",\n\t\ta: \"Genie\",\n\t\tb: \"1F9DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ps\": {\n\t\ta: \"Palestinian Territories Flag\",\n\t\tb: \"1F1F5-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t11\n\t\t]\n\t},\n\tsmall_red_triangle: {\n\t\ta: \"Up-Pointing Red Triangle\",\n\t\tb: \"1F53A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"up\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t8\n\t\t]\n\t},\n\tclosed_umbrella: {\n\t\ta: \"Closed Umbrella\",\n\t\tb: \"1F302\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"rain\",\n\t\t\t\"drizzle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t46\n\t\t]\n\t},\n\tfemale_genie: {\n\t\ta: \"Female Genie\",\n\t\tb: \"1F9DE-200D-2640-FE0F\",\n\t\tc: \"1F9DE-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-pt\": {\n\t\ta: \"Portugal Flag\",\n\t\tb: \"1F1F5-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-pw\": {\n\t\ta: \"Palau Flag\",\n\t\tb: \"1F1F5-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t13\n\t\t]\n\t},\n\tsmall_red_triangle_down: {\n\t\ta: \"Down-Pointing Red Triangle\",\n\t\tb: \"1F53B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t9\n\t\t]\n\t},\n\tumbrella: {\n\t\ta: \"Umbrella\",\n\t\tb: \"2602-FE0F\",\n\t\tc: \"2602\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"rainy\",\n\t\t\t\"weather\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t18\n\t\t],\n\t\to: 1\n\t},\n\tmale_genie: {\n\t\tobsoletes: \"1F9DE\",\n\t\ta: \"Male Genie\",\n\t\tb: \"1F9DE-200D-2642-FE0F\",\n\t\tc: \"1F9DE-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\tzombie: {\n\t\tobsoleted_by: \"1F9DF-200D-2642-FE0F\",\n\t\ta: \"Zombie\",\n\t\tb: \"1F9DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t21\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-py\": {\n\t\ta: \"Paraguay Flag\",\n\t\tb: \"1F1F5-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t14\n\t\t]\n\t},\n\tdiamond_shape_with_a_dot_inside: {\n\t\ta: \"Diamond Shape with a Dot Inside\",\n\t\tb: \"1F4A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"jewel\",\n\t\t\t\"blue\",\n\t\t\t\"gem\",\n\t\t\t\"crystal\",\n\t\t\t\"fancy\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t6\n\t\t]\n\t},\n\tumbrella_with_rain_drops: {\n\t\ta: \"Umbrella with Rain Drops\",\n\t\tb: \"2614\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t47,\n\t\t\t23\n\t\t],\n\t\to: 4\n\t},\n\tradio_button: {\n\t\ta: \"Radio Button\",\n\t\tb: \"1F518\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"input\",\n\t\t\t\"old\",\n\t\t\t\"music\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t26\n\t\t]\n\t},\n\tfemale_zombie: {\n\t\ta: \"Female Zombie\",\n\t\tb: \"1F9DF-200D-2640-FE0F\",\n\t\tc: \"1F9DF-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t19\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-qa\": {\n\t\ta: \"Qatar Flag\",\n\t\tb: \"1F1F6-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t15\n\t\t]\n\t},\n\tumbrella_on_ground: {\n\t\ta: \"Umbrella on Ground\",\n\t\tb: \"26F1-FE0F\",\n\t\tc: \"26F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t39\n\t\t],\n\t\to: 5\n\t},\n\tblack_square_button: {\n\t\ta: \"Black Square Button\",\n\t\tb: \"1F532\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"input\",\n\t\t\t\"frame\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t0\n\t\t]\n\t},\n\tzap: {\n\t\ta: \"High Voltage Sign\",\n\t\tb: \"26A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thunder\",\n\t\t\t\"weather\",\n\t\t\t\"lightning bolt\",\n\t\t\t\"fast\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t21\n\t\t],\n\t\to: 4\n\t},\n\tmale_zombie: {\n\t\tobsoletes: \"1F9DF\",\n\t\ta: \"Male Zombie\",\n\t\tb: \"1F9DF-200D-2642-FE0F\",\n\t\tc: \"1F9DF-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-re\": {\n\t\ta: \"Réunion Flag\",\n\t\tb: \"1F1F7-1F1EA\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-ro\": {\n\t\ta: \"Romania Flag\",\n\t\tb: \"1F1F7-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t17\n\t\t]\n\t},\n\tsnowflake: {\n\t\ta: \"Snowflake\",\n\t\tb: \"2744-FE0F\",\n\t\tc: \"2744\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"winter\",\n\t\t\t\"season\",\n\t\t\t\"cold\",\n\t\t\t\"weather\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t51\n\t\t],\n\t\to: 1\n\t},\n\twhite_square_button: {\n\t\ta: \"White Square Button\",\n\t\tb: \"1F533\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"input\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t1\n\t\t]\n\t},\n\tperson_frowning: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64D-200D-2640-FE0F\",\n\t\ta: \"Person Frowning\",\n\t\tb: \"1F64D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-rs\": {\n\t\ta: \"Serbia Flag\",\n\t\tb: \"1F1F7-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t18\n\t\t]\n\t},\n\t\"man-frowning\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Frowning\",\n\t\tb: \"1F64D-200D-2642-FE0F\",\n\t\tc: \"1F64D-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t24\n\t\t]\n\t},\n\twhite_circle: {\n\t\ta: \"Medium White Circle\",\n\t\tb: \"26AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t22\n\t\t],\n\t\to: 4\n\t},\n\tsnowman: {\n\t\ta: \"Snowman\",\n\t\tb: \"2603-FE0F\",\n\t\tc: \"2603\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"winter\",\n\t\t\t\"season\",\n\t\t\t\"cold\",\n\t\t\t\"weather\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\",\n\t\t\t\"frozen\",\n\t\t\t\"without_snow\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t19\n\t\t],\n\t\to: 1\n\t},\n\tsnowman_without_snow: {\n\t\ta: \"Snowman Without Snow\",\n\t\tb: \"26C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t48,\n\t\t\t28\n\t\t],\n\t\to: 5\n\t},\n\tru: {\n\t\ta: \"Russia Flag\",\n\t\tb: \"1F1F7-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"russian\",\n\t\t\t\"federation\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t4,\n\t\t\t19\n\t\t],\n\t\tn: [\n\t\t\t\"flag-ru\"\n\t\t]\n\t},\n\tblack_circle: {\n\t\ta: \"Medium Black Circle\",\n\t\tb: \"26AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"button\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t23\n\t\t],\n\t\to: 4\n\t},\n\t\"woman-frowning\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64D\",\n\t\ta: \"Woman Frowning\",\n\t\tb: \"1F64D-200D-2640-FE0F\",\n\t\tc: \"1F64D-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-rw\": {\n\t\ta: \"Rwanda Flag\",\n\t\tb: \"1F1F7-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t20\n\t\t]\n\t},\n\tcomet: {\n\t\ta: \"Comet\",\n\t\tb: \"2604-FE0F\",\n\t\tc: \"2604\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"space\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t20\n\t\t],\n\t\to: 1\n\t},\n\tperson_with_pouting_face: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fe.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3ff.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64E-200D-2640-FE0F\",\n\t\ta: \"Person with Pouting Face\",\n\t\tb: \"1F64E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t48\n\t\t]\n\t},\n\tred_circle: {\n\t\ta: \"Large Red Circle\",\n\t\tb: \"1F534\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"error\",\n\t\t\t\"danger\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t2\n\t\t]\n\t},\n\tlarge_blue_circle: {\n\t\ta: \"Large Blue Circle\",\n\t\tb: \"1F535\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-pouting\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Pouting\",\n\t\tb: \"1F64E-200D-2642-FE0F\",\n\t\tc: \"1F64E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t42\n\t\t]\n\t},\n\t\"flag-sa\": {\n\t\ta: \"Saudi Arabia Flag\",\n\t\tb: \"1F1F8-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t21\n\t\t]\n\t},\n\tfire: {\n\t\ta: \"Fire\",\n\t\tb: \"1F525\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hot\",\n\t\t\t\"cook\",\n\t\t\t\"flame\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t39\n\t\t]\n\t},\n\t\"woman-pouting\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64E\",\n\t\ta: \"Woman Pouting\",\n\t\tb: \"1F64E-200D-2640-FE0F\",\n\t\tc: \"1F64E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-sb\": {\n\t\ta: \"Solomon Islands Flag\",\n\t\tb: \"1F1F8-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t22\n\t\t]\n\t},\n\tdroplet: {\n\t\ta: \"Droplet\",\n\t\tb: \"1F4A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"water\",\n\t\t\t\"drip\",\n\t\t\t\"faucet\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t13\n\t\t]\n\t},\n\tno_good: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F645-200D-2640-FE0F\",\n\t\ta: \"Face with No Good Gesture\",\n\t\tb: \"1F645\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t32,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-sc\": {\n\t\ta: \"Seychelles Flag\",\n\t\tb: \"1F1F8-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t23\n\t\t]\n\t},\n\tocean: {\n\t\ta: \"Water Wave\",\n\t\tb: \"1F30A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sea\",\n\t\t\t\"water\",\n\t\t\t\"wave\",\n\t\t\t\"nature\",\n\t\t\t\"tsunami\",\n\t\t\t\"disaster\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t2\n\t\t]\n\t},\n\t\"man-gesturing-no\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f645-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Gesturing No\",\n\t\tb: \"1F645-200D-2642-FE0F\",\n\t\tc: \"1F645-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t47\n\t\t]\n\t},\n\t\"flag-sd\": {\n\t\ta: \"Sudan Flag\",\n\t\tb: \"1F1F8-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t24\n\t\t]\n\t},\n\t\"woman-gesturing-no\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f645-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F645\",\n\t\ta: \"Woman Gesturing No\",\n\t\tb: \"1F645-200D-2640-FE0F\",\n\t\tc: \"1F645-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-se\": {\n\t\ta: \"Sweden Flag\",\n\t\tb: \"1F1F8-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-sg\": {\n\t\ta: \"Singapore Flag\",\n\t\tb: \"1F1F8-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t26\n\t\t]\n\t},\n\tok_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F646-200D-2640-FE0F\",\n\t\ta: \"Face with Ok Gesture\",\n\t\tb: \"1F646\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"women\",\n\t\t\t\"girl\",\n\t\t\t\"female\",\n\t\t\t\"pink\",\n\t\t\t\"human\",\n\t\t\t\"woman\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-sh\": {\n\t\ta: \"St. Helena Flag\",\n\t\tb: \"1F1F8-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t27\n\t\t]\n\t},\n\t\"man-gesturing-ok\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f646-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Gesturing Ok\",\n\t\tb: \"1F646-200D-2642-FE0F\",\n\t\tc: \"1F646-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-si\": {\n\t\ta: \"Slovenia Flag\",\n\t\tb: \"1F1F8-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t28\n\t\t]\n\t},\n\t\"woman-gesturing-ok\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f646-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F646\",\n\t\ta: \"Woman Gesturing Ok\",\n\t\tb: \"1F646-200D-2640-FE0F\",\n\t\tc: \"1F646-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t7\n\t\t]\n\t},\n\tinformation_desk_person: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F481-200D-2640-FE0F\",\n\t\ta: \"Information Desk Person\",\n\t\tb: \"1F481\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t23,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-sj\": {\n\t\ta: \"Svalbard & Jan Mayen Flag\",\n\t\tb: \"1F1F8-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t29\n\t\t]\n\t},\n\t\"man-tipping-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f481-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Tipping Hand\",\n\t\tb: \"1F481-200D-2642-FE0F\",\n\t\tc: \"1F481-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-sk\": {\n\t\ta: \"Slovakia Flag\",\n\t\tb: \"1F1F8-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-sl\": {\n\t\ta: \"Sierra Leone Flag\",\n\t\tb: \"1F1F8-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t31\n\t\t]\n\t},\n\t\"woman-tipping-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f481-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F481\",\n\t\ta: \"Woman Tipping Hand\",\n\t\tb: \"1F481-200D-2640-FE0F\",\n\t\tc: \"1F481-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-sm\": {\n\t\ta: \"San Marino Flag\",\n\t\tb: \"1F1F8-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t32\n\t\t]\n\t},\n\traising_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64B-200D-2640-FE0F\",\n\t\ta: \"Happy Person Raising One Hand\",\n\t\tb: \"1F64B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-sn\": {\n\t\ta: \"Senegal Flag\",\n\t\tb: \"1F1F8-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t33\n\t\t]\n\t},\n\t\"man-raising-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Raising Hand\",\n\t\tb: \"1F64B-200D-2642-FE0F\",\n\t\tc: \"1F64B-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t0\n\t\t]\n\t},\n\t\"flag-so\": {\n\t\ta: \"Somalia Flag\",\n\t\tb: \"1F1F8-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t34\n\t\t]\n\t},\n\t\"woman-raising-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64B\",\n\t\ta: \"Woman Raising Hand\",\n\t\tb: \"1F64B-200D-2640-FE0F\",\n\t\tc: \"1F64B-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-sr\": {\n\t\ta: \"Suriname Flag\",\n\t\tb: \"1F1F8-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t35\n\t\t]\n\t},\n\tbow: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F647-200D-2642-FE0F\",\n\t\ta: \"Person Bowing Deeply\",\n\t\tb: \"1F647\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t32,\n\t\t\t37\n\t\t]\n\t},\n\t\"man-bowing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f647-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F647\",\n\t\ta: \"Man Bowing\",\n\t\tb: \"1F647-200D-2642-FE0F\",\n\t\tc: \"1F647-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-ss\": {\n\t\ta: \"South Sudan Flag\",\n\t\tb: \"1F1F8-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t36\n\t\t]\n\t},\n\t\"woman-bowing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f647-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Bowing\",\n\t\tb: \"1F647-200D-2640-FE0F\",\n\t\tc: \"1F647-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-st\": {\n\t\ta: \"São Tomé & Príncipe Flag\",\n\t\tb: \"1F1F8-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t37\n\t\t]\n\t},\n\tface_palm: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Face Palm\",\n\t\tb: \"1F926\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sv\": {\n\t\ta: \"El Salvador Flag\",\n\t\tb: \"1F1F8-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t38\n\t\t]\n\t},\n\t\"man-facepalming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f926-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Facepalming\",\n\t\tb: \"1F926-200D-2642-FE0F\",\n\t\tc: \"1F926-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t35\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sx\": {\n\t\ta: \"Sint Maarten Flag\",\n\t\tb: \"1F1F8-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t39\n\t\t]\n\t},\n\t\"flag-sy\": {\n\t\ta: \"Syria Flag\",\n\t\tb: \"1F1F8-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t40\n\t\t]\n\t},\n\t\"woman-facepalming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f926-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Facepalming\",\n\t\tb: \"1F926-200D-2640-FE0F\",\n\t\tc: \"1F926-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t29\n\t\t],\n\t\to: 9\n\t},\n\tshrug: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Shrug\",\n\t\tb: \"1F937\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sz\": {\n\t\ta: \"Swaziland Flag\",\n\t\tb: \"1F1F8-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-ta\": {\n\t\ta: \"Tristan Da Cunha Flag\",\n\t\tb: \"1F1F9-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t42\n\t\t]\n\t},\n\t\"man-shrugging\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f937-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Shrugging\",\n\t\tb: \"1F937-200D-2642-FE0F\",\n\t\tc: \"1F937-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-shrugging\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f937-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Shrugging\",\n\t\tb: \"1F937-200D-2640-FE0F\",\n\t\tc: \"1F937-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t46\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-tc\": {\n\t\ta: \"Turks & Caicos Islands Flag\",\n\t\tb: \"1F1F9-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t43\n\t\t]\n\t},\n\tmassage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fb.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fc.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fd.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fe.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3ff.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F486-200D-2640-FE0F\",\n\t\ta: \"Face Massage\",\n\t\tb: \"1F486\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-td\": {\n\t\ta: \"Chad Flag\",\n\t\tb: \"1F1F9-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t44\n\t\t]\n\t},\n\t\"man-getting-massage\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f486-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Getting Massage\",\n\t\tb: \"1F486-200D-2642-FE0F\",\n\t\tc: \"1F486-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-tf\": {\n\t\ta: \"French Southern Territories Flag\",\n\t\tb: \"1F1F9-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t45\n\t\t]\n\t},\n\t\"woman-getting-massage\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f486-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F486\",\n\t\ta: \"Woman Getting Massage\",\n\t\tb: \"1F486-200D-2640-FE0F\",\n\t\tc: \"1F486-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-tg\": {\n\t\ta: \"Togo Flag\",\n\t\tb: \"1F1F9-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t46\n\t\t]\n\t},\n\thaircut: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fb.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fc.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fd.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fe.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3ff.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F487-200D-2640-FE0F\",\n\t\ta: \"Haircut\",\n\t\tb: \"1F487\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-th\": {\n\t\ta: \"Thailand Flag\",\n\t\tb: \"1F1F9-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t47\n\t\t]\n\t},\n\t\"man-getting-haircut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f487-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Getting Haircut\",\n\t\tb: \"1F487-200D-2642-FE0F\",\n\t\tc: \"1F487-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t22\n\t\t]\n\t},\n\t\"flag-tj\": {\n\t\ta: \"Tajikistan Flag\",\n\t\tb: \"1F1F9-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-tk\": {\n\t\ta: \"Tokelau Flag\",\n\t\tb: \"1F1F9-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-getting-haircut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f487-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F487\",\n\t\ta: \"Woman Getting Haircut\",\n\t\tb: \"1F487-200D-2640-FE0F\",\n\t\tc: \"1F487-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t16\n\t\t]\n\t},\n\twalking: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B6-200D-2642-FE0F\",\n\t\ta: \"Pedestrian\",\n\t\tb: \"1F6B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t36,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-tl\": {\n\t\ta: \"Timor-Leste Flag\",\n\t\tb: \"1F1F9-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t50\n\t\t]\n\t},\n\t\"man-walking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B6\",\n\t\ta: \"Man Walking\",\n\t\tb: \"1F6B6-200D-2642-FE0F\",\n\t\tc: \"1F6B6-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-tm\": {\n\t\ta: \"Turkmenistan Flag\",\n\t\tb: \"1F1F9-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t51\n\t\t]\n\t},\n\t\"woman-walking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Walking\",\n\t\tb: \"1F6B6-200D-2640-FE0F\",\n\t\tc: \"1F6B6-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t9\n\t\t]\n\t},\n\t\"flag-tn\": {\n\t\ta: \"Tunisia Flag\",\n\t\tb: \"1F1F9-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t0\n\t\t]\n\t},\n\trunner: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fb.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fc.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fd.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fe.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3ff.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3C3-200D-2642-FE0F\",\n\t\ta: \"Runner\",\n\t\tb: \"1F3C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t9,\n\t\t\t46\n\t\t],\n\t\tn: [\n\t\t\t\"running\"\n\t\t]\n\t},\n\t\"flag-to\": {\n\t\ta: \"Tonga Flag\",\n\t\tb: \"1F1F9-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t1\n\t\t]\n\t},\n\t\"man-running\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3C3\",\n\t\ta: \"Man Running\",\n\t\tb: \"1F3C3-200D-2642-FE0F\",\n\t\tc: \"1F3C3-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t9,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-tr\": {\n\t\ta: \"Turkey Flag\",\n\t\tb: \"1F1F9-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-tt\": {\n\t\ta: \"Trinidad & Tobago Flag\",\n\t\tb: \"1F1F9-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t3\n\t\t]\n\t},\n\t\"woman-running\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Running\",\n\t\tb: \"1F3C3-200D-2640-FE0F\",\n\t\tc: \"1F3C3-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t9,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-tv\": {\n\t\ta: \"Tuvalu Flag\",\n\t\tb: \"1F1F9-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t4\n\t\t]\n\t},\n\tdancer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F483-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F483-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F483-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F483-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F483-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Dancer\",\n\t\tb: \"1F483\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girl\",\n\t\t\t\"woman\",\n\t\t\t\"fun\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-tw\": {\n\t\ta: \"Taiwan Flag\",\n\t\tb: \"1F1F9-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t5\n\t\t]\n\t},\n\tman_dancing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F57A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F57A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F57A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F57A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F57A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Dancing\",\n\t\tb: \"1F57A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"boy\",\n\t\t\t\"fun\",\n\t\t\t\"dancer\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t21\n\t\t],\n\t\to: 9\n\t},\n\tdancers: {\n\t\tobsoleted_by: \"1F46F-200D-2640-FE0F\",\n\t\ta: \"Woman with Bunny Ears\",\n\t\tb: \"1F46F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t21,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-tz\": {\n\t\ta: \"Tanzania Flag\",\n\t\tb: \"1F1F9-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-ua\": {\n\t\ta: \"Ukraine Flag\",\n\t\tb: \"1F1FA-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t7\n\t\t]\n\t},\n\t\"man-with-bunny-ears-partying\": {\n\t\ta: \"Man with Bunny Ears Partying\",\n\t\tb: \"1F46F-200D-2642-FE0F\",\n\t\tc: \"1F46F-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t0\n\t\t]\n\t},\n\t\"woman-with-bunny-ears-partying\": {\n\t\tobsoletes: \"1F46F\",\n\t\ta: \"Woman with Bunny Ears Partying\",\n\t\tb: \"1F46F-200D-2640-FE0F\",\n\t\tc: \"1F46F-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t51\n\t\t]\n\t},\n\t\"flag-ug\": {\n\t\ta: \"Uganda Flag\",\n\t\tb: \"1F1FA-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t8\n\t\t]\n\t},\n\t\"flag-um\": {\n\t\ta: \"U.s. Outlying Islands Flag\",\n\t\tb: \"1F1FA-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t9\n\t\t]\n\t},\n\tperson_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D6-200D-2642-FE0F\",\n\t\ta: \"Person in Steamy Room\",\n\t\tb: \"1F9D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t40\n\t\t],\n\t\to: 10\n\t},\n\twoman_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman in Steamy Room\",\n\t\tb: \"1F9D6-200D-2640-FE0F\",\n\t\tc: \"1F9D6-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t28\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-un\": {\n\t\ta: \"United Nations Flag\",\n\t\tb: \"1F1FA-1F1F3\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t5,\n\t\t\t10\n\t\t]\n\t},\n\tus: {\n\t\ta: \"United States Flag\",\n\t\tb: \"1F1FA-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"united\",\n\t\t\t\"states\",\n\t\t\t\"america\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"flag-us\"\n\t\t]\n\t},\n\tman_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D6\",\n\t\ta: \"Man in Steamy Room\",\n\t\tb: \"1F9D6-200D-2642-FE0F\",\n\t\tc: \"1F9D6-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t34\n\t\t],\n\t\to: 10\n\t},\n\tperson_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D7-200D-2640-FE0F\",\n\t\ta: \"Person Climbing\",\n\t\tb: \"1F9D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t6\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-uy\": {\n\t\ta: \"Uruguay Flag\",\n\t\tb: \"1F1FA-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t12\n\t\t]\n\t},\n\twoman_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D7\",\n\t\ta: \"Woman Climbing\",\n\t\tb: \"1F9D7-200D-2640-FE0F\",\n\t\tc: \"1F9D7-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t46\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-uz\": {\n\t\ta: \"Uzbekistan Flag\",\n\t\tb: \"1F1FA-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t13\n\t\t]\n\t},\n\tman_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Climbing\",\n\t\tb: \"1F9D7-200D-2642-FE0F\",\n\t\tc: \"1F9D7-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t0\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-va\": {\n\t\ta: \"Vatican City Flag\",\n\t\tb: \"1F1FB-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t14\n\t\t]\n\t},\n\tperson_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D8-200D-2640-FE0F\",\n\t\ta: \"Person in Lotus Position\",\n\t\tb: \"1F9D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t24\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-vc\": {\n\t\ta: \"St. Vincent & Grenadines Flag\",\n\t\tb: \"1F1FB-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-ve\": {\n\t\ta: \"Venezuela Flag\",\n\t\tb: \"1F1FB-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t16\n\t\t]\n\t},\n\twoman_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D8\",\n\t\ta: \"Woman in Lotus Position\",\n\t\tb: \"1F9D8-200D-2640-FE0F\",\n\t\tc: \"1F9D8-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t12\n\t\t],\n\t\to: 10\n\t},\n\tman_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Lotus Position\",\n\t\tb: \"1F9D8-200D-2642-FE0F\",\n\t\tc: \"1F9D8-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-vg\": {\n\t\ta: \"British Virgin Islands Flag\",\n\t\tb: \"1F1FB-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t17\n\t\t]\n\t},\n\t\"flag-vi\": {\n\t\ta: \"U.s. Virgin Islands Flag\",\n\t\tb: \"1F1FB-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t18\n\t\t]\n\t},\n\tbath: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6C0-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6C0-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6C0-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6C0-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6C0-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Bath\",\n\t\tb: \"1F6C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"shower\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t36\n\t\t]\n\t},\n\tsleeping_accommodation: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6CC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6CC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6CC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6CC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6CC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Sleeping Accommodation\",\n\t\tb: \"1F6CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t48\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-vn\": {\n\t\ta: \"Vietnam Flag\",\n\t\tb: \"1F1FB-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t19\n\t\t]\n\t},\n\tman_in_business_suit_levitating: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F574-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fb.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F574-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fc.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F574-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fd.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F574-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fe.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F574-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3ff.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Business Suit Levitating\",\n\t\tb: \"1F574-FE0F\",\n\t\tc: \"1F574\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-vu\": {\n\t\ta: \"Vanuatu Flag\",\n\t\tb: \"1F1FB-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-wf\": {\n\t\ta: \"Wallis & Futuna Flag\",\n\t\tb: \"1F1FC-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t21\n\t\t]\n\t},\n\tspeaking_head_in_silhouette: {\n\t\ta: \"Speaking Head in Silhouette\",\n\t\tb: \"1F5E3-FE0F\",\n\t\tc: \"1F5E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\tbust_in_silhouette: {\n\t\ta: \"Bust in Silhouette\",\n\t\tb: \"1F464\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"user\",\n\t\t\t\"person\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-ws\": {\n\t\ta: \"Samoa Flag\",\n\t\tb: \"1F1FC-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t22\n\t\t]\n\t},\n\tbusts_in_silhouette: {\n\t\ta: \"Busts in Silhouette\",\n\t\tb: \"1F465\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"user\",\n\t\t\t\"person\",\n\t\t\t\"human\",\n\t\t\t\"group\",\n\t\t\t\"team\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-xk\": {\n\t\ta: \"Kosovo Flag\",\n\t\tb: \"1F1FD-1F1F0\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t23\n\t\t]\n\t},\n\tfencer: {\n\t\ta: \"Fencer\",\n\t\tb: \"1F93A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t48\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-ye\": {\n\t\ta: \"Yemen Flag\",\n\t\tb: \"1F1FE-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-yt\": {\n\t\ta: \"Mayotte Flag\",\n\t\tb: \"1F1FE-1F1F9\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t25\n\t\t]\n\t},\n\thorse_racing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C7-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C7-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C7-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C7-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C7-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Horse Racing\",\n\t\tb: \"1F3C7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"betting\",\n\t\t\t\"competition\",\n\t\t\t\"gambling\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-za\": {\n\t\ta: \"South Africa Flag\",\n\t\tb: \"1F1FF-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t26\n\t\t]\n\t},\n\tskier: {\n\t\ta: \"Skier\",\n\t\tb: \"26F7-FE0F\",\n\t\tc: \"26F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\",\n\t\t\t\"snow\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t44\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-zm\": {\n\t\ta: \"Zambia Flag\",\n\t\tb: \"1F1FF-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t27\n\t\t]\n\t},\n\tsnowboarder: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C2-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fb.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C2-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fc.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C2-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fd.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C2-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fe.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C2-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3ff.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Snowboarder\",\n\t\tb: \"1F3C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t28\n\t\t]\n\t},\n\tgolfer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fb.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fc.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fd.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fe.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3ff.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CC-FE0F-200D-2642-FE0F\",\n\t\ta: \"Golfer\",\n\t\tb: \"1F3CC-FE0F\",\n\t\tc: \"1F3CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t24\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-zw\": {\n\t\ta: \"Zimbabwe Flag\",\n\t\tb: \"1F1FF-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t28\n\t\t]\n\t},\n\t\"man-golfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CC-FE0F\",\n\t\ta: \"Man Golfing\",\n\t\tb: \"1F3CC-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-england\": {\n\t\ta: \"England Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\t\"woman-golfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Golfing\",\n\t\tb: \"1F3CC-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-scotland\": {\n\t\ta: \"Scotland Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-wales\": {\n\t\ta: \"Wales Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tsurfer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3C4-200D-2642-FE0F\",\n\t\ta: \"Surfer\",\n\t\tb: \"1F3C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t10,\n\t\t\t12\n\t\t]\n\t},\n\t\"man-surfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3C4\",\n\t\ta: \"Man Surfing\",\n\t\tb: \"1F3C4-200D-2642-FE0F\",\n\t\tc: \"1F3C4-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t6\n\t\t]\n\t},\n\t\"woman-surfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Surfing\",\n\t\tb: \"1F3C4-200D-2640-FE0F\",\n\t\tc: \"1F3C4-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t0\n\t\t]\n\t},\n\trowboat: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fb.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fc.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fd.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fe.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3ff.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6A3-200D-2642-FE0F\",\n\t\ta: \"Rowboat\",\n\t\tb: \"1F6A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t35,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-rowing-boat\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6A3\",\n\t\ta: \"Man Rowing Boat\",\n\t\tb: \"1F6A3-200D-2642-FE0F\",\n\t\tc: \"1F6A3-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t34,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-rowing-boat\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Rowing Boat\",\n\t\tb: \"1F6A3-200D-2640-FE0F\",\n\t\tc: \"1F6A3-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t34,\n\t\t\t43\n\t\t]\n\t},\n\tswimmer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CA-200D-2642-FE0F\",\n\t\ta: \"Swimmer\",\n\t\tb: \"1F3CA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t10,\n\t\t\t40\n\t\t]\n\t},\n\t\"man-swimming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CA\",\n\t\ta: \"Man Swimming\",\n\t\tb: \"1F3CA-200D-2642-FE0F\",\n\t\tc: \"1F3CA-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t34\n\t\t]\n\t},\n\t\"woman-swimming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Swimming\",\n\t\tb: \"1F3CA-200D-2640-FE0F\",\n\t\tc: \"1F3CA-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t28\n\t\t]\n\t},\n\tperson_with_ball: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"26F9-FE0F-200D-2642-FE0F\",\n\t\ta: \"Person with Ball\",\n\t\tb: \"26F9-FE0F\",\n\t\tc: \"26F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t49,\n\t\t\t6\n\t\t],\n\t\to: 5\n\t},\n\t\"man-bouncing-ball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FB-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FC-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FD-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FE-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FF-200D-2642\",\n\t\t\t\timage: \"26f9-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"26F9-FE0F\",\n\t\ta: \"Man Bouncing Ball\",\n\t\tb: \"26F9-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t49,\n\t\t\t0\n\t\t],\n\t\to: 5\n\t},\n\t\"woman-bouncing-ball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FB-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FC-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FD-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FE-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FF-200D-2640\",\n\t\t\t\timage: \"26f9-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Bouncing Ball\",\n\t\tb: \"26F9-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t46\n\t\t],\n\t\to: 5\n\t},\n\tweight_lifter: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fb.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fc.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fd.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fe.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3ff.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CB-FE0F-200D-2642-FE0F\",\n\t\ta: \"Weight Lifter\",\n\t\tb: \"1F3CB-FE0F\",\n\t\tc: \"1F3CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\t\"man-lifting-weights\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CB-FE0F\",\n\t\ta: \"Man Lifting Weights\",\n\t\tb: \"1F3CB-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\t\"woman-lifting-weights\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Lifting Weights\",\n\t\tb: \"1F3CB-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t46\n\t\t],\n\t\to: 7\n\t},\n\tbicyclist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fb.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fc.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fd.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fe.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3ff.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B4-200D-2642-FE0F\",\n\t\ta: \"Bicyclist\",\n\t\tb: \"1F6B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t35,\n\t\t\t37\n\t\t]\n\t},\n\t\"man-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B4\",\n\t\ta: \"Man Biking\",\n\t\tb: \"1F6B4-200D-2642-FE0F\",\n\t\tc: \"1F6B4-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t31\n\t\t]\n\t},\n\t\"woman-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Biking\",\n\t\tb: \"1F6B4-200D-2640-FE0F\",\n\t\tc: \"1F6B4-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t25\n\t\t]\n\t},\n\tmountain_bicyclist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B5-200D-2642-FE0F\",\n\t\ta: \"Mountain Bicyclist\",\n\t\tb: \"1F6B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t36,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-mountain-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B5\",\n\t\ta: \"Man Mountain Biking\",\n\t\tb: \"1F6B5-200D-2642-FE0F\",\n\t\tc: \"1F6B5-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-mountain-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Mountain Biking\",\n\t\tb: \"1F6B5-200D-2640-FE0F\",\n\t\tc: \"1F6B5-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t43\n\t\t]\n\t},\n\tracing_car: {\n\t\ta: \"Racing Car\",\n\t\tb: \"1F3CE-FE0F\",\n\t\tc: \"1F3CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"race\",\n\t\t\t\"fast\",\n\t\t\t\"formula\",\n\t\t\t\"f1\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t31\n\t\t],\n\t\to: 7\n\t},\n\tracing_motorcycle: {\n\t\ta: \"Racing Motorcycle\",\n\t\tb: \"1F3CD-FE0F\",\n\t\tc: \"1F3CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\tperson_doing_cartwheel: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Person Doing Cartwheel\",\n\t\tb: \"1F938\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\t\"man-cartwheeling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f938-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Cartwheeling\",\n\t\tb: \"1F938-200D-2642-FE0F\",\n\t\tc: \"1F938-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t18\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-cartwheeling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f938-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Cartwheeling\",\n\t\tb: \"1F938-200D-2640-FE0F\",\n\t\tc: \"1F938-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t12\n\t\t],\n\t\to: 9\n\t},\n\twrestlers: {\n\t\ta: \"Wrestlers\",\n\t\tb: \"1F93C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t51\n\t\t],\n\t\to: 9\n\t},\n\t\"man-wrestling\": {\n\t\ta: \"Man Wrestling\",\n\t\tb: \"1F93C-200D-2642-FE0F\",\n\t\tc: \"1F93C-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-wrestling\": {\n\t\ta: \"Woman Wrestling\",\n\t\tb: \"1F93C-200D-2640-FE0F\",\n\t\tc: \"1F93C-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t49\n\t\t],\n\t\to: 9\n\t},\n\twater_polo: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fb.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fc.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fd.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fe.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3ff.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Water Polo\",\n\t\tb: \"1F93D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t12\n\t\t],\n\t\to: 9\n\t},\n\t\"man-playing-water-polo\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Playing Water Polo\",\n\t\tb: \"1F93D-200D-2642-FE0F\",\n\t\tc: \"1F93D-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-playing-water-polo\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Playing Water Polo\",\n\t\tb: \"1F93D-200D-2640-FE0F\",\n\t\tc: \"1F93D-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\thandball: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fb.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fc.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fd.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fe.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3ff.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Handball\",\n\t\tb: \"1F93E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\t\"man-playing-handball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Playing Handball\",\n\t\tb: \"1F93E-200D-2642-FE0F\",\n\t\tc: \"1F93E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-playing-handball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Playing Handball\",\n\t\tb: \"1F93E-200D-2640-FE0F\",\n\t\tc: \"1F93E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t18\n\t\t],\n\t\to: 9\n\t},\n\tjuggling: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Juggling\",\n\t\tb: \"1F939\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t42\n\t\t],\n\t\to: 9\n\t},\n\t\"man-juggling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f939-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Juggling\",\n\t\tb: \"1F939-200D-2642-FE0F\",\n\t\tc: \"1F939-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-juggling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f939-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Juggling\",\n\t\tb: \"1F939-200D-2640-FE0F\",\n\t\tc: \"1F939-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\tcouple: {\n\t\ta: \"Man and Woman Holding Hands\",\n\t\tb: \"1F46B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"people\",\n\t\t\t\"human\",\n\t\t\t\"love\",\n\t\t\t\"date\",\n\t\t\t\"dating\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"marriage\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t30\n\t\t],\n\t\tn: [\n\t\t\t\"man_and_woman_holding_hands\"\n\t\t]\n\t},\n\ttwo_men_holding_hands: {\n\t\ta: \"Two Men Holding Hands\",\n\t\tb: \"1F46C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"couple\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"bromance\",\n\t\t\t\"friendship\",\n\t\t\t\"people\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t31\n\t\t]\n\t},\n\ttwo_women_holding_hands: {\n\t\ta: \"Two Women Holding Hands\",\n\t\tb: \"1F46D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"friendship\",\n\t\t\t\"couple\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"female\",\n\t\t\t\"people\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t32\n\t\t]\n\t},\n\tcouplekiss: {\n\t\tobsoleted_by: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\ta: \"Kiss\",\n\t\tb: \"1F48F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t41\n\t\t]\n\t},\n\t\"woman-kiss-man\": {\n\t\tobsoletes: \"1F48F\",\n\t\ta: \"Woman Kiss Man\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\tc: \"1F469-200D-2764-200D-1F48B-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t21\n\t\t]\n\t},\n\t\"man-kiss-man\": {\n\t\ta: \"Man Kiss Man\",\n\t\tb: \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\tc: \"1F468-200D-2764-200D-1F48B-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t18,\n\t\t\t10\n\t\t]\n\t},\n\t\"woman-kiss-woman\": {\n\t\ta: \"Woman Kiss Woman\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n\t\tc: \"1F469-200D-2764-200D-1F48B-200D-1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t22\n\t\t]\n\t},\n\tcouple_with_heart: {\n\t\tobsoleted_by: \"1F469-200D-2764-FE0F-200D-1F468\",\n\t\ta: \"Couple with Heart\",\n\t\tb: \"1F491\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t43\n\t\t]\n\t},\n\t\"woman-heart-man\": {\n\t\tobsoletes: \"1F491\",\n\t\ta: \"Woman Heart Man\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F468\",\n\t\tc: \"1F469-200D-2764-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t19\n\t\t]\n\t},\n\t\"man-heart-man\": {\n\t\ta: \"Man Heart Man\",\n\t\tb: \"1F468-200D-2764-FE0F-200D-1F468\",\n\t\tc: \"1F468-200D-2764-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t18,\n\t\t\t9\n\t\t]\n\t},\n\t\"woman-heart-woman\": {\n\t\ta: \"Woman Heart Woman\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F469\",\n\t\tc: \"1F469-200D-2764-200D-1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t20\n\t\t]\n\t},\n\tfamily: {\n\t\tobsoleted_by: \"1F468-200D-1F469-200D-1F466\",\n\t\ta: \"Family\",\n\t\tb: \"1F46A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t29\n\t\t],\n\t\tn: [\n\t\t\t\"man-woman-boy\"\n\t\t]\n\t},\n\t\"man-woman-boy\": {\n\t\tobsoletes: \"1F46A\",\n\t\ta: \"Man Woman Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"family\"\n\t\t]\n\t},\n\t\"man-woman-girl\": {\n\t\ta: \"Man Woman Girl\",\n\t\tb: \"1F468-200D-1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t4\n\t\t]\n\t},\n\t\"man-woman-girl-boy\": {\n\t\ta: \"Man Woman Girl Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t5\n\t\t]\n\t},\n\t\"man-woman-boy-boy\": {\n\t\ta: \"Man Woman Boy Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-woman-girl-girl\": {\n\t\ta: \"Man Woman Girl Girl\",\n\t\tb: \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t6\n\t\t]\n\t},\n\t\"man-man-boy\": {\n\t\ta: \"Man Man Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t49\n\t\t]\n\t},\n\t\"man-man-girl\": {\n\t\ta: \"Man Man Girl\",\n\t\tb: \"1F468-200D-1F468-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t51\n\t\t]\n\t},\n\t\"man-man-girl-boy\": {\n\t\ta: \"Man Man Girl Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t0\n\t\t]\n\t},\n\t\"man-man-boy-boy\": {\n\t\ta: \"Man Man Boy Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t50\n\t\t]\n\t},\n\t\"man-man-girl-girl\": {\n\t\ta: \"Man Man Girl Girl\",\n\t\tb: \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t1\n\t\t]\n\t},\n\t\"woman-woman-boy\": {\n\t\ta: \"Woman Woman Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t12\n\t\t]\n\t},\n\t\"woman-woman-girl\": {\n\t\ta: \"Woman Woman Girl\",\n\t\tb: \"1F469-200D-1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t14\n\t\t]\n\t},\n\t\"woman-woman-girl-boy\": {\n\t\ta: \"Woman Woman Girl Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t15\n\t\t]\n\t},\n\t\"woman-woman-boy-boy\": {\n\t\ta: \"Woman Woman Boy Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t13\n\t\t]\n\t},\n\t\"woman-woman-girl-girl\": {\n\t\ta: \"Woman Woman Girl Girl\",\n\t\tb: \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t16\n\t\t]\n\t},\n\t\"man-boy\": {\n\t\ta: \"Man Boy\",\n\t\tb: \"1F468-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t45\n\t\t]\n\t},\n\t\"man-boy-boy\": {\n\t\ta: \"Man Boy Boy\",\n\t\tb: \"1F468-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t44\n\t\t]\n\t},\n\t\"man-girl\": {\n\t\ta: \"Man Girl\",\n\t\tb: \"1F468-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t48\n\t\t]\n\t},\n\t\"man-girl-boy\": {\n\t\ta: \"Man Girl Boy\",\n\t\tb: \"1F468-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t46\n\t\t]\n\t},\n\t\"man-girl-girl\": {\n\t\ta: \"Man Girl Girl\",\n\t\tb: \"1F468-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t47\n\t\t]\n\t},\n\t\"woman-boy\": {\n\t\ta: \"Woman Boy\",\n\t\tb: \"1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t8\n\t\t]\n\t},\n\t\"woman-boy-boy\": {\n\t\ta: \"Woman Boy Boy\",\n\t\tb: \"1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t7\n\t\t]\n\t},\n\t\"woman-girl\": {\n\t\ta: \"Woman Girl\",\n\t\tb: \"1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t11\n\t\t]\n\t},\n\t\"woman-girl-boy\": {\n\t\ta: \"Woman Girl Boy\",\n\t\tb: \"1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t9\n\t\t]\n\t},\n\t\"woman-girl-girl\": {\n\t\ta: \"Woman Girl Girl\",\n\t\tb: \"1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t10\n\t\t]\n\t},\n\tselfie: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F933-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F933-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F933-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F933-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F933-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Selfie\",\n\t\tb: \"1F933\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"camera\",\n\t\t\t\"phone\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t22\n\t\t],\n\t\to: 9\n\t},\n\tmuscle: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F4AA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fb.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F4AA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fc.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F4AA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fd.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F4AA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fe.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F4AA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3ff.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Flexed Biceps\",\n\t\tb: \"1F4AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arm\",\n\t\t\t\"flex\",\n\t\t\t\"hand\",\n\t\t\t\"summer\",\n\t\t\t\"strong\",\n\t\t\t\"biceps\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t16\n\t\t]\n\t},\n\tpoint_left: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F448-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F448-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F448-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F448-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F448-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Left Pointing Backhand Index\",\n\t\tb: \"1F448\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"direction\",\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"left\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t19\n\t\t]\n\t},\n\tpoint_right: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F449-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F449-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F449-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F449-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F449-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Right Pointing Backhand Index\",\n\t\tb: \"1F449\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"right\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t25\n\t\t]\n\t},\n\tpoint_up: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"261D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fb.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"261D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fc.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"261D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fd.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"261D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fe.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"261D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3ff.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Up Pointing Index\",\n\t\tb: \"261D-FE0F\",\n\t\tc: \"261D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hand\",\n\t\t\t\"fingers\",\n\t\t\t\"direction\",\n\t\t\t\"up\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t26\n\t\t],\n\t\to: 1\n\t},\n\tpoint_up_2: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F446-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F446-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F446-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F446-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F446-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Up Pointing Backhand Index\",\n\t\tb: \"1F446\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"up\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t7\n\t\t]\n\t},\n\tmiddle_finger: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F595-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F595-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F595-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F595-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F595-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Reversed Hand with Middle Finger Extended\",\n\t\tb: \"1F595\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t38\n\t\t],\n\t\tn: [\n\t\t\t\"reversed_hand_with_middle_finger_extended\"\n\t\t],\n\t\to: 7\n\t},\n\tpoint_down: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F447-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F447-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F447-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F447-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F447-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Down Pointing Backhand Index\",\n\t\tb: \"1F447\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"down\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t13\n\t\t]\n\t},\n\tv: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Victory Hand\",\n\t\tb: \"270C-FE0F\",\n\t\tc: \"270C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"ohyeah\",\n\t\t\t\"hand\",\n\t\t\t\"peace\",\n\t\t\t\"victory\",\n\t\t\t\"two\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t30\n\t\t],\n\t\to: 1\n\t},\n\tcrossed_fingers: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Hand with Index and Middle Fingers Crossed\",\n\t\tb: \"1F91E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"lucky\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"hand_with_index_and_middle_fingers_crossed\"\n\t\t],\n\t\to: 9\n\t},\n\t\"spock-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F596-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F596-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F596-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F596-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F596-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand with Part Between Middle and Ring Fingers\",\n\t\tb: \"1F596\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tthe_horns: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F918-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F918-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F918-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F918-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F918-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Sign of the Horns\",\n\t\tb: \"1F918\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t32\n\t\t],\n\t\tn: [\n\t\t\t\"sign_of_the_horns\"\n\t\t],\n\t\to: 8\n\t},\n\tcall_me_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F919-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F919-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F919-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F919-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F919-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Call Me Hand\",\n\t\tb: \"1F919\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"gesture\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\traised_hand_with_fingers_splayed: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F590-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F590-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F590-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F590-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F590-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand with Fingers Splayed\",\n\t\tb: \"1F590-FE0F\",\n\t\tc: \"1F590\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hand\",\n\t\t\t\"fingers\",\n\t\t\t\"palm\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t32\n\t\t],\n\t\to: 7\n\t},\n\thand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand\",\n\t\tb: \"270B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t49,\n\t\t\t24\n\t\t],\n\t\tn: [\n\t\t\t\"raised_hand\"\n\t\t]\n\t},\n\tok_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Ok Hand Sign\",\n\t\tb: \"1F44C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"limbs\",\n\t\t\t\"perfect\",\n\t\t\t\"ok\",\n\t\t\t\"okay\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t43\n\t\t]\n\t},\n\t\"+1\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Thumbs Up Sign\",\n\t\tb: \"1F44D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thumbsup\",\n\t\t\t\"yes\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"agree\",\n\t\t\t\"accept\",\n\t\t\t\"cool\",\n\t\t\t\"hand\",\n\t\t\t\"like\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t49\n\t\t],\n\t\tn: [\n\t\t\t\"thumbsup\"\n\t\t]\n\t},\n\t\"-1\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Thumbs Down Sign\",\n\t\tb: \"1F44E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thumbsdown\",\n\t\t\t\"no\",\n\t\t\t\"dislike\",\n\t\t\t\"hand\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t3\n\t\t],\n\t\tn: [\n\t\t\t\"thumbsdown\"\n\t\t]\n\t},\n\tfist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Fist\",\n\t\tb: \"270A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"grasp\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t18\n\t\t]\n\t},\n\tfacepunch: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Fisted Hand Sign\",\n\t\tb: \"1F44A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"violence\",\n\t\t\t\"fist\",\n\t\t\t\"hit\",\n\t\t\t\"attack\",\n\t\t\t\"hand\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"punch\"\n\t\t]\n\t},\n\t\"left-facing_fist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Left-Facing Fist\",\n\t\tb: \"1F91B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\t\"right-facing_fist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Right-Facing Fist\",\n\t\tb: \"1F91C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\traised_back_of_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Back of Hand\",\n\t\tb: \"1F91A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"raised\",\n\t\t\t\"backhand\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t44\n\t\t],\n\t\to: 9\n\t},\n\twave: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Waving Hand Sign\",\n\t\tb: \"1F44B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"gesture\",\n\t\t\t\"goodbye\",\n\t\t\t\"solong\",\n\t\t\t\"farewell\",\n\t\t\t\"hello\",\n\t\t\t\"hi\",\n\t\t\t\"palm\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t37\n\t\t]\n\t},\n\ti_love_you_hand_sign: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"I Love You Hand Sign\",\n\t\tb: \"1F91F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\twriting_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Writing Hand\",\n\t\tb: \"270D-FE0F\",\n\t\tc: \"270D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lower_left_ballpoint_pen\",\n\t\t\t\"stationery\",\n\t\t\t\"write\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\tclap: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Clapping Hands Sign\",\n\t\tb: \"1F44F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"praise\",\n\t\t\t\"applause\",\n\t\t\t\"congrats\",\n\t\t\t\"yay\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t9\n\t\t]\n\t},\n\topen_hands: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F450-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F450-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F450-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F450-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F450-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Open Hands Sign\",\n\t\tb: \"1F450\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"butterfly\",\n\t\t\t\"hands\",\n\t\t\t\"open\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t15\n\t\t]\n\t},\n\traised_hands: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Person Raising Both Hands in Celebration\",\n\t\tb: \"1F64C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gesture\",\n\t\t\t\"hooray\",\n\t\t\t\"yea\",\n\t\t\t\"celebration\",\n\t\t\t\"hands\"\n\t\t],\n\t\tk: [\n\t\t\t33,\n\t\t\t12\n\t\t]\n\t},\n\tpalms_up_together: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F932-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F932-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F932-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F932-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F932-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Palms Up Together\",\n\t\tb: \"1F932\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\tpray: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fb.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fc.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fd.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fe.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3ff.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Person with Folded Hands\",\n\t\tb: \"1F64F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"please\",\n\t\t\t\"hope\",\n\t\t\t\"wish\",\n\t\t\t\"namaste\",\n\t\t\t\"highfive\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t2\n\t\t]\n\t},\n\thandshake: {\n\t\ta: \"Handshake\",\n\t\tb: \"1F91D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"agreement\",\n\t\t\t\"shake\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t10\n\t\t],\n\t\to: 9\n\t},\n\tnail_care: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F485-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F485-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F485-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F485-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F485-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Nail Polish\",\n\t\tb: \"1F485\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beauty\",\n\t\t\t\"manicure\",\n\t\t\t\"finger\",\n\t\t\t\"fashion\",\n\t\t\t\"nail\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t44\n\t\t]\n\t},\n\tear: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F442-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fb.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F442-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fc.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F442-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fd.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F442-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fe.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F442-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3ff.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Ear\",\n\t\tb: \"1F442\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hear\",\n\t\t\t\"sound\",\n\t\t\t\"listen\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t45\n\t\t]\n\t},\n\tnose: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F443-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F443-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F443-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F443-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F443-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Nose\",\n\t\tb: \"1F443\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"smell\",\n\t\t\t\"sniff\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t51\n\t\t]\n\t},\n\tfootprints: {\n\t\ta: \"Footprints\",\n\t\tb: \"1F463\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"feet\",\n\t\t\t\"tracking\",\n\t\t\t\"walking\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t39\n\t\t]\n\t},\n\teyes: {\n\t\ta: \"Eyes\",\n\t\tb: \"1F440\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"look\",\n\t\t\t\"watch\",\n\t\t\t\"stalk\",\n\t\t\t\"peek\",\n\t\t\t\"see\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t42\n\t\t]\n\t},\n\teye: {\n\t\ta: \"Eye\",\n\t\tb: \"1F441-FE0F\",\n\t\tc: \"1F441\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"look\",\n\t\t\t\"see\",\n\t\t\t\"watch\",\n\t\t\t\"stare\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\t\"eye-in-speech-bubble\": {\n\t\ta: \"Eye in Speech Bubble\",\n\t\tb: \"1F441-FE0F-200D-1F5E8-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t13,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tbrain: {\n\t\ta: \"Brain\",\n\t\tb: \"1F9E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\ttongue: {\n\t\ta: \"Tongue\",\n\t\tb: \"1F445\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mouth\",\n\t\t\t\"playful\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t6\n\t\t]\n\t},\n\tlips: {\n\t\ta: \"Mouth\",\n\t\tb: \"1F444\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mouth\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t5\n\t\t]\n\t},\n\tkiss: {\n\t\ta: \"Kiss Mark\",\n\t\tb: \"1F48B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"lips\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t37\n\t\t]\n\t},\n\tcupid: {\n\t\ta: \"Heart with Arrow\",\n\t\tb: \"1F498\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"heart\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t50\n\t\t]\n\t},\n\theart: {\n\t\ta: \"Heavy Black Heart\",\n\t\tb: \"2764-FE0F\",\n\t\tc: \"2764\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t8\n\t\t],\n\t\tl: [\n\t\t\t\"<3\"\n\t\t],\n\t\tm: \"<3\",\n\t\to: 1\n\t},\n\theartbeat: {\n\t\ta: \"Beating Heart\",\n\t\tb: \"1F493\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"pink\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t45\n\t\t]\n\t},\n\tbroken_heart: {\n\t\ta: \"Broken Heart\",\n\t\tb: \"1F494\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sad\",\n\t\t\t\"sorry\",\n\t\t\t\"break\",\n\t\t\t\"heart\",\n\t\t\t\"heartbreak\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t46\n\t\t],\n\t\tl: [\n\t\t\t\"</3\"\n\t\t],\n\t\tm: \"</3\"\n\t},\n\ttwo_hearts: {\n\t\ta: \"Two Hearts\",\n\t\tb: \"1F495\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t47\n\t\t]\n\t},\n\tsparkling_heart: {\n\t\ta: \"Sparkling Heart\",\n\t\tb: \"1F496\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t48\n\t\t]\n\t},\n\theartpulse: {\n\t\ta: \"Growing Heart\",\n\t\tb: \"1F497\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"like\",\n\t\t\t\"love\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"pink\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t49\n\t\t]\n\t},\n\tblue_heart: {\n\t\ta: \"Blue Heart\",\n\t\tb: \"1F499\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t51\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tgreen_heart: {\n\t\ta: \"Green Heart\",\n\t\tb: \"1F49A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t0\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tyellow_heart: {\n\t\ta: \"Yellow Heart\",\n\t\tb: \"1F49B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t1\n\t\t],\n\t\tm: \"<3\"\n\t},\n\torange_heart: {\n\t\ta: \"Orange Heart\",\n\t\tb: \"1F9E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\tpurple_heart: {\n\t\ta: \"Purple Heart\",\n\t\tb: \"1F49C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t2\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tblack_heart: {\n\t\ta: \"Black Heart\",\n\t\tb: \"1F5A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"evil\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\tgift_heart: {\n\t\ta: \"Heart with Ribbon\",\n\t\tb: \"1F49D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t3\n\t\t]\n\t},\n\trevolving_hearts: {\n\t\ta: \"Revolving Hearts\",\n\t\tb: \"1F49E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t4\n\t\t]\n\t},\n\theart_decoration: {\n\t\ta: \"Heart Decoration\",\n\t\tb: \"1F49F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"love\",\n\t\t\t\"like\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t5\n\t\t]\n\t},\n\theavy_heart_exclamation_mark_ornament: {\n\t\ta: \"Heavy Heart Exclamation Mark Ornament\",\n\t\tb: \"2763-FE0F\",\n\t\tc: \"2763\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t50,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tlove_letter: {\n\t\ta: \"Love Letter\",\n\t\tb: \"1F48C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"envelope\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t38\n\t\t]\n\t},\n\tzzz: {\n\t\ta: \"Sleeping Symbol\",\n\t\tb: \"1F4A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sleepy\",\n\t\t\t\"tired\",\n\t\t\t\"dream\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t10\n\t\t]\n\t},\n\tanger: {\n\t\ta: \"Anger Symbol\",\n\t\tb: \"1F4A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"mad\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t8\n\t\t]\n\t},\n\tbomb: {\n\t\ta: \"Bomb\",\n\t\tb: \"1F4A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"boom\",\n\t\t\t\"explode\",\n\t\t\t\"explosion\",\n\t\t\t\"terrorism\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t9\n\t\t]\n\t},\n\tboom: {\n\t\ta: \"Collision Symbol\",\n\t\tb: \"1F4A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bomb\",\n\t\t\t\"explode\",\n\t\t\t\"explosion\",\n\t\t\t\"collision\",\n\t\t\t\"blown\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"collision\"\n\t\t]\n\t},\n\tsweat_drops: {\n\t\ta: \"Splashing Sweat Symbol\",\n\t\tb: \"1F4A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"water\",\n\t\t\t\"drip\",\n\t\t\t\"oops\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t12\n\t\t]\n\t},\n\tdash: {\n\t\ta: \"Dash Symbol\",\n\t\tb: \"1F4A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wind\",\n\t\t\t\"air\",\n\t\t\t\"fast\",\n\t\t\t\"shoo\",\n\t\t\t\"fart\",\n\t\t\t\"smoke\",\n\t\t\t\"puff\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t14\n\t\t]\n\t},\n\tdizzy: {\n\t\ta: \"Dizzy Symbol\",\n\t\tb: \"1F4AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"star\",\n\t\t\t\"sparkle\",\n\t\t\t\"shoot\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t22\n\t\t]\n\t},\n\tspeech_balloon: {\n\t\ta: \"Speech Balloon\",\n\t\tb: \"1F4AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bubble\",\n\t\t\t\"words\",\n\t\t\t\"message\",\n\t\t\t\"talk\",\n\t\t\t\"chatting\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t23\n\t\t]\n\t},\n\tleft_speech_bubble: {\n\t\ta: \"Left Speech Bubble\",\n\t\tb: \"1F5E8-FE0F\",\n\t\tc: \"1F5E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"message\",\n\t\t\t\"talk\",\n\t\t\t\"chatting\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tright_anger_bubble: {\n\t\ta: \"Right Anger Bubble\",\n\t\tb: \"1F5EF-FE0F\",\n\t\tc: \"1F5EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"caption\",\n\t\t\t\"speech\",\n\t\t\t\"thinking\",\n\t\t\t\"mad\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\tthought_balloon: {\n\t\ta: \"Thought Balloon\",\n\t\tb: \"1F4AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bubble\",\n\t\t\t\"cloud\",\n\t\t\t\"speech\",\n\t\t\t\"thinking\",\n\t\t\t\"dream\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t24\n\t\t]\n\t},\n\thole: {\n\t\ta: \"Hole\",\n\t\tb: \"1F573-FE0F\",\n\t\tc: \"1F573\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"embarrassing\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\teyeglasses: {\n\t\ta: \"Eyeglasses\",\n\t\tb: \"1F453\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"eyesight\",\n\t\t\t\"nerdy\",\n\t\t\t\"dork\",\n\t\t\t\"geek\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t23\n\t\t]\n\t},\n\tdark_sunglasses: {\n\t\ta: \"Dark Sunglasses\",\n\t\tb: \"1F576-FE0F\",\n\t\tc: \"1F576\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cool\",\n\t\t\t\"accessories\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\tnecktie: {\n\t\ta: \"Necktie\",\n\t\tb: \"1F454\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shirt\",\n\t\t\t\"suitup\",\n\t\t\t\"formal\",\n\t\t\t\"fashion\",\n\t\t\t\"cloth\",\n\t\t\t\"business\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t24\n\t\t]\n\t},\n\tshirt: {\n\t\ta: \"T-Shirt\",\n\t\tb: \"1F455\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t15,\n\t\t\t25\n\t\t],\n\t\tn: [\n\t\t\t\"tshirt\"\n\t\t]\n\t},\n\tjeans: {\n\t\ta: \"Jeans\",\n\t\tb: \"1F456\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t26\n\t\t]\n\t},\n\tscarf: {\n\t\ta: \"Scarf\",\n\t\tb: \"1F9E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t25\n\t\t],\n\t\to: 10\n\t},\n\tgloves: {\n\t\ta: \"Gloves\",\n\t\tb: \"1F9E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t26\n\t\t],\n\t\to: 10\n\t},\n\tcoat: {\n\t\ta: \"Coat\",\n\t\tb: \"1F9E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t27\n\t\t],\n\t\to: 10\n\t},\n\tsocks: {\n\t\ta: \"Socks\",\n\t\tb: \"1F9E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t28\n\t\t],\n\t\to: 10\n\t},\n\tdress: {\n\t\ta: \"Dress\",\n\t\tb: \"1F457\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clothes\",\n\t\t\t\"fashion\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t27\n\t\t]\n\t},\n\tkimono: {\n\t\ta: \"Kimono\",\n\t\tb: \"1F458\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dress\",\n\t\t\t\"fashion\",\n\t\t\t\"women\",\n\t\t\t\"female\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t28\n\t\t]\n\t},\n\tbikini: {\n\t\ta: \"Bikini\",\n\t\tb: \"1F459\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"swimming\",\n\t\t\t\"female\",\n\t\t\t\"woman\",\n\t\t\t\"girl\",\n\t\t\t\"fashion\",\n\t\t\t\"beach\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t29\n\t\t]\n\t},\n\twomans_clothes: {\n\t\ta: \"Womans Clothes\",\n\t\tb: \"1F45A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shopping_bags\",\n\t\t\t\"female\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t30\n\t\t]\n\t},\n\tpurse: {\n\t\ta: \"Purse\",\n\t\tb: \"1F45B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t31\n\t\t]\n\t},\n\thandbag: {\n\t\ta: \"Handbag\",\n\t\tb: \"1F45C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessory\",\n\t\t\t\"accessories\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t32\n\t\t]\n\t},\n\tpouch: {\n\t\ta: \"Pouch\",\n\t\tb: \"1F45D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bag\",\n\t\t\t\"accessories\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t33\n\t\t]\n\t},\n\tshopping_bags: {\n\t\ta: \"Shopping Bags\",\n\t\tb: \"1F6CD-FE0F\",\n\t\tc: \"1F6CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t2\n\t\t],\n\t\to: 7\n\t},\n\tschool_satchel: {\n\t\ta: \"School Satchel\",\n\t\tb: \"1F392\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"student\",\n\t\t\t\"education\",\n\t\t\t\"bag\",\n\t\t\t\"backpack\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t37\n\t\t]\n\t},\n\tmans_shoe: {\n\t\ta: \"Mans Shoe\",\n\t\tb: \"1F45E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"male\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t34\n\t\t],\n\t\tn: [\n\t\t\t\"shoe\"\n\t\t]\n\t},\n\tathletic_shoe: {\n\t\ta: \"Athletic Shoe\",\n\t\tb: \"1F45F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"sports\",\n\t\t\t\"sneakers\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t35\n\t\t]\n\t},\n\thigh_heel: {\n\t\ta: \"High-Heeled Shoe\",\n\t\tb: \"1F460\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shoes\",\n\t\t\t\"female\",\n\t\t\t\"pumps\",\n\t\t\t\"stiletto\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t36\n\t\t]\n\t},\n\tsandal: {\n\t\ta: \"Womans Sandal\",\n\t\tb: \"1F461\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"fashion\",\n\t\t\t\"flip flops\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t37\n\t\t]\n\t},\n\tboot: {\n\t\ta: \"Womans Boots\",\n\t\tb: \"1F462\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"fashion\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t38\n\t\t]\n\t},\n\tcrown: {\n\t\ta: \"Crown\",\n\t\tb: \"1F451\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"king\",\n\t\t\t\"kod\",\n\t\t\t\"leader\",\n\t\t\t\"royalty\",\n\t\t\t\"lord\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t21\n\t\t]\n\t},\n\twomans_hat: {\n\t\ta: \"Womans Hat\",\n\t\tb: \"1F452\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"female\",\n\t\t\t\"lady\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t22\n\t\t]\n\t},\n\ttophat: {\n\t\ta: \"Top Hat\",\n\t\tb: \"1F3A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"magic\",\n\t\t\t\"gentleman\",\n\t\t\t\"classy\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t3\n\t\t]\n\t},\n\tmortar_board: {\n\t\ta: \"Graduation Cap\",\n\t\tb: \"1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"school\",\n\t\t\t\"college\",\n\t\t\t\"degree\",\n\t\t\t\"university\",\n\t\t\t\"graduation\",\n\t\t\t\"cap\",\n\t\t\t\"hat\",\n\t\t\t\"legal\",\n\t\t\t\"learn\",\n\t\t\t\"education\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t38\n\t\t]\n\t},\n\tbilled_cap: {\n\t\ta: \"Billed Cap\",\n\t\tb: \"1F9E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t24\n\t\t],\n\t\to: 10\n\t},\n\thelmet_with_white_cross: {\n\t\ta: \"Helmet with White Cross\",\n\t\tb: \"26D1-FE0F\",\n\t\tc: \"26D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t33\n\t\t],\n\t\to: 5\n\t},\n\tprayer_beads: {\n\t\ta: \"Prayer Beads\",\n\t\tb: \"1F4FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dhikr\",\n\t\t\t\"religious\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t1\n\t\t],\n\t\to: 8\n\t},\n\tlipstick: {\n\t\ta: \"Lipstick\",\n\t\tb: \"1F484\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girl\",\n\t\t\t\"fashion\",\n\t\t\t\"woman\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t43\n\t\t]\n\t},\n\tring: {\n\t\ta: \"Ring\",\n\t\tb: \"1F48D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wedding\",\n\t\t\t\"propose\",\n\t\t\t\"marriage\",\n\t\t\t\"valentines\",\n\t\t\t\"diamond\",\n\t\t\t\"fashion\",\n\t\t\t\"jewelry\",\n\t\t\t\"gem\",\n\t\t\t\"engagement\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t39\n\t\t]\n\t},\n\tgem: {\n\t\ta: \"Gem Stone\",\n\t\tb: \"1F48E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue\",\n\t\t\t\"ruby\",\n\t\t\t\"diamond\",\n\t\t\t\"jewelry\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t40\n\t\t]\n\t}\n};\nvar aliases = {\n\tsatisfied: \"laughing\",\n\tgrinning_face_with_star_eyes: \"star-struck\",\n\tface_with_one_eyebrow_raised: \"face_with_raised_eyebrow\",\n\ttelephone: \"phone\",\n\tcooking: \"fried_egg\",\n\tpaw_prints: \"feet\",\n\t\"flag-cn\": \"cn\",\n\tlantern: \"izakaya_lantern\",\n\tshocked_face_with_exploding_head: \"exploding_head\",\n\topen_book: \"book\",\n\t\"flag-de\": \"de\",\n\tgrinning_face_with_one_large_and_one_small_eye: \"zany_face\",\n\tserious_face_with_symbols_covering_mouth: \"face_with_symbols_on_mouth\",\n\tflipper: \"dolphin\",\n\tface_with_open_mouth_vomiting: \"face_vomiting\",\n\t\"flag-es\": \"es\",\n\tface_with_finger_covering_closed_lips: \"shushing_face\",\n\tsmiling_face_with_smiling_eyes_and_hand_covering_mouth: \"face_with_hand_over_mouth\",\n\t\"flag-fr\": \"fr\",\n\thoneybee: \"bee\",\n\tred_car: \"car\",\n\tenvelope: \"email\",\n\tuk: \"gb\",\n\t\"flag-gb\": \"gb\",\n\tpoop: \"hankey\",\n\tshit: \"hankey\",\n\tstaff_of_aesculapius: \"medical_symbol\",\n\tknife: \"hocho\",\n\tsailboat: \"boat\",\n\tpencil: \"memo\",\n\t\"flag-it\": \"it\",\n\t\"flag-jp\": \"jp\",\n\theavy_exclamation_mark: \"exclamation\",\n\t\"flag-kr\": \"kr\",\n\twaxing_gibbous_moon: \"moon\",\n\tmother_christmas: \"mrs_claus\",\n\tsun_small_cloud: \"mostly_sunny\",\n\tsun_behind_cloud: \"barely_sunny\",\n\tsun_behind_rain_cloud: \"partly_sunny_rain\",\n\tlightning_cloud: \"lightning\",\n\ttornado_cloud: \"tornado\",\n\t\"flag-ru\": \"ru\",\n\trunning: \"runner\",\n\t\"flag-us\": \"us\",\n\tman_and_woman_holding_hands: \"couple\",\n\t\"man-woman-boy\": \"family\",\n\tfamily: \"man-woman-boy\",\n\treversed_hand_with_middle_finger_extended: \"middle_finger\",\n\thand_with_index_and_middle_fingers_crossed: \"crossed_fingers\",\n\tsign_of_the_horns: \"the_horns\",\n\traised_hand: \"hand\",\n\tthumbsup: \"+1\",\n\tthumbsdown: \"-1\",\n\tpunch: \"facepunch\",\n\tcollision: \"boom\",\n\ttshirt: \"shirt\",\n\tshoe: \"mans_shoe\"\n};\nvar data = {\n\tcompressed: compressed,\n\tcategories: categories,\n\temojis: emojis,\n\taliases: aliases\n};\n\nfunction _classCallCheck (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError('Cannot call a class as a function');\n  }\n}\n\nvar _Object = Object;\n\nvar _createClass = (function createClass() {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if ('value' in descriptor) descriptor.writable = true;\n      _Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n})();\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n    hasDontEnumBug = !{ toString: null }.propertyIsEnumerable('toString'),\n    dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],\n    dontEnumsLength = dontEnums.length;\n\nfunction _Object$keys (obj) {\n  if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {\n    throw new TypeError('Object.keys called on non-object');\n  }\n\n  var result = [],\n      prop,\n      i;\n\n  for (prop in obj) {\n    if (hasOwnProperty.call(obj, prop)) {\n      result.push(prop);\n    }\n  }\n\n  if (hasDontEnumBug) {\n    for (i = 0; i < dontEnumsLength; i++) {\n      if (hasOwnProperty.call(obj, dontEnums[i])) {\n        result.push(dontEnums[i]);\n      }\n    }\n  }\n  return result;\n}\n\nvar mapping = {\n  name: 'a',\n  unified: 'b',\n  non_qualified: 'c',\n  has_img_apple: 'd',\n  has_img_google: 'e',\n  has_img_twitter: 'f',\n  has_img_emojione: 'g',\n  has_img_facebook: 'h',\n  has_img_messenger: 'i',\n  keywords: 'j',\n  sheet: 'k',\n  emoticons: 'l',\n  text: 'm',\n  short_names: 'n',\n  added_in: 'o'\n};\n\nvar buildSearch = function buildSearch(emoji) {\n  var search = [];\n\n  var addToSearch = function addToSearch(strings, split) {\n    if (!strings) {\n      return;\n    }\n(Array.isArray(strings) ? strings : [strings]).forEach(function (string) {\n(split ? string.split(/[-|_|\\s]+/) : [string]).forEach(function (s) {\n        s = s.toLowerCase();\n\n        if (search.indexOf(s) == -1) {\n          search.push(s);\n        }\n      });\n    });\n  };\n\n  addToSearch(emoji.short_names, true);\n  addToSearch(emoji.name, true);\n  addToSearch(emoji.keywords, false);\n  addToSearch(emoji.emoticons, false);\n\n  return search.join(',');\n};\n\nvar uncompress = function uncompress(data) {\n  data.compressed = false;\n\n  for (var id in data.emojis) {\n    var emoji = data.emojis[id];\n\n    for (var key in mapping) {\n      emoji[key] = emoji[mapping[key]];\n      delete emoji[mapping[key]];\n    }\n\n    if (!emoji.short_names) emoji.short_names = [];\n    emoji.short_names.unshift(id);\n\n    emoji.sheet_x = emoji.sheet[0];\n    emoji.sheet_y = emoji.sheet[1];\n    delete emoji.sheet;\n\n    if (!emoji.text) emoji.text = '';\n\n    if (!emoji.added_in) emoji.added_in = 6;\n    emoji.added_in = emoji.added_in.toFixed(1);\n\n    emoji.search = buildSearch(emoji);\n  }\n};\n\nvar _String = String;\n\nvar stringFromCodePoint = _String.fromCodePoint || function stringFromCodePoint() {\n  var MAX_SIZE = 0x4000;\n  var codeUnits = [];\n  var highSurrogate;\n  var lowSurrogate;\n  var index = -1;\n  var length = arguments.length;\n  if (!length) {\n    return '';\n  }\n  var result = '';\n  while (++index < length) {\n    var codePoint = Number(arguments[index]);\n    if (!isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n    codePoint < 0 || // not a valid Unicode code point\n    codePoint > 0x10ffff || // not a valid Unicode code point\n    Math.floor(codePoint) != codePoint // not an integer\n    ) {\n        throw RangeError('Invalid code point: ' + codePoint);\n      }\n    if (codePoint <= 0xffff) {\n      // BMP code point\n      codeUnits.push(codePoint);\n    } else {\n      // Astral code point; split in surrogate halves\n      // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n      codePoint -= 0x10000;\n      highSurrogate = (codePoint >> 10) + 0xd800;\n      lowSurrogate = codePoint % 0x400 + 0xdc00;\n      codeUnits.push(highSurrogate, lowSurrogate);\n    }\n    if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n      result += String.fromCharCode.apply(null, codeUnits);\n      codeUnits.length = 0;\n    }\n  }\n  return result;\n};\n\nvar _JSON = JSON;\n\nvar COLONS_REGEX = /^(?:\\:([^\\:]+)\\:)(?:\\:skin-tone-(\\d)\\:)?$/;\nvar SKINS = ['1F3FA', '1F3FB', '1F3FC', '1F3FD', '1F3FE', '1F3FF'];\n\nfunction unifiedToNative(unified) {\n  var unicodes = unified.split('-'),\n      codePoints = unicodes.map(function (u) {\n    return '0x' + u;\n  });\n\n  return stringFromCodePoint.apply(null, codePoints);\n}\n\nfunction sanitize(emoji) {\n  var name = emoji.name;\n  var short_names = emoji.short_names;\n  var skin_tone = emoji.skin_tone;\n  var skin_variations = emoji.skin_variations;\n  var emoticons = emoji.emoticons;\n  var unified = emoji.unified;\n  var custom = emoji.custom;\n  var imageUrl = emoji.imageUrl;\n  var id = emoji.id || short_names[0];\n  var colons = ':' + id + ':';\n\n  if (custom) {\n    return {\n      id: id,\n      name: name,\n      short_names: short_names,\n      colons: colons,\n      emoticons: emoticons,\n      custom: custom,\n      imageUrl: imageUrl\n    };\n  }\n\n  if (skin_tone) {\n    colons += ':skin-tone-' + skin_tone + ':';\n  }\n\n  return {\n    id: id,\n    name: name,\n    short_names: short_names,\n    colons: colons,\n    emoticons: emoticons,\n    unified: unified.toLowerCase(),\n    skin: skin_tone || (skin_variations ? 1 : null),\n    native: unifiedToNative(unified)\n  };\n}\n\nfunction getSanitizedData() {\n  return sanitize(getData.apply(undefined, arguments));\n}\n\nfunction getData(emoji, skin, set, data) {\n  var emojiData = {};\n\n  if (typeof emoji == 'string') {\n    var matches = emoji.match(COLONS_REGEX);\n\n    if (matches) {\n      emoji = matches[1];\n\n      if (matches[2]) {\n        skin = parseInt(matches[2], 10);\n      }\n    }\n\n    if (data.aliases.hasOwnProperty(emoji)) {\n      emoji = data.aliases[emoji];\n    }\n\n    if (data.emojis.hasOwnProperty(emoji)) {\n      emojiData = data.emojis[emoji];\n    } else {\n      return null;\n    }\n  } else if (emoji.id) {\n    if (data.aliases.hasOwnProperty(emoji.id)) {\n      emoji.id = data.aliases[emoji.id];\n    }\n\n    if (data.emojis.hasOwnProperty(emoji.id)) {\n      emojiData = data.emojis[emoji.id];\n      skin || (skin = emoji.skin);\n    }\n  }\n\n  if (!_Object$keys(emojiData).length) {\n    emojiData = emoji;\n    emojiData.custom = true;\n\n    if (!emojiData.search) {\n      emojiData.search = buildSearch(emoji);\n    }\n  }\n\n  emojiData.emoticons || (emojiData.emoticons = []);\n  emojiData.variations || (emojiData.variations = []);\n\n  if (emojiData.skin_variations && skin > 1) {\n    emojiData = JSON.parse(_JSON.stringify(emojiData));\n\n    var skinKey = SKINS[skin - 1],\n        variationData = emojiData.skin_variations[skinKey];\n\n    if (!variationData.variations && emojiData.variations) {\n      delete emojiData.variations;\n    }\n\n    if (set && (variationData['has_img_' + set] == undefined || variationData['has_img_' + set]) || !set) {\n      emojiData.skin_tone = skin;\n\n      for (var k in variationData) {\n        var v = variationData[k];\n        emojiData[k] = v;\n      }\n    }\n  }\n\n  if (emojiData.variations && emojiData.variations.length) {\n    emojiData = JSON.parse(_JSON.stringify(emojiData));\n    emojiData.unified = emojiData.variations.shift();\n  }\n\n  return emojiData;\n}\n\nfunction uniq(arr) {\n  return arr.reduce(function (acc, item) {\n    if (acc.indexOf(item) === -1) {\n      acc.push(item);\n    }\n    return acc;\n  }, []);\n}\n\nfunction intersect(a, b) {\n  var uniqA = uniq(a);\n  var uniqB = uniq(b);\n\n  return uniqA.filter(function (item) {\n    return uniqB.indexOf(item) >= 0;\n  });\n}\n\nfunction deepMerge(a, b) {\n  var o = {};\n\n  for (var key in a) {\n    var originalValue = a[key],\n        value = originalValue;\n\n    if (b.hasOwnProperty(key)) {\n      value = b[key];\n    }\n\n    if (typeof value === 'object') {\n      value = deepMerge(originalValue, value);\n    }\n\n    o[key] = value;\n  }\n\n  return o;\n}\n\n// https://github.com/sonicdoe/measure-scrollbar\nfunction measureScrollbar() {\n  if (typeof document == 'undefined') return 0;\n  var div = document.createElement('div');\n\n  div.style.width = '100px';\n  div.style.height = '100px';\n  div.style.overflow = 'scroll';\n  div.style.position = 'absolute';\n  div.style.top = '-9999px';\n\n  document.body.appendChild(div);\n  var scrollbarWidth = div.offsetWidth - div.clientWidth;\n  document.body.removeChild(div);\n\n  return scrollbarWidth;\n}\n\n// Use requestIdleCallback() if available, else fall back to setTimeout().\n// Throttle so as not to run too frequently.\nfunction throttleIdleTask(func) {\n  var doIdleTask = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n  var running = false;\n\n  return function throttled() {\n    if (running) {\n      return;\n    }\n    running = true;\n    doIdleTask(function () {\n      running = false;\n      func();\n    });\n  };\n}\n\nvar NAMESPACE = 'emoji-mart';\n\nvar _JSON$1 = JSON;\n\nvar isLocalStorageSupported = typeof window !== 'undefined' && 'localStorage' in window;\n\nvar getter = void 0;\nvar setter = void 0;\n\nfunction setHandlers(handlers) {\n  handlers || (handlers = {});\n\n  getter = handlers.getter;\n  setter = handlers.setter;\n}\n\nfunction setNamespace(namespace) {\n  NAMESPACE = namespace;\n}\n\nfunction update(state) {\n  for (var key in state) {\n    var value = state[key];\n    set(key, value);\n  }\n}\n\nfunction set(key, value) {\n  if (setter) {\n    setter(key, value);\n  } else {\n    if (!isLocalStorageSupported) return;\n    try {\n      window.localStorage[NAMESPACE + '.' + key] = _JSON$1.stringify(value);\n    } catch (e) {}\n  }\n}\n\nfunction get(key) {\n  if (getter) {\n    return getter(key);\n  } else {\n    if (!isLocalStorageSupported) return;\n    try {\n      var value = window.localStorage[NAMESPACE + '.' + key];\n    } catch (e) {\n      return;\n    }\n\n    if (value) {\n      return JSON.parse(value);\n    }\n  }\n}\n\nvar store = { update: update, set: set, get: get, setNamespace: setNamespace, setHandlers: setHandlers };\n\nvar NimbleEmojiIndex = function () {\n  function NimbleEmojiIndex(data, set) {\n    _classCallCheck(this, NimbleEmojiIndex);\n\n    if (data.compressed) {\n      uncompress(data);\n    }\n\n    this.data = data || {};\n    this.set = set || null;\n    this.originalPool = {};\n    this.index = {};\n    this.emojis = {};\n    this.emoticons = {};\n    this.customEmojisList = [];\n\n    this.buildIndex();\n  }\n\n  _createClass(NimbleEmojiIndex, [{\n    key: 'buildIndex',\n    value: function buildIndex() {\n      var _this = this;\n\n      var _loop = function _loop(emoji) {\n        var emojiData = _this.data.emojis[emoji];\n        var short_names = emojiData.short_names;\n        var emoticons = emojiData.emoticons;\n        var skin_variations = emojiData.skin_variations;\n        var id = short_names[0];\n\n        if (emoticons) {\n          emoticons.forEach(function (emoticon) {\n            if (_this.emoticons[emoticon]) {\n              return;\n            }\n\n            _this.emoticons[emoticon] = id;\n          });\n        }\n\n        // If skin variations include them\n        if (skin_variations) {\n          _this.emojis[id] = {};\n          for (var skinTone = 1; skinTone <= 6; skinTone++) {\n            _this.emojis[id][skinTone] = getSanitizedData({ id: id, skin: skinTone }, skinTone, _this.set, _this.data);\n          }\n        } else {\n          _this.emojis[id] = getSanitizedData(id, null, _this.set, _this.data);\n        }\n\n        _this.originalPool[id] = emojiData;\n      };\n\n      for (var emoji in this.data.emojis) {\n        _loop(emoji);\n      }\n    }\n  }, {\n    key: 'clearCustomEmojis',\n    value: function clearCustomEmojis(pool) {\n      var _this2 = this;\n\n      this.customEmojisList.forEach(function (emoji) {\n        var emojiId = emoji.id || emoji.short_names[0];\n\n        delete pool[emojiId];\n        delete _this2.emojis[emojiId];\n      });\n    }\n  }, {\n    key: 'addCustomToPool',\n    value: function addCustomToPool(custom, pool) {\n      var _this3 = this;\n\n      if (this.customEmojisList.length) this.clearCustomEmojis(pool);\n\n      custom.forEach(function (emoji) {\n        var emojiId = emoji.id || emoji.short_names[0];\n\n        if (emojiId && !pool[emojiId]) {\n          pool[emojiId] = getData(emoji, null, null, _this3.data);\n          _this3.emojis[emojiId] = getSanitizedData(emoji, null, null, _this3.data);\n        }\n      });\n\n      this.customEmojisList = custom;\n      this.index = {};\n    }\n  }, {\n    key: 'search',\n    value: function search(value) {\n      var _this4 = this;\n\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var emojisToShowFilter = _ref.emojisToShowFilter;\n      var maxResults = _ref.maxResults;\n      var include = _ref.include;\n      var exclude = _ref.exclude;\n      var _ref$custom = _ref.custom;\n      var custom = _ref$custom === undefined ? [] : _ref$custom;\n\n      if (this.customEmojisList != custom) this.addCustomToPool(custom, this.originalPool);\n\n      var skinTone = store.get('skin') || 1;\n\n      maxResults || (maxResults = 75);\n      include || (include = []);\n      exclude || (exclude = []);\n\n      var results = null,\n          pool = this.originalPool;\n\n      if (value.length) {\n        if (value == '-' || value == '-1') {\n          return [this.emojis['-1'][skinTone]];\n        }\n\n        var values = value.toLowerCase().split(/[\\s|,|\\-|_]+/),\n            allResults = [];\n\n        if (values.length > 2) {\n          values = [values[0], values[1]];\n        }\n\n        if (include.length || exclude.length) {\n          pool = {};\n\n          this.data.categories.forEach(function (category) {\n            var isIncluded = include && include.length ? include.indexOf(category.id) > -1 : true;\n            var isExcluded = exclude && exclude.length ? exclude.indexOf(category.id) > -1 : false;\n            if (!isIncluded || isExcluded) {\n              return;\n            }\n\n            category.emojis.forEach(function (emojiId) {\n              return pool[emojiId] = _this4.data.emojis[emojiId];\n            });\n          });\n\n          if (custom.length) {\n            var customIsIncluded = include && include.length ? include.indexOf('custom') > -1 : true;\n            var customIsExcluded = exclude && exclude.length ? exclude.indexOf('custom') > -1 : false;\n            if (customIsIncluded && !customIsExcluded) {\n              this.addCustomToPool(custom, pool);\n            }\n          }\n        }\n\n        allResults = values.map(function (value) {\n          var aPool = pool,\n              aIndex = _this4.index,\n              length = 0;\n\n          for (var charIndex = 0; charIndex < value.length; charIndex++) {\n            var char = value[charIndex];\n            length++;\n\n            aIndex[char] || (aIndex[char] = {});\n            aIndex = aIndex[char];\n\n            if (!aIndex.results) {\n              (function () {\n                var scores = {};\n\n                aIndex.results = [];\n                aIndex.pool = {};\n\n                for (var _id in aPool) {\n                  var emoji = aPool[_id];\n                  var search = emoji.search;\n                  var sub = value.substr(0, length);\n                  var subIndex = search.indexOf(sub);\n\n                  if (subIndex != -1) {\n                    var score = subIndex + 1;\n                    if (sub == _id) score = 0;\n\n                    if (_this4.emojis[_id] && _this4.emojis[_id][skinTone]) {\n                      aIndex.results.push(_this4.emojis[_id][skinTone]);\n                    } else {\n                      aIndex.results.push(_this4.emojis[_id]);\n                    }\n                    aIndex.pool[_id] = emoji;\n\n                    scores[_id] = score;\n                  }\n                }\n\n                aIndex.results.sort(function (a, b) {\n                  var aScore = scores[a.id],\n                      bScore = scores[b.id];\n\n                  return aScore - bScore;\n                });\n              })();\n            }\n\n            aPool = aIndex.pool;\n          }\n\n          return aIndex.results;\n        }).filter(function (a) {\n          return a;\n        });\n\n        if (allResults.length > 1) {\n          results = intersect.apply(null, allResults);\n        } else if (allResults.length) {\n          results = allResults[0];\n        } else {\n          results = [];\n        }\n      }\n\n      if (results) {\n        if (emojisToShowFilter) {\n          results = results.filter(function (result) {\n            return emojisToShowFilter(pool[result.id]);\n          });\n        }\n\n        if (results && results.length > maxResults) {\n          results = results.slice(0, maxResults);\n        }\n      }\n\n      return results;\n    }\n  }]);\n\n  return NimbleEmojiIndex;\n}();\n\nvar emojiIndex = new NimbleEmojiIndex(data);\n\nvar DEFAULTS = ['+1', 'grinning', 'kissing_heart', 'heart_eyes', 'laughing', 'stuck_out_tongue_winking_eye', 'sweat_smile', 'joy', 'scream', 'disappointed', 'unamused', 'weary', 'sob', 'sunglasses', 'heart', 'poop'];\n\nvar frequently = void 0,\n    initialized = void 0;\nvar defaults = {};\n\nfunction init() {\n  initialized = true;\n  frequently = store.get('frequently');\n}\n\nfunction add(emoji) {\n  if (!initialized) init();\n  var id = emoji.id;\n\n\n  frequently || (frequently = defaults);\n  frequently[id] || (frequently[id] = 0);\n  frequently[id] += 1;\n\n  store.set('last', id);\n  store.set('frequently', frequently);\n}\n\nfunction get$1(perLine) {\n  if (!initialized) init();\n  if (!frequently) {\n    defaults = {};\n\n    var result = [];\n\n    for (var i = 0; i < perLine; i++) {\n      defaults[DEFAULTS[i]] = perLine - i;\n      result.push(DEFAULTS[i]);\n    }\n\n    return result;\n  }\n\n  var quantity = perLine * 4;\n  var frequentlyKeys = [];\n\n  for (var key in frequently) {\n    if (frequently.hasOwnProperty(key)) {\n      frequentlyKeys.push(key);\n    }\n  }\n\n  var sorted = frequentlyKeys.sort(function (a, b) {\n    return frequently[a] - frequently[b];\n  }).reverse();\n  var sliced = sorted.slice(0, quantity);\n\n  var last = store.get('last');\n\n  if (last && sliced.indexOf(last) == -1) {\n    sliced.pop();\n    sliced.push(last);\n  }\n\n  return sliced;\n}\n\nvar frequently$1 = { add: add, get: get$1 };\n\nvar _Object$1 = Object;\n\nvar _extends = _Object$1.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\nvar _Object$2 = Object;\n\nvar _Object$getPrototypeOf = _Object$2.getPrototypeOf || function (O) {\n  O = Object(O);\n\n  if (typeof O.constructor === 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  }\n\n  return O instanceof Object ? Object.prototype : null;\n};\n\nfunction possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n}\n\nvar _Object$3 = Object;\n\nfunction inherits(subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n  }\n\n  subClass.prototype = _Object$3.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) {\n    _Object$3.setPrototypeOf ? _Object$3.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n  }\n}\n\n// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel\n\n// MIT license\n\nvar isWindowAvailable = typeof window !== 'undefined';\n\nisWindowAvailable && function () {\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n\n    lastTime = currTime + timeToCall;\n    return id;\n  };\n\n  if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {\n    clearTimeout(id);\n  };\n}();\n\nvar categories$1 = {\n  activity: function activity() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113\" })\n    );\n  },\n\n  custom: function custom() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        \"g\",\n        { transform: \"translate(2.000000, 1.000000)\" },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", { id: \"Rectangle\", x: \"8\", y: \"0\", width: \"3\", height: \"21\", rx: \"1.5\" }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", {\n          id: \"Rectangle\",\n          transform: \"translate(9.843, 10.549) rotate(60) translate(-9.843, -10.549) \",\n          x: \"8.343\",\n          y: \"0.049\",\n          width: \"3\",\n          height: \"21\",\n          rx: \"1.5\"\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", {\n          id: \"Rectangle\",\n          transform: \"translate(9.843, 10.549) rotate(-60) translate(-9.843, -10.549) \",\n          x: \"8.343\",\n          y: \"0.049\",\n          width: \"3\",\n          height: \"21\",\n          rx: \"1.5\"\n        })\n      )\n    );\n  },\n\n  flags: function flags() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z\" })\n    );\n  },\n\n  foods: function foods() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9\" })\n    );\n  },\n\n  nature: function nature() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235\" })\n    );\n  },\n\n  objects: function objects() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789\" })\n    );\n  },\n\n  people: function people() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0\" })\n    );\n  },\n\n  places: function places() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z\" })\n    );\n  },\n\n  recent: function recent() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\" })\n    );\n  },\n\n  symbols: function symbols() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76\" })\n    );\n  }\n};\n\nvar search$1 = {\n  search: function search() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"13\",\n        height: \"13\",\n        viewBox: \"0 0 20 20\",\n        opacity: \"0.5\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" })\n    );\n  },\n\n  delete: function _delete() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"13\",\n        height: \"13\",\n        viewBox: \"0 0 20 20\",\n        opacity: \"0.5\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z\" })\n    );\n  }\n};\n\nvar icons = /*#__PURE__*/Object.freeze({\n  categories: categories$1,\n  search: search$1\n});\n\nvar EmojiPropTypes = {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  onOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  fallback: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  backgroundImageFn: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  forceSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  tooltip: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([1, 2, 3, 4, 5, 6]),\n  sheetSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([16, 20, 32, 64]),\n  sheetColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  sheetRows: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  set: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['apple', 'google', 'twitter', 'emojione', 'messenger', 'facebook']),\n  size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object]).isRequired\n};\n\nvar PickerPropTypes = {\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onSelect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onSkinChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  perLine: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  emojiSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n  style: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n  title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  color: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  set: EmojiPropTypes.set,\n  skin: EmojiPropTypes.skin,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  backgroundImageFn: EmojiPropTypes.backgroundImageFn,\n  sheetSize: EmojiPropTypes.sheetSize,\n  emojisToShowFilter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  showPreview: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  showSkinTones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  emojiTooltip: EmojiPropTypes.tooltip,\n  include: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  exclude: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  recent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  custom: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n    name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n    short_names: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string).isRequired,\n    emoticons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n    keywords: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n    imageUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n    spriteUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n    sheet_x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheet_y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheetColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheetRows: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n  })),\n  skinEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  notFoundEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nvar Anchors = function (_React$PureComponent) {\n  inherits(Anchors, _React$PureComponent);\n\n  function Anchors(props) {\n    _classCallCheck(this, Anchors);\n\n    var _this = possibleConstructorReturn(this, (Anchors.__proto__ || _Object$getPrototypeOf(Anchors)).call(this, props));\n\n    var defaultCategory = props.categories.filter(function (category) {\n      return category.first;\n    })[0];\n\n    _this.state = {\n      selected: defaultCategory.name\n    };\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    return _this;\n  }\n\n  _createClass(Anchors, [{\n    key: 'handleClick',\n    value: function handleClick(e) {\n      var index = e.currentTarget.getAttribute('data-index');\n      var _props = this.props;\n      var categories = _props.categories;\n      var onAnchorClick = _props.onAnchorClick;\n\n\n      onAnchorClick(categories[index], index);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props2 = this.props;\n      var categories = _props2.categories;\n      var color = _props2.color;\n      var i18n = _props2.i18n;\n      var icons = _props2.icons;\n      var selected = this.state.selected;\n\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'nav',\n        { className: 'emoji-mart-anchors', 'aria-label': i18n.categorieslabel },\n        categories.map(function (category, i) {\n          var id = category.id;\n          var name = category.name;\n          var anchor = category.anchor;\n          var isSelected = name == selected;\n\n          if (anchor === false) {\n            return null;\n          }\n\n          return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'button',\n            {\n              key: id,\n              'aria-label': i18n.categories[id],\n              title: i18n.categories[id],\n              'data-index': i,\n              type: 'button',\n              onClick: _this2.handleClick,\n              className: 'emoji-mart-anchor ' + (isSelected ? 'emoji-mart-anchor-selected' : ''),\n              style: { color: isSelected ? color : null }\n            },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-anchor-icon' },\n              icons.categories[id]()\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', {\n              className: 'emoji-mart-anchor-bar',\n              style: { backgroundColor: color }\n            })\n          );\n        })\n      );\n    }\n  }]);\n\n  return Anchors;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nAnchors.propTypes /* remove-proptypes */ = {\n  categories: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n  onAnchorClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nAnchors.defaultProps = {\n  categories: [],\n  onAnchorClick: function onAnchorClick() {},\n  icons: {}\n};\n\nvar EmojiDefaultProps = {\n  skin: 1,\n  set: 'apple',\n  sheetSize: 64,\n  sheetColumns: 52,\n  sheetRows: 52,\n  native: false,\n  forceSize: false,\n  tooltip: false,\n  backgroundImageFn: function backgroundImageFn(set, sheetSize) {\n    return 'https://unpkg.com/emoji-datasource-' + set + '@' + '4.0.4' + '/img/' + set + '/sheets-256/' + sheetSize + '.png';\n  }\n};\n\nvar PickerDefaultProps = {\n  onClick: function onClick() {},\n  onSelect: function onSelect() {},\n  onSkinChange: function onSkinChange() {},\n  emojiSize: 24,\n  perLine: 9,\n  i18n: {},\n  style: {},\n  title: 'Emoji Mart™',\n  emoji: 'department_store',\n  color: '#ae65c5',\n  set: EmojiDefaultProps.set,\n  skin: null,\n  defaultSkin: EmojiDefaultProps.skin,\n  native: EmojiDefaultProps.native,\n  sheetSize: EmojiDefaultProps.sheetSize,\n  backgroundImageFn: EmojiDefaultProps.backgroundImageFn,\n  emojisToShowFilter: null,\n  showPreview: true,\n  showSkinTones: true,\n  emojiTooltip: EmojiDefaultProps.tooltip,\n  autoFocus: false,\n  custom: [],\n  skinEmoji: '',\n  notFound: function notFound() {},\n  notFoundEmoji: 'sleuth_or_spy',\n  icons: {}\n};\n\nvar _getData = function _getData(props) {\n  var emoji = props.emoji;\n  var skin = props.skin;\n  var set = props.set;\n  var data = props.data;\n\n  return getData(emoji, skin, set, data);\n};\n\nvar _getPosition = function _getPosition(props) {\n  var _getData2 = _getData(props);\n\n  var sheet_x = _getData2.sheet_x;\n  var sheet_y = _getData2.sheet_y;\n  var multiplyX = 100 / (props.sheetColumns - 1);\n  var multiplyY = 100 / (props.sheetRows - 1);\n\n  return multiplyX * sheet_x + '% ' + multiplyY * sheet_y + '%';\n};\n\nvar _getSanitizedData = function _getSanitizedData(props) {\n  var emoji = props.emoji;\n  var skin = props.skin;\n  var set = props.set;\n  var data = props.data;\n\n  return getSanitizedData(emoji, skin, set, data);\n};\n\nvar _handleClick = function _handleClick(e, props) {\n  if (!props.onClick) {\n    return;\n  }\n  var onClick = props.onClick;\n  var emoji = _getSanitizedData(props);\n\n  onClick(emoji, e);\n};\n\nvar _handleOver = function _handleOver(e, props) {\n  if (!props.onOver) {\n    return;\n  }\n  var onOver = props.onOver;\n  var emoji = _getSanitizedData(props);\n\n  onOver(emoji, e);\n};\n\nvar _handleLeave = function _handleLeave(e, props) {\n  if (!props.onLeave) {\n    return;\n  }\n  var onLeave = props.onLeave;\n  var emoji = _getSanitizedData(props);\n\n  onLeave(emoji, e);\n};\n\nvar _isNumeric = function _isNumeric(value) {\n  return !isNaN(value - parseFloat(value));\n};\n\nvar _convertStyleToCSS = function _convertStyleToCSS(style) {\n  var div = document.createElement('div');\n\n  for (var key in style) {\n    var value = style[key];\n\n    if (_isNumeric(value)) {\n      value += 'px';\n    }\n\n    div.style[key] = value;\n  }\n\n  return div.getAttribute('style');\n};\n\nvar NimbleEmoji = function NimbleEmoji(props) {\n  if (props.data.compressed) {\n    uncompress(props.data);\n  }\n\n  for (var k in NimbleEmoji.defaultProps) {\n    if (props[k] == undefined && NimbleEmoji.defaultProps[k] != undefined) {\n      props[k] = NimbleEmoji.defaultProps[k];\n    }\n  }\n\n  var data = _getData(props);\n  if (!data) {\n    if (props.fallback) {\n      return props.fallback(null, props);\n    } else {\n      return null;\n    }\n  }\n\n  var unified = data.unified;\n  var custom = data.custom;\n  var short_names = data.short_names;\n  var imageUrl = data.imageUrl;\n  var style = {};\n  var children = props.children;\n  var className = 'emoji-mart-emoji';\n  var nativeEmoji = unified && unifiedToNative(unified);\n  // combine the emoji itself and all shortcodes into an accessible label\n  var label = [nativeEmoji].concat(short_names).filter(Boolean).join(', ');\n  var title = null;\n\n  if (!unified && !custom) {\n    if (props.fallback) {\n      return props.fallback(data, props);\n    } else {\n      return null;\n    }\n  }\n\n  if (props.tooltip) {\n    title = short_names[0];\n  }\n\n  if (props.native && unified) {\n    className += ' emoji-mart-emoji-native';\n    style = { fontSize: props.size };\n    children = nativeEmoji;\n\n    if (props.forceSize) {\n      style.display = 'inline-block';\n      style.width = props.size;\n      style.height = props.size;\n      style.wordBreak = 'keep-all';\n    }\n  } else if (custom) {\n    className += ' emoji-mart-emoji-custom';\n    style = {\n      width: props.size,\n      height: props.size,\n      display: 'inline-block'\n    };\n    if (data.spriteUrl) {\n      style = _extends({}, style, {\n        backgroundImage: 'url(' + data.spriteUrl + ')',\n        backgroundSize: 100 * props.sheetColumns + '% ' + 100 * props.sheetRows + '%',\n        backgroundPosition: _getPosition(props)\n      });\n    } else {\n      style = _extends({}, style, {\n        backgroundImage: 'url(' + imageUrl + ')',\n        backgroundSize: 'contain'\n      });\n    }\n  } else {\n    var setHasEmoji = data['has_img_' + props.set] == undefined || data['has_img_' + props.set];\n\n    if (!setHasEmoji) {\n      if (props.fallback) {\n        return props.fallback(data, props);\n      } else {\n        return null;\n      }\n    } else {\n      style = {\n        width: props.size,\n        height: props.size,\n        display: 'inline-block',\n        backgroundImage: 'url(' + props.backgroundImageFn(props.set, props.sheetSize) + ')',\n        backgroundSize: 100 * props.sheetColumns + '% ' + 100 * props.sheetRows + '%',\n        backgroundPosition: _getPosition(props)\n      };\n    }\n  }\n\n  var Tag = {\n    name: 'span',\n    props: {}\n  };\n\n  if (props.onClick) {\n    Tag.name = 'button';\n    Tag.props = {\n      type: 'button'\n    };\n  }\n\n  if (props.html) {\n    style = _convertStyleToCSS(style);\n    return '<' + Tag.name + ' style=\\'' + style + '\\' aria-label=\\'' + label + '\\' ' + (title ? 'title=\\'' + title + '\\'' : '') + ' class=\\'' + className + '\\'>' + (children || '') + '</' + Tag.name + '>';\n  } else {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      Tag.name,\n      _extends({\n        onClick: function onClick(e) {\n          return _handleClick(e, props);\n        },\n        onMouseEnter: function onMouseEnter(e) {\n          return _handleOver(e, props);\n        },\n        onMouseLeave: function onMouseLeave(e) {\n          return _handleLeave(e, props);\n        },\n        'aria-label': label,\n        title: title,\n        className: className\n      }, Tag.props),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'span',\n        { style: style },\n        children\n      )\n    );\n  }\n};\n\nNimbleEmoji.propTypes /* remove-proptypes */ = _extends({}, EmojiPropTypes, {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n});\nNimbleEmoji.defaultProps = EmojiDefaultProps;\n\nvar NotFound = function (_React$PureComponent) {\n  inherits(NotFound, _React$PureComponent);\n\n  function NotFound() {\n    _classCallCheck(this, NotFound);\n\n    return possibleConstructorReturn(this, (NotFound.__proto__ || _Object$getPrototypeOf(NotFound)).apply(this, arguments));\n  }\n\n  _createClass(NotFound, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var data = _props.data;\n      var emojiProps = _props.emojiProps;\n      var i18n = _props.i18n;\n      var notFound = _props.notFound;\n      var notFoundEmoji = _props.notFoundEmoji;\n\n\n      var component = notFound && notFound() || react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        { className: 'emoji-mart-no-results' },\n        NimbleEmoji(_extends({\n          data: data\n        }, emojiProps, {\n          size: 38,\n          emoji: notFoundEmoji,\n          onOver: null,\n          onLeave: null,\n          onClick: null\n        })),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-no-results-label' },\n          i18n.notfound\n        )\n      );\n\n      return component;\n    }\n  }]);\n\n  return NotFound;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nNotFound.propTypes /* remove-proptypes */ = {\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n};\n\nvar Category = function (_React$Component) {\n  inherits(Category, _React$Component);\n\n  function Category(props) {\n    _classCallCheck(this, Category);\n\n    var _this = possibleConstructorReturn(this, (Category.__proto__ || _Object$getPrototypeOf(Category)).call(this, props));\n\n    _this.data = props.data;\n    _this.setContainerRef = _this.setContainerRef.bind(_this);\n    _this.setLabelRef = _this.setLabelRef.bind(_this);\n    return _this;\n  }\n\n  _createClass(Category, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.margin = 0;\n      this.minMargin = 0;\n\n      this.memoizeSize();\n    }\n  }, {\n    key: 'shouldComponentUpdate',\n    value: function shouldComponentUpdate(nextProps, nextState) {\n      var _props = this.props;\n      var name = _props.name;\n      var perLine = _props.perLine;\n      var native = _props.native;\n      var hasStickyPosition = _props.hasStickyPosition;\n      var emojis = _props.emojis;\n      var emojiProps = _props.emojiProps;\n      var skin = emojiProps.skin;\n      var size = emojiProps.size;\n      var set = emojiProps.set;\n      var nextPerLine = nextProps.perLine;\n      var nextNative = nextProps.native;\n      var nextHasStickyPosition = nextProps.hasStickyPosition;\n      var nextEmojis = nextProps.emojis;\n      var nextEmojiProps = nextProps.emojiProps;\n      var nextSkin = nextEmojiProps.skin;\n      var nextSize = nextEmojiProps.size;\n      var nextSet = nextEmojiProps.set;\n      var shouldUpdate = false;\n\n      if (name == 'Recent' && perLine != nextPerLine) {\n        shouldUpdate = true;\n      }\n\n      if (name == 'Search') {\n        shouldUpdate = !(emojis == nextEmojis);\n      }\n\n      if (skin != nextSkin || size != nextSize || native != nextNative || set != nextSet || hasStickyPosition != nextHasStickyPosition) {\n        shouldUpdate = true;\n      }\n\n      return shouldUpdate;\n    }\n  }, {\n    key: 'memoizeSize',\n    value: function memoizeSize() {\n      if (!this.container) {\n        // probably this is a test environment, e.g. jest\n        this.top = 0;\n        this.maxMargin = 0;\n        return;\n      }\n      var parent = this.container.parentElement;\n\n      var _container$getBoundin = this.container.getBoundingClientRect();\n\n      var top = _container$getBoundin.top;\n      var height = _container$getBoundin.height;\n\n      var _parent$getBoundingCl = parent.getBoundingClientRect();\n\n      var parentTop = _parent$getBoundingCl.top;\n\n      var _label$getBoundingCli = this.label.getBoundingClientRect();\n\n      var labelHeight = _label$getBoundingCli.height;\n\n\n      this.top = top - parentTop + parent.scrollTop;\n\n      if (height == 0) {\n        this.maxMargin = 0;\n      } else {\n        this.maxMargin = height - labelHeight;\n      }\n    }\n  }, {\n    key: 'handleScroll',\n    value: function handleScroll(scrollTop) {\n      var margin = scrollTop - this.top;\n      margin = margin < this.minMargin ? this.minMargin : margin;\n      margin = margin > this.maxMargin ? this.maxMargin : margin;\n\n      if (margin == this.margin) return;\n\n      if (!this.props.hasStickyPosition) {\n        this.label.style.top = margin + 'px';\n      }\n\n      this.margin = margin;\n      return true;\n    }\n  }, {\n    key: 'getEmojis',\n    value: function getEmojis() {\n      var _this2 = this;\n\n      var _props2 = this.props;\n      var name = _props2.name;\n      var emojis = _props2.emojis;\n      var recent = _props2.recent;\n      var perLine = _props2.perLine;\n\n\n      if (name == 'Recent') {\n        var custom = this.props.custom;\n\n        var frequentlyUsed = recent || frequently$1.get(perLine);\n\n        if (frequentlyUsed.length) {\n          emojis = frequentlyUsed.map(function (id) {\n            var emoji = custom.filter(function (e) {\n              return e.id === id;\n            })[0];\n            if (emoji) {\n              return emoji;\n            }\n\n            return id;\n          }).filter(function (id) {\n            return !!getData(id, null, null, _this2.data);\n          });\n        }\n\n        if (emojis.length === 0 && frequentlyUsed.length > 0) {\n          return null;\n        }\n      }\n\n      if (emojis) {\n        emojis = emojis.slice(0);\n      }\n\n      return emojis;\n    }\n  }, {\n    key: 'updateDisplay',\n    value: function updateDisplay(display) {\n      var emojis = this.getEmojis();\n\n      if (!emojis || !this.container) {\n        return;\n      }\n\n      this.container.style.display = display;\n    }\n  }, {\n    key: 'setContainerRef',\n    value: function setContainerRef(c) {\n      this.container = c;\n    }\n  }, {\n    key: 'setLabelRef',\n    value: function setLabelRef(c) {\n      this.label = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this3 = this;\n\n      var _props3 = this.props;\n      var id = _props3.id;\n      var name = _props3.name;\n      var hasStickyPosition = _props3.hasStickyPosition;\n      var emojiProps = _props3.emojiProps;\n      var i18n = _props3.i18n;\n      var notFound = _props3.notFound;\n      var notFoundEmoji = _props3.notFoundEmoji;\n      var emojis = this.getEmojis();\n      var labelStyles = {};\n      var labelSpanStyles = {};\n      var containerStyles = {};\n\n      if (!emojis) {\n        containerStyles = {\n          display: 'none'\n        };\n      }\n\n      if (!hasStickyPosition) {\n        labelStyles = {\n          height: 28\n        };\n\n        labelSpanStyles = {\n          position: 'absolute'\n        };\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          ref: this.setContainerRef,\n          className: 'emoji-mart-category',\n          'aria-label': i18n.categories[id],\n          style: containerStyles\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            style: labelStyles,\n            'data-name': name,\n            className: 'emoji-mart-category-label'\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'span',\n            {\n              style: labelSpanStyles,\n              ref: this.setLabelRef,\n              'aria-hidden': true /* already labeled by the section aria-label */\n            },\n            i18n.categories[id]\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'ul',\n          { className: 'emoji-mart-category-list' },\n          emojis && emojis.map(function (emoji) {\n            return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'li',\n              { key: emoji.id || emoji },\n              NimbleEmoji(_extends({ emoji: emoji, data: _this3.data }, emojiProps))\n            );\n          })\n        ),\n        emojis && !emojis.length && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(NotFound, {\n          i18n: i18n,\n          notFound: notFound,\n          notFoundEmoji: notFoundEmoji,\n          data: this.data,\n          emojiProps: emojiProps\n        })\n      );\n    }\n  }]);\n\n  return Category;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\nCategory.propTypes /* remove-proptypes */ = {\n  emojis: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n  hasStickyPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,\n  perLine: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  recent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  notFoundEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired\n};\n\nCategory.defaultProps = {\n  emojis: [],\n  hasStickyPosition: true\n};\n\nvar Skins = function (_React$PureComponent) {\n  inherits(Skins, _React$PureComponent);\n\n  function Skins(props) {\n    _classCallCheck(this, Skins);\n\n    var _this = possibleConstructorReturn(this, (Skins.__proto__ || _Object$getPrototypeOf(Skins)).call(this, props));\n\n    _this.state = {\n      opened: false\n    };\n    return _this;\n  }\n\n  _createClass(Skins, [{\n    key: 'handleClick',\n    value: function handleClick(e) {\n      var skin = parseInt(e.currentTarget.getAttribute('data-skin'));\n      var onChange = this.props.onChange;\n\n\n      if (!this.state.opened) {\n        this.setState({ opened: true });\n      } else {\n        this.setState({ opened: false });\n        if (skin != this.props.skin) {\n          onChange(skin);\n        }\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Skins;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nSkins.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired\n};\n\nSkins.defaultProps = {\n  onChange: function onChange() {}\n};\n\nvar SkinsEmoji = function (_Skins) {\n  inherits(SkinsEmoji, _Skins);\n\n  function SkinsEmoji(props) {\n    _classCallCheck(this, SkinsEmoji);\n\n    var _this = possibleConstructorReturn(this, (SkinsEmoji.__proto__ || _Object$getPrototypeOf(SkinsEmoji)).call(this, props));\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    return _this;\n  }\n\n  _createClass(SkinsEmoji, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var skin = _props.skin;\n      var emojiProps = _props.emojiProps;\n      var data = _props.data;\n      var skinEmoji = _props.skinEmoji;\n      var i18n = _props.i18n;\n      var opened = this.state.opened;\n\n      var skinToneNodes = [];\n\n      for (var skinTone = 1; skinTone <= 6; skinTone++) {\n        var selected = skinTone === skin;\n        skinToneNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'span',\n          {\n            key: 'skin-tone-' + skinTone,\n            className: 'emoji-mart-skin-swatch custom' + (selected ? ' selected' : '')\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'span',\n            {\n              onClick: this.handleClick,\n              'data-skin': skinTone,\n              className: 'emoji-mart-skin-tone-' + skinTone\n            },\n            NimbleEmoji({\n              emoji: skinEmoji,\n              data: data,\n              skin: skinTone,\n              backgroundImageFn: emojiProps.backgroundImageFn,\n              native: emojiProps.native,\n              set: emojiProps.set,\n              sheetSize: emojiProps.sheetSize,\n              size: 23\n            })\n          )\n        ));\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        {\n          className: 'emoji-mart-skin-swatches custom' + (opened ? ' opened' : '')\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-skin-text' + (opened ? ' opened' : '') },\n          i18n.skintext\n        ),\n        skinToneNodes\n      );\n    }\n  }]);\n\n  return SkinsEmoji;\n}(Skins);\n\n\nSkinsEmoji.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  skinTone: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  skinEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nSkinsEmoji.defaultProps = {\n  onChange: function onChange() {},\n  skinTone: null\n};\n\nvar SkinsDot = function (_Skins) {\n  inherits(SkinsDot, _Skins);\n\n  function SkinsDot(props) {\n    _classCallCheck(this, SkinsDot);\n\n    var _this = possibleConstructorReturn(this, (SkinsDot.__proto__ || _Object$getPrototypeOf(SkinsDot)).call(this, props));\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    _this.handleKeyDown = _this.handleKeyDown.bind(_this);\n    return _this;\n  }\n\n  _createClass(SkinsDot, [{\n    key: 'handleKeyDown',\n    value: function handleKeyDown(event) {\n      // if either enter or space is pressed, then execute\n      if (event.keyCode === 13 || event.keyCode === 32) {\n        this.handleClick(event);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var skin = _props.skin;\n      var i18n = _props.i18n;\n      var opened = this.state.opened;\n\n      var skinToneNodes = [];\n\n      for (var skinTone = 1; skinTone <= 6; skinTone++) {\n        var selected = skinTone === skin;\n        var visible = opened || selected;\n        skinToneNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'span',\n          _extends({\n            key: 'skin-tone-' + skinTone,\n            className: 'emoji-mart-skin-swatch' + (selected ? ' selected' : ''),\n            'aria-label': i18n.skintones[skinTone],\n            'aria-hidden': !visible\n          }, opened ? { role: 'menuitem' } : {}),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', _extends({\n            onClick: this.handleClick,\n            onKeyDown: this.handleKeyDown,\n            role: 'button'\n          }, selected ? {\n            'aria-haspopup': true,\n            'aria-expanded': !!opened\n          } : {}, opened ? { 'aria-pressed': !!selected } : {}, {\n            tabIndex: visible ? '0' : '',\n            'aria-label': i18n.skintones[skinTone],\n            title: i18n.skintones[skinTone],\n            'data-skin': skinTone,\n            className: 'emoji-mart-skin emoji-mart-skin-tone-' + skinTone\n          }))\n        ));\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          className: 'emoji-mart-skin-swatches' + (opened ? ' opened' : ''),\n          'aria-label': i18n.skintext\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          opened ? { role: 'menubar' } : {},\n          skinToneNodes\n        )\n      );\n    }\n  }]);\n\n  return SkinsDot;\n}(Skins);\n\n\nSkinsDot.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nSkinsDot.defaultProps = {\n  onChange: function onChange() {}\n};\n\nvar Preview = function (_React$PureComponent) {\n  inherits(Preview, _React$PureComponent);\n\n  function Preview(props) {\n    _classCallCheck(this, Preview);\n\n    var _this = possibleConstructorReturn(this, (Preview.__proto__ || _Object$getPrototypeOf(Preview)).call(this, props));\n\n    _this.data = props.data;\n    _this.state = { emoji: null };\n    return _this;\n  }\n\n  _createClass(Preview, [{\n    key: 'render',\n    value: function render() {\n      var emoji = this.state.emoji;\n      var _props = this.props;\n      var emojiProps = _props.emojiProps;\n      var skinsProps = _props.skinsProps;\n      var showSkinTones = _props.showSkinTones;\n      var title = _props.title;\n      var idleEmoji = _props.emoji;\n      var i18n = _props.i18n;\n      var showPreview = _props.showPreview;\n\n\n      if (emoji && showPreview) {\n        var emojiData = getData(emoji, null, null, this.data);\n        var _emojiData$emoticons = emojiData.emoticons;\n        var emoticons = _emojiData$emoticons === undefined ? [] : _emojiData$emoticons;\n        var knownEmoticons = [];\n        var listedEmoticons = [];\n\n        emoticons.forEach(function (emoticon) {\n          if (knownEmoticons.indexOf(emoticon.toLowerCase()) >= 0) {\n            return;\n          }\n\n          knownEmoticons.push(emoticon.toLowerCase());\n          listedEmoticons.push(emoticon);\n        });\n\n        return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-preview' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-emoji', 'aria-hidden': 'true' },\n            NimbleEmoji(_extends({\n              key: emoji.id,\n              emoji: emoji,\n              data: this.data\n            }, emojiProps))\n          ),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-data', 'aria-hidden': 'true' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-name' },\n              emoji.name\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-shortnames' },\n              emojiData.short_names.map(function (short_name) {\n                return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n                  'span',\n                  { key: short_name, className: 'emoji-mart-preview-shortname' },\n                  ':',\n                  short_name,\n                  ':'\n                );\n              })\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-emoticons' },\n              listedEmoticons.map(function (emoticon) {\n                return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n                  'span',\n                  { key: emoticon, className: 'emoji-mart-preview-emoticon' },\n                  emoticon\n                );\n              })\n            )\n          )\n        );\n      } else {\n        return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-preview' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-emoji', 'aria-hidden': 'true' },\n            idleEmoji && idleEmoji.length && NimbleEmoji(_extends({ emoji: idleEmoji, data: this.data }, emojiProps))\n          ),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-data', 'aria-hidden': 'true' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'span',\n              { className: 'emoji-mart-title-label' },\n              title\n            )\n          ),\n          showSkinTones && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            {\n              className: 'emoji-mart-preview-skins' + (skinsProps.skinEmoji ? ' custom' : '')\n            },\n            skinsProps.skinEmoji ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(SkinsEmoji, {\n              skin: skinsProps.skin,\n              emojiProps: emojiProps,\n              data: this.data,\n              skinEmoji: skinsProps.skinEmoji,\n              i18n: i18n,\n              onChange: skinsProps.onChange\n            }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(SkinsDot, {\n              skin: skinsProps.skin,\n              i18n: i18n,\n              onChange: skinsProps.onChange\n            })\n          )\n        );\n      }\n    }\n  }]);\n\n  return Preview;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nPreview.propTypes /* remove-proptypes */ = {\n  showSkinTones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  skinsProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n};\n\nPreview.defaultProps = {\n  showSkinTones: true,\n  onChange: function onChange() {}\n};\n\nvar id = 0;\n\nvar Search = function (_React$PureComponent) {\n  inherits(Search, _React$PureComponent);\n\n  function Search(props) {\n    _classCallCheck(this, Search);\n\n    var _this = possibleConstructorReturn(this, (Search.__proto__ || _Object$getPrototypeOf(Search)).call(this, props));\n\n    _this.state = {\n      icon: search$1.search,\n      isSearching: false,\n      id: ++id\n    };\n\n    _this.data = props.data;\n    _this.emojiIndex = new NimbleEmojiIndex(_this.data);\n    _this.setRef = _this.setRef.bind(_this);\n    _this.clear = _this.clear.bind(_this);\n    _this.handleKeyUp = _this.handleKeyUp.bind(_this);\n\n    // throttle keyboard input so that typing isn't delayed\n    _this.handleChange = throttleIdleTask(_this.handleChange.bind(_this));\n    return _this;\n  }\n\n  _createClass(Search, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      // in some cases (e.g. preact) the input may already be pre-populated\n      // this.input is undefined in Jest tests\n      if (this.input && this.input.value) {\n        this.search(this.input.value);\n      }\n    }\n  }, {\n    key: 'search',\n    value: function search$$1(value) {\n      if (value == '') this.setState({\n        icon: search$1.search,\n        isSearching: false\n      });else this.setState({\n        icon: search$1.delete,\n        isSearching: true\n      });\n\n      this.props.onSearch(this.emojiIndex.search(value, {\n        emojisToShowFilter: this.props.emojisToShowFilter,\n        maxResults: this.props.maxResults,\n        include: this.props.include,\n        exclude: this.props.exclude,\n        custom: this.props.custom\n      }));\n    }\n  }, {\n    key: 'clear',\n    value: function clear() {\n      if (this.input.value == '') return;\n      this.input.value = '';\n      this.input.focus();\n      this.search('');\n    }\n  }, {\n    key: 'handleChange',\n    value: function handleChange() {\n      this.search(this.input.value);\n    }\n  }, {\n    key: 'handleKeyUp',\n    value: function handleKeyUp(e) {\n      if (e.keyCode === 13) {\n        this.clear();\n      }\n    }\n  }, {\n    key: 'setRef',\n    value: function setRef(c) {\n      this.input = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var i18n = _props.i18n;\n      var autoFocus = _props.autoFocus;\n      var _state = this.state;\n      var icon = _state.icon;\n      var isSearching = _state.isSearching;\n      var id = _state.id;\n\n      var inputId = 'emoji-mart-search-' + id;\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        { className: 'emoji-mart-search', 'aria-label': i18n.search },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('input', {\n          id: inputId,\n          ref: this.setRef,\n          type: 'search',\n          onChange: this.handleChange,\n          placeholder: i18n.search,\n          autoFocus: autoFocus\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'label',\n          { className: 'emoji-mart-sr-only', htmlFor: inputId },\n          i18n.search\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'button',\n          {\n            className: 'emoji-mart-search-icon',\n            onClick: this.clear,\n            onKeyUp: this.handleKeyUp,\n            'aria-label': i18n.clear,\n            disabled: !isSearching\n          },\n          icon()\n        )\n      );\n    }\n  }]);\n\n  return Search;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nSearch.propTypes /* remove-proptypes */ = {\n  onSearch: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  maxResults: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  emojisToShowFilter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n};\n\nSearch.defaultProps = {\n  onSearch: function onSearch() {},\n  maxResults: 75,\n  emojisToShowFilter: null,\n  autoFocus: false\n};\n\nvar I18N = {\n  search: 'Search',\n  clear: 'Clear', // Accessible label on \"clear\" button\n  notfound: 'No Emoji Found',\n  skintext: 'Choose your default skin tone',\n  categories: {\n    search: 'Search Results',\n    recent: 'Frequently Used',\n    people: 'Smileys & People',\n    nature: 'Animals & Nature',\n    foods: 'Food & Drink',\n    activity: 'Activity',\n    places: 'Travel & Places',\n    objects: 'Objects',\n    symbols: 'Symbols',\n    flags: 'Flags',\n    custom: 'Custom'\n  },\n  categorieslabel: 'Emoji categories', // Accessible title for the list of categories\n  skintones: {\n    1: 'Default Skin Tone',\n    2: 'Light Skin Tone',\n    3: 'Medium-Light Skin Tone',\n    4: 'Medium Skin Tone',\n    5: 'Medium-Dark Skin Tone',\n    6: 'Dark Skin Tone'\n  }\n};\n\nvar NimblePicker = function (_React$PureComponent) {\n  inherits(NimblePicker, _React$PureComponent);\n\n  function NimblePicker(props) {\n    _classCallCheck(this, NimblePicker);\n\n    var _this = possibleConstructorReturn(this, (NimblePicker.__proto__ || _Object$getPrototypeOf(NimblePicker)).call(this, props));\n\n    _this.RECENT_CATEGORY = { id: 'recent', name: 'Recent', emojis: null };\n    _this.CUSTOM_CATEGORY = { id: 'custom', name: 'Custom', emojis: [] };\n    _this.SEARCH_CATEGORY = {\n      id: 'search',\n      name: 'Search',\n      emojis: null,\n      anchor: false\n    };\n\n    if (props.data.compressed) {\n      uncompress(props.data);\n    }\n\n    _this.data = props.data;\n    _this.i18n = deepMerge(I18N, props.i18n);\n    _this.icons = deepMerge(icons, props.icons);\n    _this.state = {\n      skin: props.skin || store.get('skin') || props.defaultSkin,\n      firstRender: true\n    };\n\n    _this.categories = [];\n    var allCategories = [].concat(_this.data.categories);\n\n    if (props.custom.length > 0) {\n      _this.CUSTOM_CATEGORY.emojis = props.custom.map(function (emoji) {\n        return _extends({}, emoji, {\n          // `<Category />` expects emoji to have an `id`.\n          id: emoji.short_names[0],\n          custom: true\n        });\n      });\n\n      allCategories.push(_this.CUSTOM_CATEGORY);\n    }\n\n    _this.hideRecent = true;\n\n    if (props.include != undefined) {\n      allCategories.sort(function (a, b) {\n        if (props.include.indexOf(a.id) > props.include.indexOf(b.id)) {\n          return 1;\n        }\n\n        return -1;\n      });\n    }\n\n    for (var categoryIndex = 0; categoryIndex < allCategories.length; categoryIndex++) {\n      var category = allCategories[categoryIndex];\n      var isIncluded = props.include && props.include.length ? props.include.indexOf(category.id) > -1 : true;\n      var isExcluded = props.exclude && props.exclude.length ? props.exclude.indexOf(category.id) > -1 : false;\n      if (!isIncluded || isExcluded) {\n        continue;\n      }\n\n      if (props.emojisToShowFilter) {\n        var newEmojis = [];\n\n        var emojis = category.emojis;\n\n        for (var emojiIndex = 0; emojiIndex < emojis.length; emojiIndex++) {\n          var emoji = emojis[emojiIndex];\n          if (props.emojisToShowFilter(_this.data.emojis[emoji] || emoji)) {\n            newEmojis.push(emoji);\n          }\n        }\n\n        if (newEmojis.length) {\n          var newCategory = {\n            emojis: newEmojis,\n            name: category.name,\n            id: category.id\n          };\n\n          _this.categories.push(newCategory);\n        }\n      } else {\n        _this.categories.push(category);\n      }\n    }\n\n    var includeRecent = props.include && props.include.length ? props.include.indexOf(_this.RECENT_CATEGORY.id) > -1 : true;\n    var excludeRecent = props.exclude && props.exclude.length ? props.exclude.indexOf(_this.RECENT_CATEGORY.id) > -1 : false;\n    if (includeRecent && !excludeRecent) {\n      _this.hideRecent = false;\n      _this.categories.unshift(_this.RECENT_CATEGORY);\n    }\n\n    if (_this.categories[0]) {\n      _this.categories[0].first = true;\n    }\n\n    _this.categories.unshift(_this.SEARCH_CATEGORY);\n\n    _this.setAnchorsRef = _this.setAnchorsRef.bind(_this);\n    _this.handleAnchorClick = _this.handleAnchorClick.bind(_this);\n    _this.setSearchRef = _this.setSearchRef.bind(_this);\n    _this.handleSearch = _this.handleSearch.bind(_this);\n    _this.setScrollRef = _this.setScrollRef.bind(_this);\n    _this.handleScroll = _this.handleScroll.bind(_this);\n    _this.handleScrollPaint = _this.handleScrollPaint.bind(_this);\n    _this.handleEmojiOver = _this.handleEmojiOver.bind(_this);\n    _this.handleEmojiLeave = _this.handleEmojiLeave.bind(_this);\n    _this.handleEmojiClick = _this.handleEmojiClick.bind(_this);\n    _this.handleEmojiSelect = _this.handleEmojiSelect.bind(_this);\n    _this.setPreviewRef = _this.setPreviewRef.bind(_this);\n    _this.handleSkinChange = _this.handleSkinChange.bind(_this);\n    _this.handleKeyDown = _this.handleKeyDown.bind(_this);\n    return _this;\n  }\n\n  _createClass(NimblePicker, [{\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(props) {\n      if (props.skin) {\n        this.setState({ skin: props.skin });\n      } else if (props.defaultSkin && !store.get('skin')) {\n        this.setState({ skin: props.defaultSkin });\n      }\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      if (this.state.firstRender) {\n        this.testStickyPosition();\n        this.firstRenderTimeout = setTimeout(function () {\n          _this2.setState({ firstRender: false });\n        }, 60);\n      }\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this.updateCategoriesSize();\n      this.handleScroll();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.SEARCH_CATEGORY.emojis = null;\n\n      clearTimeout(this.leaveTimeout);\n      clearTimeout(this.firstRenderTimeout);\n    }\n  }, {\n    key: 'testStickyPosition',\n    value: function testStickyPosition() {\n      var stickyTestElement = document.createElement('div');\n\n      var prefixes = ['', '-webkit-', '-ms-', '-moz-', '-o-'];\n\n      prefixes.forEach(function (prefix) {\n        return stickyTestElement.style.position = prefix + 'sticky';\n      });\n\n      this.hasStickyPosition = !!stickyTestElement.style.position.length;\n    }\n  }, {\n    key: 'handleEmojiOver',\n    value: function handleEmojiOver(emoji) {\n      var preview = this.preview;\n\n      if (!preview) {\n        return;\n      }\n\n      // Use Array.prototype.find() when it is more widely supported.\n      var emojiData = this.CUSTOM_CATEGORY.emojis.filter(function (customEmoji) {\n        return customEmoji.id === emoji.id;\n      })[0];\n      for (var key in emojiData) {\n        if (emojiData.hasOwnProperty(key)) {\n          emoji[key] = emojiData[key];\n        }\n      }\n\n      preview.setState({ emoji: emoji });\n      clearTimeout(this.leaveTimeout);\n    }\n  }, {\n    key: 'handleEmojiLeave',\n    value: function handleEmojiLeave(emoji) {\n      var preview = this.preview;\n\n      if (!preview) {\n        return;\n      }\n\n      this.leaveTimeout = setTimeout(function () {\n        preview.setState({ emoji: null });\n      }, 16);\n    }\n  }, {\n    key: 'handleEmojiClick',\n    value: function handleEmojiClick(emoji, e) {\n      this.props.onClick(emoji, e);\n      this.handleEmojiSelect(emoji);\n    }\n  }, {\n    key: 'handleEmojiSelect',\n    value: function handleEmojiSelect(emoji) {\n      var _this3 = this;\n\n      this.props.onSelect(emoji);\n      if (!this.hideRecent && !this.props.recent) frequently$1.add(emoji);\n\n      var component = this.categoryRefs['category-1'];\n      if (component) {\n        var maxMargin = component.maxMargin;\n        component.forceUpdate();\n\n        window.requestAnimationFrame(function () {\n          if (!_this3.scroll) return;\n          component.memoizeSize();\n          if (maxMargin == component.maxMargin) return;\n\n          _this3.updateCategoriesSize();\n          _this3.handleScrollPaint();\n\n          if (_this3.SEARCH_CATEGORY.emojis) {\n            component.updateDisplay('none');\n          }\n        });\n      }\n    }\n  }, {\n    key: 'handleScroll',\n    value: function handleScroll() {\n      if (!this.waitingForPaint) {\n        this.waitingForPaint = true;\n        window.requestAnimationFrame(this.handleScrollPaint);\n      }\n    }\n  }, {\n    key: 'handleScrollPaint',\n    value: function handleScrollPaint() {\n      this.waitingForPaint = false;\n\n      if (!this.scroll) {\n        return;\n      }\n\n      var activeCategory = null;\n\n      if (this.SEARCH_CATEGORY.emojis) {\n        activeCategory = this.SEARCH_CATEGORY;\n      } else {\n        var target = this.scroll,\n            scrollTop = target.scrollTop,\n            scrollingDown = scrollTop > (this.scrollTop || 0),\n            minTop = 0;\n\n        for (var i = 0, l = this.categories.length; i < l; i++) {\n          var ii = scrollingDown ? this.categories.length - 1 - i : i,\n              category = this.categories[ii],\n              component = this.categoryRefs['category-' + ii];\n\n          if (component) {\n            var active = component.handleScroll(scrollTop);\n\n            if (!minTop || component.top < minTop) {\n              if (component.top > 0) {\n                minTop = component.top;\n              }\n            }\n\n            if (active && !activeCategory) {\n              activeCategory = category;\n            }\n          }\n        }\n\n        if (scrollTop < minTop) {\n          activeCategory = this.categories.filter(function (category) {\n            return !(category.anchor === false);\n          })[0];\n        } else if (scrollTop + this.clientHeight >= this.scrollHeight) {\n          activeCategory = this.categories[this.categories.length - 1];\n        }\n      }\n\n      if (activeCategory) {\n        var anchors = this.anchors;\n        var _activeCategory = activeCategory;\n        var categoryName = _activeCategory.name;\n\n\n        if (anchors.state.selected != categoryName) {\n          anchors.setState({ selected: categoryName });\n        }\n      }\n\n      this.scrollTop = scrollTop;\n    }\n  }, {\n    key: 'handleSearch',\n    value: function handleSearch(emojis) {\n      this.SEARCH_CATEGORY.emojis = emojis;\n\n      for (var i = 0, l = this.categories.length; i < l; i++) {\n        var component = this.categoryRefs['category-' + i];\n\n        if (component && component.props.name != 'Search') {\n          var display = emojis ? 'none' : 'inherit';\n          component.updateDisplay(display);\n        }\n      }\n\n      this.forceUpdate();\n      if (this.scroll) {\n        this.scroll.scrollTop = 0;\n      }\n      this.handleScroll();\n    }\n  }, {\n    key: 'handleAnchorClick',\n    value: function handleAnchorClick(category, i) {\n      var component = this.categoryRefs['category-' + i];\n      var scroll = this.scroll;\n      var anchors = this.anchors;\n      var scrollToComponent = null;\n\n      scrollToComponent = function scrollToComponent() {\n        if (component) {\n          var top = component.top;\n\n\n          if (category.first) {\n            top = 0;\n          } else {\n            top += 1;\n          }\n\n          scroll.scrollTop = top;\n        }\n      };\n\n      if (this.SEARCH_CATEGORY.emojis) {\n        this.handleSearch(null);\n        this.search.clear();\n\n        window.requestAnimationFrame(scrollToComponent);\n      } else {\n        scrollToComponent();\n      }\n    }\n  }, {\n    key: 'handleSkinChange',\n    value: function handleSkinChange(skin) {\n      var newState = { skin: skin };\n      var onSkinChange = this.props.onSkinChange;\n\n\n      this.setState(newState);\n      store.update(newState);\n\n      onSkinChange(skin);\n    }\n  }, {\n    key: 'handleKeyDown',\n    value: function handleKeyDown(e) {\n      var handled = false;\n\n      switch (e.keyCode) {\n        case 13:\n          var emoji = void 0;\n\n          if (this.SEARCH_CATEGORY.emojis && this.SEARCH_CATEGORY.emojis.length && (emoji = getSanitizedData(this.SEARCH_CATEGORY.emojis[0], this.state.skin, this.props.set, this.props.data))) {\n            this.handleEmojiSelect(emoji);\n          }\n\n          handled = true;\n          break;\n      }\n\n      if (handled) {\n        e.preventDefault();\n      }\n    }\n  }, {\n    key: 'updateCategoriesSize',\n    value: function updateCategoriesSize() {\n      for (var i = 0, l = this.categories.length; i < l; i++) {\n        var component = this.categoryRefs['category-' + i];\n        if (component) component.memoizeSize();\n      }\n\n      if (this.scroll) {\n        var target = this.scroll;\n        this.scrollHeight = target.scrollHeight;\n        this.clientHeight = target.clientHeight;\n      }\n    }\n  }, {\n    key: 'getCategories',\n    value: function getCategories() {\n      return this.state.firstRender ? this.categories.slice(0, 3) : this.categories;\n    }\n  }, {\n    key: 'setAnchorsRef',\n    value: function setAnchorsRef(c) {\n      this.anchors = c;\n    }\n  }, {\n    key: 'setSearchRef',\n    value: function setSearchRef(c) {\n      this.search = c;\n    }\n  }, {\n    key: 'setPreviewRef',\n    value: function setPreviewRef(c) {\n      this.preview = c;\n    }\n  }, {\n    key: 'setScrollRef',\n    value: function setScrollRef(c) {\n      this.scroll = c;\n    }\n  }, {\n    key: 'setCategoryRef',\n    value: function setCategoryRef(name, c) {\n      if (!this.categoryRefs) {\n        this.categoryRefs = {};\n      }\n\n      this.categoryRefs[name] = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var _props = this.props;\n      var perLine = _props.perLine;\n      var emojiSize = _props.emojiSize;\n      var set = _props.set;\n      var sheetSize = _props.sheetSize;\n      var sheetColumns = _props.sheetColumns;\n      var sheetRows = _props.sheetRows;\n      var style = _props.style;\n      var title = _props.title;\n      var emoji = _props.emoji;\n      var color = _props.color;\n      var native = _props.native;\n      var backgroundImageFn = _props.backgroundImageFn;\n      var emojisToShowFilter = _props.emojisToShowFilter;\n      var showPreview = _props.showPreview;\n      var showSkinTones = _props.showSkinTones;\n      var emojiTooltip = _props.emojiTooltip;\n      var include = _props.include;\n      var exclude = _props.exclude;\n      var recent = _props.recent;\n      var autoFocus = _props.autoFocus;\n      var skinEmoji = _props.skinEmoji;\n      var notFound = _props.notFound;\n      var notFoundEmoji = _props.notFoundEmoji;\n      var skin = this.state.skin;\n      var width = perLine * (emojiSize + 12) + 12 + 2 + measureScrollbar();\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          style: _extends({ width: width }, style),\n          className: 'emoji-mart',\n          'aria-label': title,\n          onKeyDown: this.handleKeyDown\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-bar' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Anchors, {\n            ref: this.setAnchorsRef,\n            data: this.data,\n            i18n: this.i18n,\n            color: color,\n            categories: this.categories,\n            onAnchorClick: this.handleAnchorClick,\n            icons: this.icons\n          })\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Search, {\n          ref: this.setSearchRef,\n          onSearch: this.handleSearch,\n          data: this.data,\n          i18n: this.i18n,\n          emojisToShowFilter: emojisToShowFilter,\n          include: include,\n          exclude: exclude,\n          custom: this.CUSTOM_CATEGORY.emojis,\n          autoFocus: autoFocus\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            ref: this.setScrollRef,\n            className: 'emoji-mart-scroll',\n            onScroll: this.handleScroll\n          },\n          this.getCategories().map(function (category, i) {\n            return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Category, {\n              ref: _this4.setCategoryRef.bind(_this4, 'category-' + i),\n              key: category.name,\n              id: category.id,\n              name: category.name,\n              emojis: category.emojis,\n              perLine: perLine,\n              native: native,\n              hasStickyPosition: _this4.hasStickyPosition,\n              data: _this4.data,\n              i18n: _this4.i18n,\n              recent: category.id == _this4.RECENT_CATEGORY.id ? recent : undefined,\n              custom: category.id == _this4.RECENT_CATEGORY.id ? _this4.CUSTOM_CATEGORY.emojis : undefined,\n              emojiProps: {\n                native: native,\n                skin: skin,\n                size: emojiSize,\n                set: set,\n                sheetSize: sheetSize,\n                sheetColumns: sheetColumns,\n                sheetRows: sheetRows,\n                forceSize: native,\n                tooltip: emojiTooltip,\n                backgroundImageFn: backgroundImageFn,\n                onOver: _this4.handleEmojiOver,\n                onLeave: _this4.handleEmojiLeave,\n                onClick: _this4.handleEmojiClick\n              },\n              notFound: notFound,\n              notFoundEmoji: notFoundEmoji\n            });\n          })\n        ),\n        (showPreview || showSkinTones) && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-bar' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Preview, {\n            ref: this.setPreviewRef,\n            data: this.data,\n            title: title,\n            emoji: emoji,\n            showSkinTones: showSkinTones,\n            showPreview: showPreview,\n            emojiProps: {\n              native: native,\n              size: 38,\n              skin: skin,\n              set: set,\n              sheetSize: sheetSize,\n              sheetColumns: sheetColumns,\n              sheetRows: sheetRows,\n              backgroundImageFn: backgroundImageFn\n            },\n            skinsProps: {\n              skin: skin,\n              onChange: this.handleSkinChange,\n              skinEmoji: skinEmoji\n            },\n            i18n: this.i18n\n          })\n        )\n      );\n    }\n  }]);\n\n  return NimblePicker;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nNimblePicker.propTypes /* remove-proptypes */ = _extends({}, PickerPropTypes, {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n});\nNimblePicker.defaultProps = _extends({}, PickerDefaultProps);\n\nvar Picker = function (_React$PureComponent) {\n  inherits(Picker, _React$PureComponent);\n\n  function Picker() {\n    _classCallCheck(this, Picker);\n\n    return possibleConstructorReturn(this, (Picker.__proto__ || _Object$getPrototypeOf(Picker)).apply(this, arguments));\n  }\n\n  _createClass(Picker, [{\n    key: 'render',\n    value: function render() {\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(NimblePicker, _extends({}, this.props, this.state));\n    }\n  }]);\n\n  return Picker;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nPicker.propTypes /* remove-proptypes */ = PickerPropTypes;\nPicker.defaultProps = _extends({}, PickerDefaultProps, { data: data });\n\nvar Emoji = function Emoji(props) {\n  for (var k in Emoji.defaultProps) {\n    if (props[k] == undefined && Emoji.defaultProps[k] != undefined) {\n      props[k] = Emoji.defaultProps[k];\n    }\n  }\n\n  return NimbleEmoji(_extends({}, props));\n};\n\nEmoji.propTypes /* remove-proptypes */ = EmojiPropTypes;\nEmoji.defaultProps = _extends({}, EmojiDefaultProps, { data: data });\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nvar isObject_1 = isObject;\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\nvar _freeGlobal = freeGlobal;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = _freeGlobal || freeSelf || Function('return this')();\n\nvar _root = root;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return _root.Date.now();\n};\n\nvar now_1 = now;\n\n/** Built-in value references. */\nvar Symbol$1 = _root.Symbol;\n\nvar _Symbol = Symbol$1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$1 = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty$1.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nvar _getRawTag = getRawTag;\n\n/** Used for built-in method references. */\nvar objectProto$1 = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString$1 = objectProto$1.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString$1.call(value);\n}\n\nvar _objectToString = objectToString;\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag$1 && symToStringTag$1 in Object(value))\n    ? _getRawTag(value)\n    : _objectToString(value);\n}\n\nvar _baseGetTag = baseGetTag;\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nvar isObjectLike_1 = isObjectLike;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike_1(value) && _baseGetTag(value) == symbolTag);\n}\n\nvar isSymbol_1 = isSymbol;\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol_1(value)) {\n    return NAN;\n  }\n  if (isObject_1(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject_1(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nvar toNumber_1 = toNumber;\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber_1(wait) || 0;\n  if (isObject_1(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now_1();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now_1());\n  }\n\n  function debounced() {\n    var time = now_1(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nvar debounce_1 = debounce;\n\nvar css$1 = \".react-input-emoji--container {\\n  color: #4b4b4b;\\n  text-rendering: optimizeLegibility;\\n  background-color: #fff;\\n  border: 1px solid #fff;\\n  border-radius: 21px;\\n  margin: 5px 10px;\\n  box-sizing: border-box;\\n  flex: 1 1 auto;\\n  font-size: 15px;\\n  font-family: sans-serif;\\n  font-weight: 400;\\n  line-height: 20px;\\n  min-height: 20px;\\n  min-width: 0;\\n  outline: none;\\n  width: inherit;\\n  will-change: width;\\n  vertical-align: baseline;\\n  border: 1px solid #eaeaea;\\n  margin-right: 0;\\n}\\n\\n.react-input-emoji--wrapper {\\n  display: flex;\\n  overflow: hidden;\\n  flex: 1;\\n  position: relative;\\n  padding-right: 0;\\n  vertical-align: baseline;\\n  outline: none;\\n  margin: 0;\\n  padding: 0;\\n  border: 0;\\n}\\n\\n.react-input-emoji--input {\\n  font-weight: 400;\\n  max-height: 100px;\\n  min-height: 20px;\\n  outline: none;\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n  position: relative;\\n  white-space: pre-wrap;\\n  word-wrap: break-word;\\n  z-index: 1;\\n  width: 100%;\\n  user-select: text;\\n  padding: 9px 12px 11px;\\n  text-align: left;\\n}\\n\\n.react-input-emoji--input img {\\n  vertical-align: middle;\\n  width: 18px !important;\\n  height: 18px !important;\\n  display: inline !important;\\n  margin-left: 1px;\\n  margin-right: 1px;\\n}\\n\\n.react-input-emoji--overlay {\\n  position: fixed;\\n  width: 100%;\\n  height: 100%;\\n  top: 0;\\n  left: 0;\\n  z-index: 9;\\n}\\n\\n.react-input-emoji--placeholder {\\n  color: #a0a0a0;\\n  pointer-events: none;\\n  position: absolute;\\n  transition: opacity 0.08s linear;\\n  user-select: none;\\n  z-index: 2;\\n  left: 12px;\\n  top: 0;\\n  bottom: 0;\\n  display: flex;\\n  align-items: center;\\n  width: calc(100% - 22px);\\n}\\n\\n.react-input-emoji--button {\\n  position: relative;\\n  display: block;\\n  text-align: center;\\n  padding: 0 10px;\\n  overflow: hidden;\\n  transition: color 0.1s ease-out;\\n  margin: 0;\\n  box-shadow: none;\\n  background: none;\\n  border: none;\\n  outline: none;\\n  cursor: pointer;\\n  flex-shrink: 0;\\n  margin-bottom: 12px;\\n}\\n\\n.react-input-emoji--button svg {\\n  fill: #858585;\\n}\\n\\n.react-input-emoji--button__show svg {\\n  fill: #128b7e;\\n}\\n\\n.react-emoji {\\n  display: flex;\\n  align-items: flex-end;\\n  position: relative;\\n  width: 100%;\\n}\\n\\n.react-emoji-picker--container {\\n  position: absolute;\\n  top: 0;\\n  width: 100%;\\n}\\n\\n.react-emoji-picker--wrapper.react-emoji-picker--wrapper__show {\\n  height: 357px;\\n}\\n\\n.react-emoji-picker--wrapper {\\n  position: absolute;\\n  bottom: 0;\\n  right: 0;\\n  height: 0;\\n  width: 338px;\\n  overflow: hidden;\\n  z-index: 10;\\n}\\n\\n.react-emoji-picker {\\n  position: absolute;\\n  top: 357px;\\n  left: 0;\\n  transition: top 0.1s ease-in-out;\\n}\\n\\n.react-emoji-picker__show {\\n  top: 0;\\n}\\n\";\nstyleInject(css$1);\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar inherits$1 = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn$1 = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar slicedToArray = function () {\n  function sliceIterator(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"]) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  return function (arr, i) {\n    if (Array.isArray(arr)) {\n      return arr;\n    } else if (Symbol.iterator in Object(arr)) {\n      return sliceIterator(arr, i);\n    } else {\n      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n    }\n  };\n}();\n\nvar toConsumableArray = function (arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n    return arr2;\n  } else {\n    return Array.from(arr);\n  }\n};\n\n// vendors\n\nvar InputEmoji = function (_Component) {\n  inherits$1(InputEmoji, _Component);\n\n  function InputEmoji(props) {\n    classCallCheck(this, InputEmoji);\n\n    var _this = possibleConstructorReturn$1(this, (InputEmoji.__proto__ || Object.getPrototypeOf(InputEmoji)).call(this, props));\n\n    _this.state = {\n      html: '',\n      showPicker: false,\n      allEmojiStyle: {},\n      currentSize: null\n    };\n\n    _this.setCurrentSize = function () {\n      if (!_this.textInput.current) {\n        return;\n      }\n\n      _this.setState({\n        currentSize: {\n          width: _this.textInput.current.offsetWidth,\n          height: _this.textInput.current.offsetHeight\n        }\n      });\n    };\n\n    _this.checkAndEmitResize = function () {\n      var onResize = _this.props.onResize;\n      var currentSize = _this.state.currentSize;\n\n\n      var nextSize = {\n        width: _this.textInput.current.offsetWidth,\n        height: _this.textInput.current.offsetHeight\n      };\n\n      if (!_this.state.currentSize || currentSize.width !== nextSize.width || currentSize.height !== nextSize.height) {\n        onResize(nextSize);\n        _this.setState({ currentSize: nextSize });\n      }\n    };\n\n    _this.listenKeydown = function () {\n      var _this$props = _this.props,\n          cleanOnEnter = _this$props.cleanOnEnter,\n          onChange = _this$props.onChange,\n          onEnter = _this$props.onEnter;\n\n\n      if (cleanOnEnter) {\n        _this.textInput.current.addEventListener('keydown', function (event) {\n          if (event.keyCode === 13) {\n            event.preventDefault();\n            return false;\n          }\n        });\n        _this.textInput.current.addEventListener('keyup', function (event) {\n          if (event.keyCode === 13) {\n            var cleanedText = _this.replaceAllTextEmojiToString();\n            if (typeof onEnter === 'function') {\n              onEnter(cleanedText);\n            }\n\n            if (typeof onChange === 'function') {\n              onChange(cleanedText);\n            }\n\n            _this.updateHTML('');\n          }\n        });\n      }\n    };\n\n    _this.setValue = function (value) {\n      _this.updateHTML(value);\n      _this.textInput.current.blur();\n    };\n\n    _this.updateHTML = function () {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.value;\n\n      _this.setState({ html: value });\n      _this.textInput.current.innerHTML = _this.replaceAllTextEmojis(value || '');\n    };\n\n    _this.emitOnChange = function () {\n      _this.props.onChange(_this.replaceAllTextEmojiToString());\n    };\n\n    _this.getAllEmojiStyle = function () {\n      var allEmojiButton = document.querySelectorAll('.emoji-mart-category-list > li > button');\n\n      var allEmojiStyle = {};\n\n      allEmojiButton.forEach(function (emojiButton) {\n        var label = emojiButton.getAttribute('aria-label');\n\n        var _label$split = label.split(','),\n            _label$split2 = slicedToArray(_label$split, 1),\n            emoji = _label$split2[0];\n\n        var emojiSpanEl = emojiButton.querySelector('span');\n\n        var style = _this.replaceAll(emojiSpanEl.style.cssText, '\"', \"'\");\n\n        allEmojiStyle[emoji] = style;\n      });\n\n      _this.setState({ allEmojiStyle: allEmojiStyle });\n    };\n\n    _this.toggleShowPicker = function () {\n      _this.setState({ showPicker: !_this.state.showPicker });\n    };\n\n    _this.emitChange = function () {\n      var _this$props2 = _this.props,\n          onChange = _this$props2.onChange,\n          onResize = _this$props2.onResize,\n          maxLength = _this$props2.maxLength;\n\n\n      if (typeof maxLength !== 'undefined' && Number.isInteger(maxLength)) {\n        var totalCharacters = [].concat(toConsumableArray(_this.replaceAllTextEmojiToString())).length;\n\n        if (totalCharacters > maxLength) {\n          _this.textInput.current.innerHTML = '';\n          _this.pasteHtmlAtCaret(_this.state.html);\n          return;\n        }\n      }\n\n      var html = _this.textInput.current.innerHTML;\n\n      _this.setState({ html: html });\n\n      if (typeof onChange === 'function') {\n        _this.onChangeDebounced(html);\n      }\n\n      if (typeof onResize === 'function') {\n        _this.checkAndEmitResize();\n      }\n    };\n\n    _this.replaceAllTextEmojiToString = function () {\n      if (!_this.textInput.current) {\n        return '';\n      }\n\n      var container = document.createElement('div');\n      container.innerHTML = _this.textInput.current.innerHTML;\n\n      var images = container.querySelectorAll('img');\n\n      images.forEach(function (image) {\n        image.outerHTML = image.dataset.emoji;\n      });\n\n      var text = container.innerText;\n\n      // remove all ↵ for safari\n      text = text.replace(/\\n/ig, '');\n\n      return text;\n    };\n\n    _this.pasteHtmlAtCaret = function (html) {\n      var sel = void 0,\n          range = void 0;\n      if (window.getSelection) {\n        // IE9 and non-IE\n        sel = window.getSelection();\n        if (sel.getRangeAt && sel.rangeCount) {\n          range = sel.getRangeAt(0);\n          range.deleteContents();\n\n          // Range.createContextualFragment() would be useful here but is\n          // non-standard and not supported in all browsers (IE9, for one)\n          var el = document.createElement('div');\n          el.innerHTML = html;\n          var frag = document.createDocumentFragment();var node;var lastNode;\n          while (node = el.firstChild) {\n            lastNode = frag.appendChild(node);\n          }\n          range.insertNode(frag);\n\n          // Preserve the selection\n          if (lastNode) {\n            range = range.cloneRange();\n            range.setStartAfter(lastNode);\n            range.collapse(true);\n            sel.removeAllRanges();\n            sel.addRange(range);\n          }\n        }\n      } else if (document.selection && document.selection.type !== 'Control') {\n        // IE < 9\n        document.selection.createRange().pasteHTML(html);\n      }\n    };\n\n    _this.replaceAll = function (str, find, replace) {\n      return str.replace(new RegExp(find, 'g'), replace);\n    };\n\n    _this.getImage = function (emoji) {\n      var shortNames = '' + emoji.short_names;\n\n      shortNames = _this.replaceAll(shortNames, ',', ', ');\n\n      var emojiSpanEl = document.querySelector('[aria-label=\"' + emoji.native + ', ' + shortNames + '\"] > span');\n\n      if (!emojiSpanEl) return '';\n\n      var style = _this.replaceAll(emojiSpanEl.style.cssText, '\"', \"'\");\n\n      return '<img style=\"' + style + '\" data-emoji=\"' + emoji.native + '\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif\" />';\n    };\n\n    _this.replaceAllTextEmojis = function (text) {\n      var allEmojis = _this.getAllEmojisFromText(text);\n\n      if (allEmojis) {\n        allEmojis = [].concat(toConsumableArray(new Set(allEmojis))); // remove duplicates\n        var allEmojiStyle = _this.state.allEmojiStyle;\n\n        allEmojis.forEach(function (emoji) {\n          var style = allEmojiStyle[emoji];\n\n          if (!style) return;\n\n          text = _this.replaceAll(text, emoji, '<img style=\"' + style + '\" data-emoji=\"' + emoji + '\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif\" />');\n        });\n      }\n\n      return text;\n    };\n\n    _this.handleSelectEmoji = function (emoji) {\n      var keepOpenend = _this.props.keepOpenend;\n\n\n      _this.textInput.current.focus();\n\n      _this.pasteHtmlAtCaret(_this.getImage(emoji));\n\n      _this.textInput.current.focus();\n\n      _this.emitChange();\n\n      if (!keepOpenend) {\n        _this.toggleShowPicker();\n      }\n    };\n\n    _this.getAllEmojisFromText = function (text) {\n      return text.match(/(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*/g);\n    };\n\n    _this.handleContentEditableInputCopyAndPaste = function () {\n      var self = _this;\n      _this.textInput.current.addEventListener('copy', function (e) {\n        var selectedText = window.getSelection();\n\n        var container = document.createElement('div');\n\n        for (var i = 0, len = selectedText.rangeCount; i < len; ++i) {\n          container.appendChild(selectedText.getRangeAt(i).cloneContents());\n        }\n\n        container = replaceEmojiToString(container);\n\n        e.clipboardData.setData('text', container.innerText);\n        e.preventDefault();\n\n        function replaceEmojiToString(container) {\n          var images = container.querySelectorAll('img');\n\n          images.forEach(function (image) {\n            image.outerHTML = image.dataset.emoji;\n          });\n\n          return container;\n        }\n      });\n\n      // Paste fix for contenteditable\n      _this.textInput.current.addEventListener('paste', function (e) {\n        e.preventDefault();\n        var content = void 0;\n        if (window.clipboardData) {\n          content = window.clipboardData.getData('Text');\n          content = self.replaceAllTextEmojis(content);\n          if (window.getSelection) {\n            var selObj = window.getSelection();\n            var selRange = selObj.getRangeAt(0);\n            selRange.deleteContents();\n            selRange.insertNode(document.createTextNode(content));\n          }\n        } else if (e.clipboardData) {\n          content = e.clipboardData.getData('text/plain');\n          content = self.replaceAllTextEmojis(content);\n          document.execCommand('insertHTML', false, content);\n        }\n      });\n    };\n\n    _this.checkIsEmpty = function () {\n      var text = _this.replaceAllTextEmojiToString();\n\n      return text === '';\n    };\n\n    _this.handleClick = function () {\n      var onClick = _this.props.onClick;\n\n\n      if (typeof onClick === 'function') {\n        onClick();\n      }\n    };\n\n    _this.listenFocus = function () {\n      _this.textInput.current.addEventListener('focus', function () {\n        var onFocus = _this.props.onFocus;\n\n\n        if (typeof onFocus === 'function') {\n          onFocus();\n        }\n      });\n    };\n\n    _this.handleKeyDown = function (event) {\n      var onKeyDown = _this.props.onKeyDown;\n\n\n      if (typeof onKeyDown === 'function') {\n        onKeyDown(event);\n      }\n    };\n\n    _this.getExcludePicker = function () {\n      var disableRecent = _this.props.disableRecent;\n\n\n      var exclude = [];\n\n      if (disableRecent) {\n        exclude.push('recent');\n      }\n\n      return exclude;\n    };\n\n    _this.textInput = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef();\n\n    if (typeof props.onChange === 'function') {\n      _this.onChangeDebounced = debounce_1(_this.emitOnChange, 100);\n    }\n    return _this;\n  }\n\n  createClass(InputEmoji, [{\n    key: 'focus',\n    value: function focus() {\n      this.textInput.current.focus();\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.handleContentEditableInputCopyAndPaste();\n\n      this.getAllEmojiStyle();\n\n      this.updateHTML();\n\n      this.listenKeydown();\n\n      this.listenFocus();\n\n      this.setCurrentSize();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          _props$height = _props.height,\n          height = _props$height === undefined ? 40 : _props$height,\n          _props$placeholder = _props.placeholder,\n          placeholder = _props$placeholder === undefined ? 'Type a message' : _props$placeholder,\n          _props$borderRadius = _props.borderRadius,\n          borderRadius = _props$borderRadius === undefined ? 21 : _props$borderRadius,\n          _props$borderColor = _props.borderColor,\n          borderColor = _props$borderColor === undefined ? '#EAEAEA' : _props$borderColor,\n          _props$fontSize = _props.fontSize,\n          fontSize = _props$fontSize === undefined ? 15 : _props$fontSize,\n          _props$fontFamily = _props.fontFamily,\n          fontFamily = _props$fontFamily === undefined ? 'sans-serif' : _props$fontFamily,\n          inputClass = _props.inputClass,\n          _props$tabIndex = _props.tabIndex,\n          tabIndex = _props$tabIndex === undefined ? 0 : _props$tabIndex;\n      var showPicker = this.state.showPicker;\n\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        { className: 'react-emoji' },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            className: 'react-emoji-picker--container',\n            onClick: this.handleContainerClick\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'react-emoji-picker--wrapper' + (showPicker ? ' react-emoji-picker--wrapper__show' : '') },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              {\n                className: 'react-emoji-picker' + (showPicker ? ' react-emoji-picker__show' : '')\n              },\n              react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Picker, {\n                showPreview: false,\n                showSkinTones: false,\n                set: 'apple',\n                onSelect: this.handleSelectEmoji,\n                exclude: this.getExcludePicker()\n              })\n            )\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            className: 'react-input-emoji--container',\n            style: {\n              borderRadius: borderRadius,\n              borderColor: borderColor,\n              fontSize: fontSize,\n              fontFamily: fontFamily\n            }\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'react-input-emoji--wrapper', onClick: this.handleClick },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              {\n                className: 'react-input-emoji--placeholder',\n                style: {\n                  visibility: !this.checkIsEmpty() ? 'hidden' : 'visible'\n                }\n              },\n              placeholder\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('div', {\n              ref: this.textInput,\n              tabIndex: tabIndex,\n              contentEditable: true,\n              className: 'react-input-emoji--input' + (inputClass ? ' ' + inputClass : ''),\n              onInput: this.emitChange,\n              onBlur: this.emitChange,\n              onKeyDown: this.handleKeyDown,\n              style: {\n                paddingTop: (height - 20) / 2 + 'px',\n                paddingBottom: (height - 20) / 2 + 'px',\n                minHeight: height + 'px'\n              }\n            })\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'button',\n          {\n            className: 'react-input-emoji--button' + (showPicker ? ' react-input-emoji--button__show' : ''),\n            onClick: this.toggleShowPicker },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'svg',\n            { xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24', width: '24', height: '24' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('path', { d: 'M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10' }),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('path', { d: 'M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0' })\n          )\n        ),\n        showPicker && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('div', {\n          className: 'react-input-emoji--overlay',\n          onClick: this.toggleShowPicker\n        })\n      );\n    }\n  }, {\n    key: 'value',\n    get: function get() {\n      return this.replaceAllTextEmojiToString();\n    },\n    set: function set(value) {\n      this.setValue(value);\n    }\n  }]);\n  return InputEmoji;\n}(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n\nInputEmoji.propTypes = {\n  value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  cleanOnEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  onResize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  maxLength: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  keepOpenend: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  inputClass: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  disableRecent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  // style\n  height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  borderRadius: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  borderColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  fontSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  fontFamily: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (InputEmoji);\n//# sourceMappingURL=index.es.js.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-input-emoji/dist/index.es.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-is/cjs/react-is.development.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-is/cjs/react-is.development.js ***!
-  \***********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n  if (typeof object === 'object' && object !== null) {\n    var $$typeof = object.$$typeof;\n\n    switch ($$typeof) {\n      case REACT_ELEMENT_TYPE:\n        var type = object.type;\n\n        switch (type) {\n          case REACT_ASYNC_MODE_TYPE:\n          case REACT_CONCURRENT_MODE_TYPE:\n          case REACT_FRAGMENT_TYPE:\n          case REACT_PROFILER_TYPE:\n          case REACT_STRICT_MODE_TYPE:\n          case REACT_SUSPENSE_TYPE:\n            return type;\n\n          default:\n            var $$typeofType = type && type.$$typeof;\n\n            switch ($$typeofType) {\n              case REACT_CONTEXT_TYPE:\n              case REACT_FORWARD_REF_TYPE:\n              case REACT_LAZY_TYPE:\n              case REACT_MEMO_TYPE:\n              case REACT_PROVIDER_TYPE:\n                return $$typeofType;\n\n              default:\n                return $$typeof;\n            }\n\n        }\n\n      case REACT_PORTAL_TYPE:\n        return $$typeof;\n    }\n  }\n\n  return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n  {\n    if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n      hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n      console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n    }\n  }\n\n  return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n  return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n  return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n  return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n  return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n  return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n  return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n  return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n  return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n  return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n  return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n  return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-is/cjs/react-is.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-is/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/react-is/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ \"./jaas-client/node_modules/react-is/cjs/react-is.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-is/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js ***!
-  \***************************************************************************/
-/*! exports provided: MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter, BrowserRouter, HashRouter, Link, NavLink */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BrowserRouter\", function() { return BrowserRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"HashRouter\", function() { return HashRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Link\", function() { return Link; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NavLink\", function() { return NavLink; });\n/* harmony import */ var react_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-router */ \"./jaas-client/node_modules/react-router/esm/react-router.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MemoryRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"MemoryRouter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Prompt\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Prompt\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Redirect\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Redirect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Route\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Route\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StaticRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"StaticRouter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Switch\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Switch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"generatePath\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"generatePath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matchPath\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"matchPath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useHistory\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useHistory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useLocation\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useLocation\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useParams\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useParams\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useRouteMatch\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useRouteMatch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"withRouter\"]; });\n\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! history */ \"./jaas-client/node_modules/history/esm/history.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The public API for a <Router> that uses HTML5 history.\n */\n\nvar BrowserRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(BrowserRouter, _React$Component);\n\n  function BrowserRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createBrowserHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = BrowserRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"], {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return BrowserRouter;\n}(react__WEBPACK_IMPORTED_MODULE_2___default.a.Component);\n\nif (true) {\n  BrowserRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n    forceRefresh: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    keyLength: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  };\n\n  BrowserRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(!this.props.history, \"<BrowserRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { BrowserRouter as Router }`.\") : undefined;\n  };\n}\n\n/**\n * The public API for a <Router> that uses window.location.hash.\n */\n\nvar HashRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(HashRouter, _React$Component);\n\n  function HashRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createHashHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = HashRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"], {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return HashRouter;\n}(react__WEBPACK_IMPORTED_MODULE_2___default.a.Component);\n\nif (true) {\n  HashRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    hashType: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf([\"hashbang\", \"noslash\", \"slash\"])\n  };\n\n  HashRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(!this.props.history, \"<HashRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { HashRouter as Router }`.\") : undefined;\n  };\n}\n\nvar resolveToLocation = function resolveToLocation(to, currentLocation) {\n  return typeof to === \"function\" ? to(currentLocation) : to;\n};\nvar normalizeToLocation = function normalizeToLocation(to, currentLocation) {\n  return typeof to === \"string\" ? Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(to, null, null, currentLocation) : to;\n};\n\nvar forwardRefShim = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = forwardRefShim;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nvar LinkAnchor = forwardRef(function (_ref, forwardedRef) {\n  var innerRef = _ref.innerRef,\n      navigate = _ref.navigate,\n      _onClick = _ref.onClick,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref, [\"innerRef\", \"navigate\", \"onClick\"]);\n\n  var target = rest.target;\n\n  var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, rest, {\n    onClick: function onClick(event) {\n      try {\n        if (_onClick) _onClick(event);\n      } catch (ex) {\n        event.preventDefault();\n        throw ex;\n      }\n\n      if (!event.defaultPrevented && // onClick prevented default\n      event.button === 0 && ( // ignore everything but left clicks\n      !target || target === \"_self\") && // let browser handle \"target=_blank\" etc.\n      !isModifiedEvent(event) // ignore clicks with modifier keys\n      ) {\n          event.preventDefault();\n          navigate();\n        }\n    }\n  }); // React 15 compat\n\n\n  if (forwardRefShim !== forwardRef) {\n    props.ref = forwardedRef || innerRef;\n  } else {\n    props.ref = innerRef;\n  }\n  /* eslint-disable-next-line jsx-a11y/anchor-has-content */\n\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"a\", props);\n});\n\nif (true) {\n  LinkAnchor.displayName = \"LinkAnchor\";\n}\n/**\n * The public API for rendering a history-aware <a>.\n */\n\n\nvar Link = forwardRef(function (_ref2, forwardedRef) {\n  var _ref2$component = _ref2.component,\n      component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,\n      replace = _ref2.replace,\n      to = _ref2.to,\n      innerRef = _ref2.innerRef,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref2, [\"component\", \"replace\", \"to\", \"innerRef\"]);\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"__RouterContext\"].Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(false, \"You should not use <Link> outside a <Router>\") : undefined : void 0;\n    var history = context.history;\n    var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);\n    var href = location ? history.createHref(location) : \"\";\n\n    var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, rest, {\n      href: href,\n      navigate: function navigate() {\n        var location = resolveToLocation(to, context.location);\n        var method = replace ? history.replace : history.push;\n        method(location);\n      }\n    }); // React 15 compat\n\n\n    if (forwardRefShim !== forwardRef) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(component, props);\n  });\n});\n\nif (true) {\n  var toType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]);\n  var refType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    current: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n  })]);\n  Link.displayName = \"Link\";\n  Link.propTypes = {\n    innerRef: refType,\n    onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    replace: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    target: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    to: toType.isRequired\n  };\n}\n\nvar forwardRefShim$1 = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef$1 = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef;\n\nif (typeof forwardRef$1 === \"undefined\") {\n  forwardRef$1 = forwardRefShim$1;\n}\n\nfunction joinClassnames() {\n  for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {\n    classnames[_key] = arguments[_key];\n  }\n\n  return classnames.filter(function (i) {\n    return i;\n  }).join(\" \");\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\n\nvar NavLink = forwardRef$1(function (_ref, forwardedRef) {\n  var _ref$ariaCurrent = _ref[\"aria-current\"],\n      ariaCurrent = _ref$ariaCurrent === void 0 ? \"page\" : _ref$ariaCurrent,\n      _ref$activeClassName = _ref.activeClassName,\n      activeClassName = _ref$activeClassName === void 0 ? \"active\" : _ref$activeClassName,\n      activeStyle = _ref.activeStyle,\n      classNameProp = _ref.className,\n      exact = _ref.exact,\n      isActiveProp = _ref.isActive,\n      locationProp = _ref.location,\n      sensitive = _ref.sensitive,\n      strict = _ref.strict,\n      styleProp = _ref.style,\n      to = _ref.to,\n      innerRef = _ref.innerRef,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref, [\"aria-current\", \"activeClassName\", \"activeStyle\", \"className\", \"exact\", \"isActive\", \"location\", \"sensitive\", \"strict\", \"style\", \"to\", \"innerRef\"]);\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"__RouterContext\"].Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(false, \"You should not use <NavLink> outside a <Router>\") : undefined : void 0;\n    var currentLocation = locationProp || context.location;\n    var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);\n    var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n\n    var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n    var match = escapedPath ? Object(react_router__WEBPACK_IMPORTED_MODULE_0__[\"matchPath\"])(currentLocation.pathname, {\n      path: escapedPath,\n      exact: exact,\n      sensitive: sensitive,\n      strict: strict\n    }) : null;\n    var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);\n    var className = isActive ? joinClassnames(classNameProp, activeClassName) : classNameProp;\n    var style = isActive ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, styleProp, {}, activeStyle) : styleProp;\n\n    var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n      \"aria-current\": isActive && ariaCurrent || null,\n      className: className,\n      style: style,\n      to: toLocation\n    }, rest); // React 15 compat\n\n\n    if (forwardRefShim$1 !== forwardRef$1) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Link, props);\n  });\n});\n\nif (true) {\n  NavLink.displayName = \"NavLink\";\n  var ariaCurrentType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\"]);\n  NavLink.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, Link.propTypes, {\n    \"aria-current\": ariaCurrentType,\n    activeClassName: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    activeStyle: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n    className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    exact: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    isActive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n    sensitive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    strict: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n  });\n}\n\n\n//# sourceMappingURL=react-router-dom.js.map\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-router/esm/react-router.js":
-/*!*******************************************************************!*\
-  !*** ./jaas-client/node_modules/react-router/esm/react-router.js ***!
-  \*******************************************************************/
-/*! exports provided: MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, __HistoryContext, __RouterContext, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MemoryRouter\", function() { return MemoryRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Prompt\", function() { return Prompt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Redirect\", function() { return Redirect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Route\", function() { return Route; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return Router; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StaticRouter\", function() { return StaticRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Switch\", function() { return Switch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__HistoryContext\", function() { return historyContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__RouterContext\", function() { return context; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"generatePath\", function() { return generatePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"matchPath\", function() { return matchPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useHistory\", function() { return useHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useLocation\", function() { return useLocation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useParams\", function() { return useParams; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useRouteMatch\", function() { return useRouteMatch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"withRouter\", function() { return withRouter; });\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! history */ \"./jaas-client/node_modules/history/esm/history.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! mini-create-react-context */ \"./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var path_to_regexp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! path-to-regexp */ \"./jaas-client/node_modules/path-to-regexp/index.js\");\n/* harmony import */ var path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(path_to_regexp__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext = function createNamedContext(name) {\n  var context = Object(mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n  context.displayName = name;\n  return context;\n};\n\nvar historyContext =\n/*#__PURE__*/\ncreateNamedContext(\"Router-History\");\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext$1 = function createNamedContext(name) {\n  var context = Object(mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n  context.displayName = name;\n  return context;\n};\n\nvar context =\n/*#__PURE__*/\ncreateNamedContext$1(\"Router\");\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Router, _React$Component);\n\n  Router.computeRootMatch = function computeRootMatch(pathname) {\n    return {\n      path: \"/\",\n      url: \"/\",\n      params: {},\n      isExact: pathname === \"/\"\n    };\n  };\n\n  function Router(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n    _this.state = {\n      location: props.history.location\n    }; // This is a bit of a hack. We have to start listening for location\n    // changes here in the constructor in case there are any <Redirect>s\n    // on the initial render. If there are, they will replace/push when\n    // they mount and since cDM fires in children before parents, we may\n    // get a new location before the <Router> is mounted.\n\n    _this._isMounted = false;\n    _this._pendingLocation = null;\n\n    if (!props.staticContext) {\n      _this.unlisten = props.history.listen(function (location) {\n        if (_this._isMounted) {\n          _this.setState({\n            location: location\n          });\n        } else {\n          _this._pendingLocation = location;\n        }\n      });\n    }\n\n    return _this;\n  }\n\n  var _proto = Router.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this._isMounted = true;\n\n    if (this._pendingLocation) {\n      this.setState({\n        location: this._pendingLocation\n      });\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.unlisten) this.unlisten();\n  };\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Provider, {\n      value: {\n        history: this.props.history,\n        location: this.state.location,\n        match: Router.computeRootMatch(this.state.location.pathname),\n        staticContext: this.props.staticContext\n      }\n    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(historyContext.Provider, {\n      children: this.props.children || null,\n      value: this.props.history\n    }));\n  };\n\n  return Router;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Router.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n    history: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object.isRequired,\n    staticContext: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  };\n\n  Router.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(prevProps.history === this.props.history, \"You cannot change <Router history>\") : undefined;\n  };\n}\n\n/**\n * The public API for a <Router> that stores location in memory.\n */\n\nvar MemoryRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(MemoryRouter, _React$Component);\n\n  function MemoryRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createMemoryHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = MemoryRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return MemoryRouter;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  MemoryRouter.propTypes = {\n    initialEntries: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.array,\n    initialIndex: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n    keyLength: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node\n  };\n\n  MemoryRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!this.props.history, \"<MemoryRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { MemoryRouter as Router }`.\") : undefined;\n  };\n}\n\nvar Lifecycle =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Lifecycle, _React$Component);\n\n  function Lifecycle() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Lifecycle.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    if (this.props.onMount) this.props.onMount.call(this, this);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.props.onUnmount) this.props.onUnmount.call(this, this);\n  };\n\n  _proto.render = function render() {\n    return null;\n  };\n\n  return Lifecycle;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\n/**\n * The public API for prompting the user before navigating away from a screen.\n */\n\nfunction Prompt(_ref) {\n  var message = _ref.message,\n      _ref$when = _ref.when,\n      when = _ref$when === void 0 ? true : _ref$when;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Prompt> outside a <Router>\") : undefined : void 0;\n    if (!when || context.staticContext) return null;\n    var method = context.history.block;\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Lifecycle, {\n      onMount: function onMount(self) {\n        self.release = method(message);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        if (prevProps.message !== message) {\n          self.release();\n          self.release = method(message);\n        }\n      },\n      onUnmount: function onUnmount(self) {\n        self.release();\n      },\n      message: message\n    });\n  });\n}\n\nif (true) {\n  var messageType = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string]);\n  Prompt.propTypes = {\n    when: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    message: messageType.isRequired\n  };\n}\n\nvar cache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nfunction compilePath(path) {\n  if (cache[path]) return cache[path];\n  var generator = path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default.a.compile(path);\n\n  if (cacheCount < cacheLimit) {\n    cache[path] = generator;\n    cacheCount++;\n  }\n\n  return generator;\n}\n/**\n * Public API for generating a URL pathname from a path and parameters.\n */\n\n\nfunction generatePath(path, params) {\n  if (path === void 0) {\n    path = \"/\";\n  }\n\n  if (params === void 0) {\n    params = {};\n  }\n\n  return path === \"/\" ? path : compilePath(path)(params, {\n    pretty: true\n  });\n}\n\n/**\n * The public API for navigating programmatically with a component.\n */\n\nfunction Redirect(_ref) {\n  var computedMatch = _ref.computedMatch,\n      to = _ref.to,\n      _ref$push = _ref.push,\n      push = _ref$push === void 0 ? false : _ref$push;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Redirect> outside a <Router>\") : undefined : void 0;\n    var history = context.history,\n        staticContext = context.staticContext;\n    var method = push ? history.push : history.replace;\n    var location = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(computedMatch ? typeof to === \"string\" ? generatePath(to, computedMatch.params) : Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, to, {\n      pathname: generatePath(to.pathname, computedMatch.params)\n    }) : to); // When rendering in a static context,\n    // set the new location immediately.\n\n    if (staticContext) {\n      method(location);\n      return null;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Lifecycle, {\n      onMount: function onMount() {\n        method(location);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        var prevLocation = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(prevProps.to);\n\n        if (!Object(history__WEBPACK_IMPORTED_MODULE_3__[\"locationsAreEqual\"])(prevLocation, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n          key: prevLocation.key\n        }))) {\n          method(location);\n        }\n      },\n      to: to\n    });\n  });\n}\n\nif (true) {\n  Redirect.propTypes = {\n    push: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    from: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,\n    to: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object]).isRequired\n  };\n}\n\nvar cache$1 = {};\nvar cacheLimit$1 = 10000;\nvar cacheCount$1 = 0;\n\nfunction compilePath$1(path, options) {\n  var cacheKey = \"\" + options.end + options.strict + options.sensitive;\n  var pathCache = cache$1[cacheKey] || (cache$1[cacheKey] = {});\n  if (pathCache[path]) return pathCache[path];\n  var keys = [];\n  var regexp = path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default()(path, keys, options);\n  var result = {\n    regexp: regexp,\n    keys: keys\n  };\n\n  if (cacheCount$1 < cacheLimit$1) {\n    pathCache[path] = result;\n    cacheCount$1++;\n  }\n\n  return result;\n}\n/**\n * Public API for matching a URL pathname to a path.\n */\n\n\nfunction matchPath(pathname, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  if (typeof options === \"string\" || Array.isArray(options)) {\n    options = {\n      path: options\n    };\n  }\n\n  var _options = options,\n      path = _options.path,\n      _options$exact = _options.exact,\n      exact = _options$exact === void 0 ? false : _options$exact,\n      _options$strict = _options.strict,\n      strict = _options$strict === void 0 ? false : _options$strict,\n      _options$sensitive = _options.sensitive,\n      sensitive = _options$sensitive === void 0 ? false : _options$sensitive;\n  var paths = [].concat(path);\n  return paths.reduce(function (matched, path) {\n    if (!path && path !== \"\") return null;\n    if (matched) return matched;\n\n    var _compilePath = compilePath$1(path, {\n      end: exact,\n      strict: strict,\n      sensitive: sensitive\n    }),\n        regexp = _compilePath.regexp,\n        keys = _compilePath.keys;\n\n    var match = regexp.exec(pathname);\n    if (!match) return null;\n    var url = match[0],\n        values = match.slice(1);\n    var isExact = pathname === url;\n    if (exact && !isExact) return null;\n    return {\n      path: path,\n      // the path used to match\n      url: path === \"/\" && url === \"\" ? \"/\" : url,\n      // the matched portion of the URL\n      isExact: isExact,\n      // whether or not we matched exactly\n      params: keys.reduce(function (memo, key, index) {\n        memo[key.name] = values[index];\n        return memo;\n      }, {})\n    };\n  }, null);\n}\n\nfunction isEmptyChildren(children) {\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.Children.count(children) === 0;\n}\n\nfunction evalChildrenDev(children, props, path) {\n  var value = children(props);\n   true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(value !== undefined, \"You returned `undefined` from the `children` function of \" + (\"<Route\" + (path ? \" path=\\\"\" + path + \"\\\"\" : \"\") + \">, but you \") + \"should have returned a React element or `null`\") : undefined;\n  return value || null;\n}\n/**\n * The public API for matching a single path and rendering.\n */\n\n\nvar Route =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Route, _React$Component);\n\n  function Route() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Route.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context$1) {\n      !context$1 ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Route> outside a <Router>\") : undefined : void 0;\n      var location = _this.props.location || context$1.location;\n      var match = _this.props.computedMatch ? _this.props.computedMatch // <Switch> already computed the match for us\n      : _this.props.path ? matchPath(location.pathname, _this.props) : context$1.match;\n\n      var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, context$1, {\n        location: location,\n        match: match\n      });\n\n      var _this$props = _this.props,\n          children = _this$props.children,\n          component = _this$props.component,\n          render = _this$props.render; // Preact uses an empty array as children by\n      // default, so use null if that's the case.\n\n      if (Array.isArray(children) && children.length === 0) {\n        children = null;\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Provider, {\n        value: props\n      }, props.match ? children ? typeof children === \"function\" ?  true ? evalChildrenDev(children, props, _this.props.path) : undefined : children : component ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(component, props) : render ? render(props) : null : typeof children === \"function\" ?  true ? evalChildrenDev(children, props, _this.props.path) : undefined : null);\n    });\n  };\n\n  return Route;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Route.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node]),\n    component: function component(props, propName) {\n      if (props[propName] && !Object(react_is__WEBPACK_IMPORTED_MODULE_9__[\"isValidElementType\"])(props[propName])) {\n        return new Error(\"Invalid prop 'component' supplied to 'Route': the prop is not a valid React component\");\n      }\n    },\n    exact: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,\n    path: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string)]),\n    render: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n    sensitive: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    strict: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool\n  };\n\n  Route.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.component), \"You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored\") : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.render), \"You should not use <Route render> and <Route children> in the same route; <Route render> will be ignored\") : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.component && this.props.render), \"You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored\") : undefined;\n  };\n\n  Route.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.location && !prevProps.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(!this.props.location && prevProps.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : undefined;\n  };\n}\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === \"/\" ? path : \"/\" + path;\n}\n\nfunction addBasename(basename, location) {\n  if (!basename) return location;\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n    pathname: addLeadingSlash(basename) + location.pathname\n  });\n}\n\nfunction stripBasename(basename, location) {\n  if (!basename) return location;\n  var base = addLeadingSlash(basename);\n  if (location.pathname.indexOf(base) !== 0) return location;\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n    pathname: location.pathname.substr(base.length)\n  });\n}\n\nfunction createURL(location) {\n  return typeof location === \"string\" ? location : Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createPath\"])(location);\n}\n\nfunction staticHandler(methodName) {\n  return function () {\n      true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You cannot %s with <StaticRouter>\", methodName) : undefined ;\n  };\n}\n\nfunction noop() {}\n/**\n * The public top-level API for a \"static\" <Router>, so-called because it\n * can't actually change the current location. Instead, it just records\n * location changes in a context object. Useful mainly in testing and\n * server-rendering scenarios.\n */\n\n\nvar StaticRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(StaticRouter, _React$Component);\n\n  function StaticRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n    _this.handlePush = function (location) {\n      return _this.navigateTo(location, \"PUSH\");\n    };\n\n    _this.handleReplace = function (location) {\n      return _this.navigateTo(location, \"REPLACE\");\n    };\n\n    _this.handleListen = function () {\n      return noop;\n    };\n\n    _this.handleBlock = function () {\n      return noop;\n    };\n\n    return _this;\n  }\n\n  var _proto = StaticRouter.prototype;\n\n  _proto.navigateTo = function navigateTo(location, action) {\n    var _this$props = this.props,\n        _this$props$basename = _this$props.basename,\n        basename = _this$props$basename === void 0 ? \"\" : _this$props$basename,\n        _this$props$context = _this$props.context,\n        context = _this$props$context === void 0 ? {} : _this$props$context;\n    context.action = action;\n    context.location = addBasename(basename, Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(location));\n    context.url = createURL(context.location);\n  };\n\n  _proto.render = function render() {\n    var _this$props2 = this.props,\n        _this$props2$basename = _this$props2.basename,\n        basename = _this$props2$basename === void 0 ? \"\" : _this$props2$basename,\n        _this$props2$context = _this$props2.context,\n        context = _this$props2$context === void 0 ? {} : _this$props2$context,\n        _this$props2$location = _this$props2.location,\n        location = _this$props2$location === void 0 ? \"/\" : _this$props2$location,\n        rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(_this$props2, [\"basename\", \"context\", \"location\"]);\n\n    var history = {\n      createHref: function createHref(path) {\n        return addLeadingSlash(basename + createURL(path));\n      },\n      action: \"POP\",\n      location: stripBasename(basename, Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(location)),\n      push: this.handlePush,\n      replace: this.handleReplace,\n      go: staticHandler(\"go\"),\n      goBack: staticHandler(\"goBack\"),\n      goForward: staticHandler(\"goForward\"),\n      listen: this.handleListen,\n      block: this.handleBlock\n    };\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Router, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, rest, {\n      history: history,\n      staticContext: context\n    }));\n  };\n\n  return StaticRouter;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  StaticRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,\n    context: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object])\n  };\n\n  StaticRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!this.props.history, \"<StaticRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { StaticRouter as Router }`.\") : undefined;\n  };\n}\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\n\nvar Switch =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Switch, _React$Component);\n\n  function Switch() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Switch.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n      !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Switch> outside a <Router>\") : undefined : void 0;\n      var location = _this.props.location || context.location;\n      var element, match; // We use React.Children.forEach instead of React.Children.toArray().find()\n      // here because toArray adds keys to all child elements and we do not want\n      // to trigger an unmount/remount for two <Route>s that render the same\n      // component at different URLs.\n\n      react__WEBPACK_IMPORTED_MODULE_1___default.a.Children.forEach(_this.props.children, function (child) {\n        if (match == null && react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(child)) {\n          element = child;\n          var path = child.props.path || child.props.from;\n          match = path ? matchPath(location.pathname, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, child.props, {\n            path: path\n          })) : context.match;\n        }\n      });\n      return match ? react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(element, {\n        location: location,\n        computedMatch: match\n      }) : null;\n    });\n  };\n\n  return Switch;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Switch.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  };\n\n  Switch.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.location && !prevProps.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(!this.props.location && prevProps.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : undefined;\n  };\n}\n\n/**\n * A public higher-order component to access the imperative API\n */\n\nfunction withRouter(Component) {\n  var displayName = \"withRouter(\" + (Component.displayName || Component.name) + \")\";\n\n  var C = function C(props) {\n    var wrappedComponentRef = props.wrappedComponentRef,\n        remainingProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(props, [\"wrappedComponentRef\"]);\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n      !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <\" + displayName + \" /> outside a <Router>\") : undefined : void 0;\n      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, remainingProps, context, {\n        ref: wrappedComponentRef\n      }));\n    });\n  };\n\n  C.displayName = displayName;\n  C.WrappedComponent = Component;\n\n  if (true) {\n    C.propTypes = {\n      wrappedComponentRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object])\n    };\n  }\n\n  return hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11___default()(C, Component);\n}\n\nvar useContext = react__WEBPACK_IMPORTED_MODULE_1___default.a.useContext;\nfunction useHistory() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useHistory()\") : undefined : void 0;\n  }\n\n  return useContext(historyContext);\n}\nfunction useLocation() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useLocation()\") : undefined : void 0;\n  }\n\n  return useContext(context).location;\n}\nfunction useParams() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useParams()\") : undefined : void 0;\n  }\n\n  var match = useContext(context).match;\n  return match ? match.params : {};\n}\nfunction useRouteMatch(path) {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useRouteMatch()\") : undefined : void 0;\n  }\n\n  var location = useLocation();\n  var match = useContext(context).match;\n  return path ? matchPath(location.pathname, path) : match;\n}\n\nif (true) {\n  if (typeof window !== \"undefined\") {\n    var global = window;\n    var key = \"__react_router_build__\";\n    var buildNames = {\n      cjs: \"CommonJS\",\n      esm: \"ES modules\",\n      umd: \"UMD\"\n    };\n\n    if (global[key] && global[key] !== \"esm\") {\n      var initialBuildName = buildNames[global[key]];\n      var secondaryBuildName = buildNames[\"esm\"]; // TODO: Add link to article that explains in detail how to avoid\n      // loading 2 different builds.\n\n      throw new Error(\"You are loading the \" + secondaryBuildName + \" build of React Router \" + (\"on a page that is already running the \" + initialBuildName + \" \") + \"build, so things won't work right.\");\n    }\n\n    global[key] = \"esm\";\n  }\n}\n\n\n//# sourceMappingURL=react-router.js.map\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-router/esm/react-router.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-sound/lib/index.js":
-/*!***********************************************************!*\
-  !*** ./jaas-client/node_modules/react-sound/lib/index.js ***!
-  \***********************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar pendingCalls = [];\nvar initialized = false;\n\nvar soundManager = void 0;\n// Allow server side rendering\nif (typeof window !== 'undefined') {\n  if (true) {\n    var _require = __webpack_require__(/*! soundmanager2 */ \"./jaas-client/node_modules/soundmanager2/script/soundmanager2.js\");\n\n    soundManager = _require.soundManager;\n  } else { var _require2; }\n\n  soundManager.onready(function () {\n    pendingCalls.slice().forEach(function (cb) {\n      return cb();\n    });\n  });\n}\n\nfunction _createSound(options, cb) {\n  if (soundManager.ok()) {\n    cb(soundManager.createSound(options));\n    return function () {};\n  } else {\n    if (!initialized) {\n      initialized = true;\n      soundManager.beginDelayedInit();\n    }\n\n    var call = function call() {\n      cb(soundManager.createSound(options));\n    };\n\n    pendingCalls.push(call);\n\n    return function () {\n      pendingCalls.splice(pendingCalls.indexOf(call), 1);\n    };\n  }\n}\n\nfunction noop() {}\n\nvar playStatuses = {\n  PLAYING: 'PLAYING',\n  STOPPED: 'STOPPED',\n  PAUSED: 'PAUSED'\n};\n\nvar Sound = function (_React$Component) {\n  _inherits(Sound, _React$Component);\n\n  function Sound() {\n    _classCallCheck(this, Sound);\n\n    return _possibleConstructorReturn(this, (Sound.__proto__ || Object.getPrototypeOf(Sound)).apply(this, arguments));\n  }\n\n  _createClass(Sound, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      this.createSound(function (sound) {\n        return _this2.updateSound(sound);\n      });\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.removeSound();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps) {\n      var _this3 = this;\n\n      if (this.props.url !== prevProps.url) {\n        this.createSound(function (sound) {\n          return _this3.updateSound(sound, prevProps);\n        });\n      } else {\n        this.updateSound(this.sound);\n      }\n    }\n  }, {\n    key: 'updateSound',\n    value: function updateSound(sound) {\n      var prevProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (!sound) {\n        return;\n      }\n\n      if (this.props.playStatus === playStatuses.PLAYING) {\n        if (sound.playState === 0) {\n          sound.play();\n        }\n\n        if (sound.paused) {\n          sound.resume();\n        }\n      } else if (this.props.playStatus === playStatuses.STOPPED) {\n        if (sound.playState !== 0) {\n          sound.stop();\n        }\n      } else {\n        // this.props.playStatus === playStatuses.PAUSED\n        if (!sound.paused) {\n          sound.pause();\n        }\n      }\n\n      if (this.props.playFromPosition != null) {\n        if (this.props.playFromPosition !== prevProps.playFromPosition) {\n          sound.setPosition(this.props.playFromPosition);\n        }\n      }\n\n      if (this.props.position != null) {\n        if (sound.position !== this.props.position && Math.round(sound.position) !== Math.round(this.props.position)) {\n\n          sound.setPosition(this.props.position);\n        }\n      }\n\n      if (this.props.volume !== prevProps.volume) {\n        sound.setVolume(this.props.volume);\n      }\n\n      if (this.props.playbackRate !== prevProps.playbackRate) {\n        sound.setPlaybackRate(this.props.playbackRate);\n      }\n    }\n  }, {\n    key: 'createSound',\n    value: function createSound(callback) {\n      var _this4 = this;\n\n      this.removeSound();\n\n      var instance = this;\n\n      if (!this.props.url) {\n        return;\n      }\n\n      this.stopCreatingSound = _createSound({\n        url: this.props.url,\n        autoLoad: this.props.autoLoad,\n        volume: this.props.volume,\n        position: this.props.playFromPosition || this.props.position || 0,\n        playbackRate: this.props.playbackRate,\n        whileloading: function whileloading() {\n          instance.props.onLoading(this);\n        },\n        whileplaying: function whileplaying() {\n          instance.props.onPlaying(this);\n        },\n        onerror: function onerror(errorCode, description) {\n          instance.props.onError(errorCode, description, this);\n        },\n        onload: function onload() {\n          instance.props.onLoad(this);\n        },\n        onpause: function onpause() {\n          instance.props.onPause(this);\n        },\n        onresume: function onresume() {\n          instance.props.onResume(this);\n        },\n        onstop: function onstop() {\n          instance.props.onStop(this);\n        },\n        onfinish: function onfinish() {\n          if (instance.props.loop && instance.props.playStatus === playStatuses.PLAYING) {\n            instance.sound.play();\n          } else {\n            instance.props.onFinishedPlaying();\n          }\n        },\n        onbufferchange: function onbufferchange() {\n          instance.props.onBufferChange(this.isBuffering);\n        }\n      }, function (sound) {\n        _this4.sound = sound;\n        callback(sound);\n      });\n    }\n  }, {\n    key: 'removeSound',\n    value: function removeSound() {\n      if (this.stopCreatingSound) {\n        this.stopCreatingSound();\n        delete this.stopCreatingSound;\n      }\n\n      if (this.sound) {\n        try {\n          this.sound.destruct();\n        } catch (e) {} // eslint-disable-line\n\n        delete this.sound;\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Sound;\n}(_react2.default.Component);\n\nSound.status = playStatuses;\nSound.propTypes = {\n  url: _propTypes2.default.string.isRequired,\n  playStatus: _propTypes2.default.oneOf(Object.keys(playStatuses)).isRequired,\n  position: _propTypes2.default.number,\n  playFromPosition: _propTypes2.default.number,\n  volume: _propTypes2.default.number,\n  playbackRate: _propTypes2.default.number,\n  onError: _propTypes2.default.func,\n  onLoading: _propTypes2.default.func,\n  onLoad: _propTypes2.default.func,\n  onPlaying: _propTypes2.default.func,\n  onPause: _propTypes2.default.func,\n  onResume: _propTypes2.default.func,\n  onStop: _propTypes2.default.func,\n  onFinishedPlaying: _propTypes2.default.func,\n  onBufferChange: _propTypes2.default.func,\n  autoLoad: _propTypes2.default.bool,\n  loop: _propTypes2.default.bool\n};\nSound.defaultProps = {\n  volume: 100,\n  playbackRate: 1,\n  onError: noop,\n  onLoading: noop,\n  onPlaying: noop,\n  onLoad: noop,\n  onPause: noop,\n  onResume: noop,\n  onStop: noop,\n  onFinishedPlaying: noop,\n  onBufferChange: noop,\n  autoLoad: false,\n  loop: false\n};\nexports.default = Sound;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-sound/lib/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js":
-/*!******************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js ***!
-  \******************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var dom_helpers_addClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dom-helpers/addClass */ \"./jaas-client/node_modules/dom-helpers/esm/addClass.js\");\n/* harmony import */ var dom_helpers_removeClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! dom-helpers/removeClass */ \"./jaas-client/node_modules/dom-helpers/esm/removeClass.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony import */ var _utils_PropTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/PropTypes */ \"./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js\");\n\n\n\n\n\n\n\n\n\n\nvar _addClass = function addClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return Object(dom_helpers_addClass__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(node, c);\n  });\n};\n\nvar removeClass = function removeClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return Object(dom_helpers_removeClass__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(node, c);\n  });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n *         <div>\n *           {\"I'll receive my-node-* classes\"}\n *         </div>\n *       </CSSTransition>\n *       <button type=\"button\" onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n *   opacity: 0;\n * }\n * .my-node-enter-active {\n *   opacity: 1;\n *   transition: opacity 200ms;\n * }\n * .my-node-exit {\n *   opacity: 1;\n * }\n * .my-node-exit-active {\n *   opacity: 0;\n *   transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(CSSTransition, _React$Component);\n\n  function CSSTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.appliedClasses = {\n      appear: {},\n      enter: {},\n      exit: {}\n    };\n\n    _this.onEnter = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument[0],\n          appearing = _this$resolveArgument[1];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n      if (_this.props.onEnter) {\n        _this.props.onEnter(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntering = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument2[0],\n          appearing = _this$resolveArgument2[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.addClass(node, type, 'active');\n\n      if (_this.props.onEntering) {\n        _this.props.onEntering(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntered = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument3[0],\n          appearing = _this$resolveArgument3[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.removeClasses(node, type);\n\n      _this.addClass(node, type, 'done');\n\n      if (_this.props.onEntered) {\n        _this.props.onEntered(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onExit = function (maybeNode) {\n      var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument4[0];\n\n      _this.removeClasses(node, 'appear');\n\n      _this.removeClasses(node, 'enter');\n\n      _this.addClass(node, 'exit', 'base');\n\n      if (_this.props.onExit) {\n        _this.props.onExit(maybeNode);\n      }\n    };\n\n    _this.onExiting = function (maybeNode) {\n      var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument5[0];\n\n      _this.addClass(node, 'exit', 'active');\n\n      if (_this.props.onExiting) {\n        _this.props.onExiting(maybeNode);\n      }\n    };\n\n    _this.onExited = function (maybeNode) {\n      var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument6[0];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, 'exit', 'done');\n\n      if (_this.props.onExited) {\n        _this.props.onExited(maybeNode);\n      }\n    };\n\n    _this.resolveArguments = function (maybeNode, maybeAppearing) {\n      return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n      : [maybeNode, maybeAppearing];\n    };\n\n    _this.getClassNames = function (type) {\n      var classNames = _this.props.classNames;\n      var isStringClassNames = typeof classNames === 'string';\n      var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n      var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n      var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n      var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n      return {\n        baseClassName: baseClassName,\n        activeClassName: activeClassName,\n        doneClassName: doneClassName\n      };\n    };\n\n    return _this;\n  }\n\n  var _proto = CSSTransition.prototype;\n\n  _proto.addClass = function addClass(node, type, phase) {\n    var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n    var _this$getClassNames = this.getClassNames('enter'),\n        doneClassName = _this$getClassNames.doneClassName;\n\n    if (type === 'appear' && phase === 'done' && doneClassName) {\n      className += \" \" + doneClassName;\n    } // This is for to force a repaint,\n    // which is necessary in order to transition styles when adding a class name.\n\n\n    if (phase === 'active') {\n      /* eslint-disable no-unused-expressions */\n      node && node.scrollTop;\n    }\n\n    if (className) {\n      this.appliedClasses[type][phase] = className;\n\n      _addClass(node, className);\n    }\n  };\n\n  _proto.removeClasses = function removeClasses(node, type) {\n    var _this$appliedClasses$ = this.appliedClasses[type],\n        baseClassName = _this$appliedClasses$.base,\n        activeClassName = _this$appliedClasses$.active,\n        doneClassName = _this$appliedClasses$.done;\n    this.appliedClasses[type] = {};\n\n    if (baseClassName) {\n      removeClass(node, baseClassName);\n    }\n\n    if (activeClassName) {\n      removeClass(node, activeClassName);\n    }\n\n    if (doneClassName) {\n      removeClass(node, doneClassName);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        _ = _this$props.classNames,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_this$props, [\"classNames\"]);\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_Transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, props, {\n      onEnter: this.onEnter,\n      onEntered: this.onEntered,\n      onEntering: this.onEntering,\n      onExit: this.onExit,\n      onExiting: this.onExiting,\n      onExited: this.onExited\n    }));\n  };\n\n  return CSSTransition;\n}(react__WEBPACK_IMPORTED_MODULE_6___default.a.Component);\n\nCSSTransition.defaultProps = {\n  classNames: ''\n};\nCSSTransition.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _Transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"].propTypes, {\n  /**\n   * The animation classNames applied to the component as it appears, enters,\n   * exits or has finished the transition. A single name can be provided, which\n   * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n   *\n   * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n   * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n   * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n   *\n   * A few details to note about how these classes are applied:\n   *\n   * 1. They are _joined_ with the ones that are already defined on the child\n   *    component, so if you want to add some base styles, you can use\n   *    `className` without worrying that it will be overridden.\n   *\n   * 2. If the transition component mounts with `in={false}`, no classes are\n   *    applied yet. You might be expecting `*-exit-done`, but if you think\n   *    about it, a component cannot finish exiting if it hasn't entered yet.\n   *\n   * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n   *    allows you to define different behavior for when appearing is done and\n   *    when regular entering is done, using selectors like\n   *    `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n   *    an epic entrance animation when element first appears in the DOM using\n   *    [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n   *    simply use `fade-enter-done` for defining both cases.\n   *\n   * Each individual classNames can also be specified independently like:\n   *\n   * ```js\n   * classNames={{\n   *  appear: 'my-appear',\n   *  appearActive: 'my-active-appear',\n   *  appearDone: 'my-done-appear',\n   *  enter: 'my-enter',\n   *  enterActive: 'my-active-enter',\n   *  enterDone: 'my-done-enter',\n   *  exit: 'my-exit',\n   *  exitActive: 'my-active-exit',\n   *  exitDone: 'my-done-exit',\n   * }}\n   * ```\n   *\n   * If you want to set these classes using CSS Modules:\n   *\n   * ```js\n   * import styles from './styles.css';\n   * ```\n   *\n   * you might want to use camelCase in your CSS file, that way could simply\n   * spread them instead of listing them one by one:\n   *\n   * ```js\n   * classNames={{ ...styles }}\n   * ```\n   *\n   * @type {string | {\n   *  appear?: string,\n   *  appearActive?: string,\n   *  appearDone?: string,\n   *  enter?: string,\n   *  enterActive?: string,\n   *  enterDone?: string,\n   *  exit?: string,\n   *  exitActive?: string,\n   *  exitDone?: string,\n   * }}\n   */\n  classNames: _utils_PropTypes__WEBPACK_IMPORTED_MODULE_8__[\"classNamesShape\"],\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter-active' or\n   * 'appear-active' class is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or\n   * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' classes\n   * are **removed** and the `exit-done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func\n}) : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (CSSTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js":
-/*!**********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js ***!
-  \**********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TransitionGroup */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js\");\n\n\n\n\n\n\n/**\n * The `<ReplaceTransition>` component is a specialized `Transition` component\n * that animates between two children.\n *\n * ```jsx\n * <ReplaceTransition in>\n *   <Fade><div>I appear first</div></Fade>\n *   <Fade><div>I replace the above</div></Fade>\n * </ReplaceTransition>\n * ```\n */\n\nvar ReplaceTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(ReplaceTransition, _React$Component);\n\n  function ReplaceTransition() {\n    var _this;\n\n    for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n      _args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n    _this.handleEnter = function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.handleLifecycle('onEnter', 0, args);\n    };\n\n    _this.handleEntering = function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.handleLifecycle('onEntering', 0, args);\n    };\n\n    _this.handleEntered = function () {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.handleLifecycle('onEntered', 0, args);\n    };\n\n    _this.handleExit = function () {\n      for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.handleLifecycle('onExit', 1, args);\n    };\n\n    _this.handleExiting = function () {\n      for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.handleLifecycle('onExiting', 1, args);\n    };\n\n    _this.handleExited = function () {\n      for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n        args[_key7] = arguments[_key7];\n      }\n\n      return _this.handleLifecycle('onExited', 1, args);\n    };\n\n    return _this;\n  }\n\n  var _proto = ReplaceTransition.prototype;\n\n  _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n    var _child$props;\n\n    var children = this.props.children;\n    var child = react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.toArray(children)[idx];\n    if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n\n    if (this.props[handler]) {\n      var maybeNode = child.props.nodeRef ? undefined : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this);\n      this.props[handler](maybeNode);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        inProp = _this$props.in,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"children\", \"in\"]);\n\n    var _React$Children$toArr = react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.toArray(children),\n        first = _React$Children$toArr[0],\n        second = _React$Children$toArr[1];\n\n    delete props.onEnter;\n    delete props.onEntering;\n    delete props.onEntered;\n    delete props.onExit;\n    delete props.onExiting;\n    delete props.onExited;\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TransitionGroup__WEBPACK_IMPORTED_MODULE_5__[\"default\"], props, inProp ? react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(first, {\n      key: 'first',\n      onEnter: this.handleEnter,\n      onEntering: this.handleEntering,\n      onEntered: this.handleEntered\n    }) : react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(second, {\n      key: 'second',\n      onEnter: this.handleExit,\n      onEntering: this.handleExiting,\n      onEntered: this.handleExited\n    }));\n  };\n\n  return ReplaceTransition;\n}(react__WEBPACK_IMPORTED_MODULE_3___default.a.Component);\n\nReplaceTransition.propTypes =  true ? {\n  in: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,\n  children: function children(props, propName) {\n    if (react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n    return null;\n  }\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (ReplaceTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js ***!
-  \*********************************************************************************/
-/*! exports provided: modes, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"modes\", function() { return modes; });\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n\n\nvar _leaveRenders, _enterRenders;\n\n\n\n\n\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n  if (oldChildren === newChildren) return false;\n\n  if (react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(oldChildren) && react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n    return false;\n  }\n\n  return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nvar modes = {\n  out: 'out-in',\n  in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n  return function () {\n    var _element$props;\n\n    element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n    cb();\n  };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n  var current = _ref.current,\n      changeState = _ref.changeState;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"], null);\n    })\n  });\n}, _leaveRenders[modes.in] = function (_ref2) {\n  var current = _ref2.current,\n      changeState = _ref2.changeState,\n      children = _ref2.children;\n  return [current, react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]);\n    })\n  })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n  var children = _ref3.children,\n      changeState = _ref3.changeState;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"], react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n        in: true\n      }));\n    })\n  });\n}, _enterRenders[modes.in] = function (_ref4) {\n  var current = _ref4.current,\n      children = _ref4.children,\n      changeState = _ref4.changeState;\n  return [react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"], react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n        in: true\n      }));\n    })\n  }), react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true\n  })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n *  const [state, setState] = useState(false);\n *  return (\n *    <SwitchTransition>\n *      <CSSTransition\n *        key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n *        classNames='fade'\n *      >\n *        <button onClick={() => setState(state => !state)}>\n *          {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        </button>\n *      </CSSTransition>\n *    </SwitchTransition>\n *  );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n *    opacity: 0;\n * }\n * .fade-exit{\n *    opacity: 1;\n * }\n * .fade-enter-active{\n *    opacity: 1;\n * }\n * .fade-exit-active{\n *    opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n *    transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(SwitchTransition, _React$Component);\n\n  function SwitchTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.state = {\n      status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"],\n      current: null\n    };\n    _this.appeared = false;\n\n    _this.changeState = function (status, current) {\n      if (current === void 0) {\n        current = _this.state.current;\n      }\n\n      _this.setState({\n        status: status,\n        current: current\n      });\n    };\n\n    return _this;\n  }\n\n  var _proto = SwitchTransition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.appeared = true;\n  };\n\n  SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n    if (props.children == null) {\n      return {\n        current: null\n      };\n    }\n\n    if (state.status === _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"] && props.mode === modes.in) {\n      return {\n        status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]\n      };\n    }\n\n    if (state.current && areChildrenDifferent(state.current, props.children)) {\n      return {\n        status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"EXITING\"]\n      };\n    }\n\n    return {\n      current: react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(props.children, {\n        in: true\n      })\n    };\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        mode = _this$props.mode,\n        _this$state = this.state,\n        status = _this$state.status,\n        current = _this$state.current;\n    var data = {\n      children: children,\n      current: current,\n      changeState: this.changeState,\n      status: status\n    };\n    var component;\n\n    switch (status) {\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]:\n        component = enterRenders[mode](data);\n        break;\n\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"EXITING\"]:\n        component = leaveRenders[mode](data);\n        break;\n\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"]:\n        component = current;\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Provider, {\n      value: {\n        isMounting: !this.appeared\n      }\n    }, component);\n  };\n\n  return SwitchTransition;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nSwitchTransition.propTypes =  true ? {\n  /**\n   * Transition modes.\n   * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n   * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n   *\n   * @type {'out-in'|'in-out'}\n   */\n  mode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf([modes.in, modes.out]),\n\n  /**\n   * Any `Transition` or `CSSTransition` component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element.isRequired])\n} : undefined;\nSwitchTransition.defaultProps = {\n  mode: modes.out\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SwitchTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/Transition.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/Transition.js ***!
-  \***************************************************************************/
-/*! exports provided: UNMOUNTED, EXITED, ENTERING, ENTERED, EXITING, default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UNMOUNTED\", function() { return UNMOUNTED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EXITED\", function() { return EXITED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ENTERING\", function() { return ENTERING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ENTERED\", function() { return ENTERED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EXITING\", function() { return EXITING; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ \"./jaas-client/node_modules/react-transition-group/esm/config.js\");\n/* harmony import */ var _utils_PropTypes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/PropTypes */ \"./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js\");\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n\n\n\n\n\n\n\n\nvar UNMOUNTED = 'unmounted';\nvar EXITED = 'exited';\nvar ENTERING = 'entering';\nvar ENTERED = 'entered';\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 1 },\n *   entered:  { opacity: 1 },\n *   exiting:  { opacity: 0 },\n *   exited:  { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {state => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm a fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n *  - `'entering'`\n *  - `'entered'`\n *  - `'exiting'`\n *  - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <Transition in={inProp} timeout={500}>\n *         {state => (\n *           // ...\n *         )}\n *       </Transition>\n *       <button onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Transition, _React$Component);\n\n  function Transition(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n    var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n    var initialStatus;\n    _this.appearStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.appearStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = {\n      status: initialStatus\n    };\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var nextIn = _ref.in;\n\n    if (nextIn && prevState.status === UNMOUNTED) {\n      return {\n        status: EXITED\n      };\n    }\n\n    return null;\n  } // getSnapshotBeforeUpdate(prevProps) {\n  //   let nextStatus = null\n  //   if (prevProps !== this.props) {\n  //     const { status } = this.state\n  //     if (this.props.in) {\n  //       if (status !== ENTERING && status !== ENTERED) {\n  //         nextStatus = ENTERING\n  //       }\n  //     } else {\n  //       if (status === ENTERING || status === ENTERED) {\n  //         nextStatus = EXITING\n  //       }\n  //     }\n  //   }\n  //   return { nextStatus }\n  // }\n  ;\n\n  var _proto = Transition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.updateStatus(true, this.appearStatus);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var nextStatus = null;\n\n    if (prevProps !== this.props) {\n      var status = this.state.status;\n\n      if (this.props.in) {\n        if (status !== ENTERING && status !== ENTERED) {\n          nextStatus = ENTERING;\n        }\n      } else {\n        if (status === ENTERING || status === ENTERED) {\n          nextStatus = EXITING;\n        }\n      }\n    }\n\n    this.updateStatus(false, nextStatus);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  _proto.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n    var exit, enter, appear;\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter; // TODO: remove fallback for next major\n\n      appear = timeout.appear !== undefined ? timeout.appear : enter;\n    }\n\n    return {\n      exit: exit,\n      enter: enter,\n      appear: appear\n    };\n  };\n\n  _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n    if (mounting === void 0) {\n      mounting = false;\n    }\n\n    if (nextStatus !== null) {\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n\n      if (nextStatus === ENTERING) {\n        this.performEnter(mounting);\n      } else {\n        this.performExit();\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({\n        status: UNMOUNTED\n      });\n    }\n  };\n\n  _proto.performEnter = function performEnter(mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n    var appearing = this.context ? this.context.isMounting : mounting;\n\n    var _ref2 = this.props.nodeRef ? [appearing] : [react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this), appearing],\n        maybeNode = _ref2[0],\n        maybeAppearing = _ref2[1];\n\n    var timeouts = this.getTimeouts();\n    var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n\n    if (!mounting && !enter || _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"].disabled) {\n      this.safeSetState({\n        status: ENTERED\n      }, function () {\n        _this2.props.onEntered(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onEnter(maybeNode, maybeAppearing);\n    this.safeSetState({\n      status: ENTERING\n    }, function () {\n      _this2.props.onEntering(maybeNode, maybeAppearing);\n\n      _this2.onTransitionEnd(enterTimeout, function () {\n        _this2.safeSetState({\n          status: ENTERED\n        }, function () {\n          _this2.props.onEntered(maybeNode, maybeAppearing);\n        });\n      });\n    });\n  };\n\n  _proto.performExit = function performExit() {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n    var timeouts = this.getTimeouts();\n    var maybeNode = this.props.nodeRef ? undefined : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this); // no exit animation skip right to EXITED\n\n    if (!exit || _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"].disabled) {\n      this.safeSetState({\n        status: EXITED\n      }, function () {\n        _this3.props.onExited(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onExit(maybeNode);\n    this.safeSetState({\n      status: EXITING\n    }, function () {\n      _this3.props.onExiting(maybeNode);\n\n      _this3.onTransitionEnd(timeouts.exit, function () {\n        _this3.safeSetState({\n          status: EXITED\n        }, function () {\n          _this3.props.onExited(maybeNode);\n        });\n      });\n    });\n  };\n\n  _proto.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  _proto.safeSetState = function safeSetState(nextState, callback) {\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, callback);\n  };\n\n  _proto.setNextCallback = function setNextCallback(callback) {\n    var _this4 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this4.nextCallback = null;\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n    this.setNextCallback(handler);\n    var node = this.props.nodeRef ? this.props.nodeRef.current : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this);\n    var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n    if (!node || doesNotHaveTimeoutOrListener) {\n      setTimeout(this.nextCallback, 0);\n      return;\n    }\n\n    if (this.props.addEndListener) {\n      var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n          maybeNode = _ref3[0],\n          maybeNextCallback = _ref3[1];\n\n      this.props.addEndListener(maybeNode, maybeNextCallback);\n    }\n\n    if (timeout != null) {\n      setTimeout(this.nextCallback, timeout);\n    }\n  };\n\n  _proto.render = function render() {\n    var status = this.state.status;\n\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _this$props = this.props,\n        children = _this$props.children,\n        _in = _this$props.in,\n        _mountOnEnter = _this$props.mountOnEnter,\n        _unmountOnExit = _this$props.unmountOnExit,\n        _appear = _this$props.appear,\n        _enter = _this$props.enter,\n        _exit = _this$props.exit,\n        _timeout = _this$props.timeout,\n        _addEndListener = _this$props.addEndListener,\n        _onEnter = _this$props.onEnter,\n        _onEntering = _this$props.onEntering,\n        _onEntered = _this$props.onEntered,\n        _onExit = _this$props.onExit,\n        _onExiting = _this$props.onExiting,\n        _onExited = _this$props.onExited,\n        _nodeRef = _this$props.nodeRef,\n        childProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n    return (\n      /*#__PURE__*/\n      // allows for nested Transitions\n      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n        value: null\n      }, typeof children === 'function' ? children(status, childProps) : react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.only(children), childProps))\n    );\n  };\n\n  return Transition;\n}(react__WEBPACK_IMPORTED_MODULE_3___default.a.Component);\n\nTransition.contextType = _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\nTransition.propTypes =  true ? {\n  /**\n   * A React reference to DOM element that need to transition:\n   * https://stackoverflow.com/a/51127130/4671932\n   *\n   *   - When `nodeRef` prop is used, `node` is not passed to callback functions\n   *      (e.g. `onEnter`) because user already has direct access to the node.\n   *   - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n   *     `nodeRef` need to be provided to `Transition` with changed `key` prop\n   *     (see\n   *     [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n   */\n  nodeRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({\n    current: typeof Element === 'undefined' ? prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.any : prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(Element)\n  }),\n\n  /**\n   * A `function` child can be used instead of a React element. This function is\n   * called with the current transition status (`'entering'`, `'entered'`,\n   * `'exiting'`, `'exited'`), which can be used to apply context\n   * specific props to a component.\n   *\n   * ```jsx\n   * <Transition in={this.state.in} timeout={150}>\n   *   {state => (\n   *     <MyComponent className={`fade fade-${state}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component does not perform the enter transition when\n   * it first mounts, regardless of the value of `in`. If you want this\n   * behavior, set both `appear` and `in` to `true`.\n   *\n   * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n   * > only adds an additional enter transition. However, in the\n   * > `<CSSTransition>` component that first enter transition does result in\n   * > additional `.appear-*` classes, that way you can choose to style it\n   * > differently.\n   */\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEndListener` is provided.\n   *\n   * You may specify a single timeout for all transitions:\n   *\n   * ```jsx\n   * timeout={500}\n   * ```\n   *\n   * or individually:\n   *\n   * ```jsx\n   * timeout={{\n   *  appear: 500,\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * - `appear` defaults to the value of `enter`\n   * - `enter` defaults to `0`\n   * - `exit` defaults to `0`\n   *\n   * @type {number | { enter?: number, exit?: number, appear?: number }}\n   */\n  timeout: function timeout(props) {\n    var pt = _utils_PropTypes__WEBPACK_IMPORTED_MODULE_6__[\"timeoutsShape\"];\n    if (!props.addEndListener) pt = pt.isRequired;\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return pt.apply(void 0, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. Timeouts are still used as a fallback if provided.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n} : undefined; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Transition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/Transition.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js ***!
-  \********************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n/* harmony import */ var _utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/ChildMapping */ \"./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js\");\n\n\n\n\n\n\n\n\n\nvar values = Object.values || function (obj) {\n  return Object.keys(obj).map(function (k) {\n    return obj[k];\n  });\n};\n\nvar defaultProps = {\n  component: 'div',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n/**\n * The `<TransitionGroup>` component manages a set of transition components\n * (`<Transition>` and `<CSSTransition>`) in a list. Like with the transition\n * components, `<TransitionGroup>` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the `<TransitionGroup>`.\n *\n * Note that `<TransitionGroup>`  does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\nvar TransitionGroup = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n\n    var handleExited = _this.handleExited.bind(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_this)); // Initial children should all be entering, dependent on appear\n\n\n    _this.state = {\n      contextValue: {\n        isMounting: true\n      },\n      handleExited: handleExited,\n      firstRender: true\n    };\n    return _this;\n  }\n\n  var _proto = TransitionGroup.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.mounted = true;\n    this.setState({\n      contextValue: {\n        isMounting: false\n      }\n    });\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.mounted = false;\n  };\n\n  TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n    var prevChildMapping = _ref.children,\n        handleExited = _ref.handleExited,\n        firstRender = _ref.firstRender;\n    return {\n      children: firstRender ? Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getInitialChildMapping\"])(nextProps, handleExited) : Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getNextChildMapping\"])(nextProps, prevChildMapping, handleExited),\n      firstRender: false\n    };\n  } // node is `undefined` when user provided `nodeRef` prop\n  ;\n\n  _proto.handleExited = function handleExited(child, node) {\n    var currentChildMapping = Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getChildMapping\"])(this.props.children);\n    if (child.key in currentChildMapping) return;\n\n    if (child.props.onExited) {\n      child.props.onExited(node);\n    }\n\n    if (this.mounted) {\n      this.setState(function (state) {\n        var children = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, state.children);\n\n        delete children[child.key];\n        return {\n          children: children\n        };\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        Component = _this$props.component,\n        childFactory = _this$props.childFactory,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"component\", \"childFactory\"]);\n\n    var contextValue = this.state.contextValue;\n    var children = values(this.state.children).map(childFactory);\n    delete props.appear;\n    delete props.enter;\n    delete props.exit;\n\n    if (Component === null) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n        value: contextValue\n      }, children);\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n      value: contextValue\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(Component, props, children));\n  };\n\n  return TransitionGroup;\n}(react__WEBPACK_IMPORTED_MODULE_5___default.a.Component);\n\nTransitionGroup.propTypes =  true ? {\n  /**\n   * `<TransitionGroup>` renders a `<div>` by default. You can change this\n   * behavior by providing a `component` prop.\n   * If you use React v16+ and would like to avoid a wrapping `<div>` element\n   * you can pass in `component={null}`. This is useful if the wrapping div\n   * borks your css styles.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any,\n\n  /**\n   * A set of `<Transition>` components, that are toggled `in` and out as they\n   * leave. the `<TransitionGroup>` will inject specific transition props, so\n   * remember to spread them through if you are wrapping the `<Transition>` as\n   * with our `<Fade>` example.\n   *\n   * While this component is meant for multiple `Transition` or `CSSTransition`\n   * children, sometimes you may want to have a single transition child with\n   * content that you want to be transitioned out and in when you change it\n   * (e.g. routes, images etc.) In that case you can change the `key` prop of\n   * the transition child as you change its content, this will cause\n   * `TransitionGroup` to transition the child out and back in.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * A convenience prop that enables or disables appear animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A convenience prop that enables or disables enter animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A convenience prop that enables or disables exit animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * You may need to apply reactive updates to a child as it is exiting.\n   * This is generally done by using `cloneElement` however in the case of an exiting\n   * child the element has already been removed and not accessible to the consumer.\n   *\n   * If you do need to update a child as it leaves you can provide a `childFactory`\n   * to wrap every child, even the ones that are leaving.\n   *\n   * @type Function(child: ReactElement) -> ReactElement\n   */\n  childFactory: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func\n} : undefined;\nTransitionGroup.defaultProps = defaultProps;\n/* harmony default export */ __webpack_exports__[\"default\"] = (TransitionGroup);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js":
-/*!***************************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js ***!
-  \***************************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext(null));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/config.js":
-/*!***********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/config.js ***!
-  \***********************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  disabled: false\n});\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/config.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/index.js":
-/*!**********************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/index.js ***!
-  \**********************************************************************/
-/*! exports provided: CSSTransition, ReplaceTransition, SwitchTransition, TransitionGroup, Transition, config */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSSTransition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CSSTransition */ \"./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CSSTransition\", function() { return _CSSTransition__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _ReplaceTransition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ReplaceTransition */ \"./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ReplaceTransition\", function() { return _ReplaceTransition__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _SwitchTransition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SwitchTransition */ \"./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SwitchTransition\", function() { return _SwitchTransition__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TransitionGroup */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TransitionGroup\", function() { return _TransitionGroup__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Transition\", function() { return _Transition__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ \"./jaas-client/node_modules/react-transition-group/esm/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js ***!
-  \***********************************************************************************/
-/*! exports provided: getChildMapping, mergeChildMappings, getInitialChildMapping, getNextChildMapping */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getChildMapping\", function() { return getChildMapping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeChildMappings\", function() { return mergeChildMappings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getInitialChildMapping\", function() { return getInitialChildMapping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getNextChildMapping\", function() { return getNextChildMapping; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\n\nfunction getChildMapping(children, mapFn) {\n  var mapper = function mapper(child) {\n    return mapFn && Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(child) ? mapFn(child) : child;\n  };\n\n  var result = Object.create(null);\n  if (children) react__WEBPACK_IMPORTED_MODULE_0__[\"Children\"].map(children, function (c) {\n    return c;\n  }).forEach(function (child) {\n    // run the map function here instead so that the key is the computed one\n    result[child.key] = mapper(child);\n  });\n  return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nfunction mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    return key in next ? next[key] : prev[key];\n  } // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n\n\n  var nextKeysPending = Object.create(null);\n  var pendingKeys = [];\n\n  for (var prevKey in prev) {\n    if (prevKey in next) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i;\n  var childMapping = {};\n\n  for (var nextKey in next) {\n    if (nextKeysPending[nextKey]) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n\n    childMapping[nextKey] = getValueForKey(nextKey);\n  } // Finally, add the keys which didn't appear before any key in `next`\n\n\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n  return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n  return getChildMapping(props.children, function (child) {\n    return Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n      onExited: onExited.bind(null, child),\n      in: true,\n      appear: getProp(child, 'appear', props),\n      enter: getProp(child, 'enter', props),\n      exit: getProp(child, 'exit', props)\n    });\n  });\n}\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n  var nextChildMapping = getChildMapping(nextProps.children);\n  var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n  Object.keys(children).forEach(function (key) {\n    var child = children[key];\n    if (!Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(child)) return;\n    var hasPrev = (key in prevChildMapping);\n    var hasNext = (key in nextChildMapping);\n    var prevChild = prevChildMapping[key];\n    var isLeaving = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(prevChild) && !prevChild.props.in; // item is new (entering)\n\n    if (hasNext && (!hasPrev || isLeaving)) {\n      // console.log('entering', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        onExited: onExited.bind(null, child),\n        in: true,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    } else if (!hasNext && hasPrev && !isLeaving) {\n      // item is old (exiting)\n      // console.log('leaving', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        in: false\n      });\n    } else if (hasNext && hasPrev && Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(prevChild)) {\n      // item hasn't changed transition states\n      // copy over the last transition props;\n      // console.log('unchanged', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        onExited: onExited.bind(null, child),\n        in: prevChild.props.in,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    }\n  });\n  return children;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js":
-/*!********************************************************************************!*\
-  !*** ./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js ***!
-  \********************************************************************************/
-/*! exports provided: timeoutsShape, classNamesShape */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeoutsShape\", function() { return timeoutsShape; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classNamesShape\", function() { return classNamesShape; });\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar timeoutsShape =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number\n}).isRequired]) : undefined;\nvar classNamesShape =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  active: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string\n}), prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  enterDone: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  enterActive: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exitDone: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exitActive: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string\n})]) : undefined;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react/cjs/react.development.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/react/cjs/react.development.js ***!
-  \*****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v16.13.1\n * react.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar _assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\nvar checkPropTypes = __webpack_require__(/*! prop-types/checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\n\nvar ReactVersion = '16.13.1';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\n/**\n * Keeps track of the current dispatcher.\n */\nvar ReactCurrentDispatcher = {\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n};\n\n/**\n * Keeps track of the current batch's configuration such as how long an update\n * should suspend for if it needs to.\n */\nvar ReactCurrentBatchConfig = {\n  suspense: null\n};\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n};\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n  var sourceInfo = '';\n\n  if (source) {\n    var path = source.fileName;\n    var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n    {\n      // In DEV, include code for a common special case:\n      // prefer \"folder/index.js\" instead of just \"index.js\".\n      if (/^index\\./.test(fileName)) {\n        var match = path.match(BEFORE_SLASH_RE);\n\n        if (match) {\n          var pathBeforeSlash = match[1];\n\n          if (pathBeforeSlash) {\n            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n            fileName = folderName + '/' + fileName;\n          }\n        }\n      }\n    }\n\n    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n  } else if (ownerName) {\n    sourceInfo = ' (created by ' + ownerName + ')';\n  }\n\n  return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n}\n\nvar Resolved = 1;\nfunction refineResolvedLazyComponent(lazyComponent) {\n  return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = innerType.displayName || innerType.name || '';\n  return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        return 'Context.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        return 'Context.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        return getComponentName(type.type);\n\n      case REACT_BLOCK_TYPE:\n        return getComponentName(type.render);\n\n      case REACT_LAZY_TYPE:\n        {\n          var thenable = type;\n          var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n          if (resolvedThenable) {\n            return getComponentName(resolvedThenable);\n          }\n\n          break;\n        }\n    }\n  }\n\n  return null;\n}\n\nvar ReactDebugCurrentFrame = {};\nvar currentlyValidatingElement = null;\nfunction setCurrentlyValidatingElement(element) {\n  {\n    currentlyValidatingElement = element;\n  }\n}\n\n{\n  // Stack implementation injected by the current renderer.\n  ReactDebugCurrentFrame.getCurrentStack = null;\n\n  ReactDebugCurrentFrame.getStackAddendum = function () {\n    var stack = ''; // Add an extra top frame while an element is being validated\n\n    if (currentlyValidatingElement) {\n      var name = getComponentName(currentlyValidatingElement.type);\n      var owner = currentlyValidatingElement._owner;\n      stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));\n    } // Delegate to the injected renderer-specific implementation\n\n\n    var impl = ReactDebugCurrentFrame.getCurrentStack;\n\n    if (impl) {\n      stack += impl() || '';\n    }\n\n    return stack;\n  };\n}\n\n/**\n * Used by act() to track whether you're inside an act() scope.\n */\nvar IsSomeRendererActing = {\n  current: false\n};\n\nvar ReactSharedInternals = {\n  ReactCurrentDispatcher: ReactCurrentDispatcher,\n  ReactCurrentBatchConfig: ReactCurrentBatchConfig,\n  ReactCurrentOwner: ReactCurrentOwner,\n  IsSomeRendererActing: IsSomeRendererActing,\n  // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n  assign: _assign\n};\n\n{\n  _assign(ReactSharedInternals, {\n    // These should not be included in production.\n    ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n    // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n    // TODO: remove in React 17.0.\n    ReactComponentTreeHook: {}\n  });\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n  {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    printWarning('warn', format, args);\n  }\n}\nfunction error(format) {\n  {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    printWarning('error', format, args);\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n    if (!hasExistingStack) {\n      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n      var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n      if (stack !== '') {\n        format += '%s';\n        args = args.concat([stack]);\n      }\n    }\n\n    var argsWithFormat = args.map(function (item) {\n      return '' + item;\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      throw new Error(message);\n    } catch (x) {}\n  }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = {};\n\nfunction warnNoop(publicInstance, callerName) {\n  {\n    var _constructor = publicInstance.constructor;\n    var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';\n    var warningKey = componentName + \".\" + callerName;\n\n    if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n      return;\n    }\n\n    error(\"Can't call %s on a component that is not yet mounted. \" + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);\n\n    didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n  }\n}\n/**\n * This is the abstract API for an update queue.\n */\n\n\nvar ReactNoopUpdateQueue = {\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @param {ReactClass} publicInstance The instance we want to test.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function (publicInstance) {\n    return false;\n  },\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} callerName name of the calling function in the public API.\n   * @internal\n   */\n  enqueueForceUpdate: function (publicInstance, callback, callerName) {\n    warnNoop(publicInstance, 'forceUpdate');\n  },\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} completeState Next state.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} callerName name of the calling function in the public API.\n   * @internal\n   */\n  enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n    warnNoop(publicInstance, 'replaceState');\n  },\n\n  /**\n   * Sets a subset of the state. This only exists because _pendingState is\n   * internal. This provides a merging strategy that is not available to deep\n   * properties which is confusing. TODO: Expose pendingState or don't use it\n   * during the merge.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} partialState Next partial state to be merged with state.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} Name of the calling function in the public API.\n   * @internal\n   */\n  enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n    warnNoop(publicInstance, 'setState');\n  }\n};\n\nvar emptyObject = {};\n\n{\n  Object.freeze(emptyObject);\n}\n/**\n * Base class helpers for the updating state of a component.\n */\n\n\nfunction Component(props, context, updater) {\n  this.props = props;\n  this.context = context; // If a component has string refs, we will assign a different object later.\n\n  this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the\n  // renderer.\n\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nComponent.prototype.isReactComponent = {};\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together.  You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n *        produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\n\nComponent.prototype.setState = function (partialState, callback) {\n  if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {\n    {\n      throw Error( \"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\" );\n    }\n  }\n\n  this.updater.enqueueSetState(this, partialState, callback, 'setState');\n};\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\n\n\nComponent.prototype.forceUpdate = function (callback) {\n  this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n};\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\n\n\n{\n  var deprecatedAPIs = {\n    isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n    replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n  };\n\n  var defineDeprecationWarning = function (methodName, info) {\n    Object.defineProperty(Component.prototype, methodName, {\n      get: function () {\n        warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n\n        return undefined;\n      }\n    });\n  };\n\n  for (var fnName in deprecatedAPIs) {\n    if (deprecatedAPIs.hasOwnProperty(fnName)) {\n      defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n    }\n  }\n}\n\nfunction ComponentDummy() {}\n\nComponentDummy.prototype = Component.prototype;\n/**\n * Convenience component with default shallow equality check for sCU.\n */\n\nfunction PureComponent(props, context, updater) {\n  this.props = props;\n  this.context = context; // If a component has string refs, we will assign a different object later.\n\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nvar pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\npureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.\n\n_assign(pureComponentPrototype, Component.prototype);\n\npureComponentPrototype.isPureReactComponent = true;\n\n// an immutable object with a single mutable value\nfunction createRef() {\n  var refObject = {\n    current: null\n  };\n\n  {\n    Object.seal(refObject);\n  }\n\n  return refObject;\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n  key: true,\n  ref: true,\n  __self: true,\n  __source: true\n};\nvar specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;\n\n{\n  didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n  {\n    if (hasOwnProperty.call(config, 'ref')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n  {\n    if (hasOwnProperty.call(config, 'key')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n  var warnAboutAccessingKey = function () {\n    {\n      if (!specialPropKeyWarningShown) {\n        specialPropKeyWarningShown = true;\n\n        error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n      }\n    }\n  };\n\n  warnAboutAccessingKey.isReactWarning = true;\n  Object.defineProperty(props, 'key', {\n    get: warnAboutAccessingKey,\n    configurable: true\n  });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n  var warnAboutAccessingRef = function () {\n    {\n      if (!specialPropRefWarningShown) {\n        specialPropRefWarningShown = true;\n\n        error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n      }\n    }\n  };\n\n  warnAboutAccessingRef.isReactWarning = true;\n  Object.defineProperty(props, 'ref', {\n    get: warnAboutAccessingRef,\n    configurable: true\n  });\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config) {\n  {\n    if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {\n      var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n      if (!didWarnAboutStringRefs[componentName]) {\n        error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n        didWarnAboutStringRefs[componentName] = true;\n      }\n    }\n  }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n  var element = {\n    // This tag allows us to uniquely identify this as a React Element\n    $$typeof: REACT_ELEMENT_TYPE,\n    // Built-in properties that belong on the element\n    type: type,\n    key: key,\n    ref: ref,\n    props: props,\n    // Record the component responsible for creating this element.\n    _owner: owner\n  };\n\n  {\n    // The validation flag is currently mutative. We put it on\n    // an external backing store so that we can freeze the whole object.\n    // This can be replaced with a WeakMap once they are implemented in\n    // commonly used development environments.\n    element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n    // the validation flag non-enumerable (where possible, which should\n    // include every environment we run tests in), so the test framework\n    // ignores it.\n\n    Object.defineProperty(element._store, 'validated', {\n      configurable: false,\n      enumerable: false,\n      writable: true,\n      value: false\n    }); // self and source are DEV only properties.\n\n    Object.defineProperty(element, '_self', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: self\n    }); // Two elements created in two different places should be considered\n    // equal for testing purposes and therefore we hide it from enumeration.\n\n    Object.defineProperty(element, '_source', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: source\n    });\n\n    if (Object.freeze) {\n      Object.freeze(element.props);\n      Object.freeze(element);\n    }\n  }\n\n  return element;\n};\n/**\n * Create and return a new ReactElement of the given type.\n * See https://reactjs.org/docs/react-api.html#createelement\n */\n\nfunction createElement(type, config, children) {\n  var propName; // Reserved names are extracted\n\n  var props = {};\n  var key = null;\n  var ref = null;\n  var self = null;\n  var source = null;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      ref = config.ref;\n\n      {\n        warnIfStringRefCannotBeAutoConverted(config);\n      }\n    }\n\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    }\n\n    self = config.__self === undefined ? null : config.__self;\n    source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        props[propName] = config[propName];\n      }\n    }\n  } // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n\n\n  var childrenLength = arguments.length - 2;\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n\n    {\n      if (Object.freeze) {\n        Object.freeze(childArray);\n      }\n    }\n\n    props.children = childArray;\n  } // Resolve default props\n\n\n  if (type && type.defaultProps) {\n    var defaultProps = type.defaultProps;\n\n    for (propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n  }\n\n  {\n    if (key || ref) {\n      var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n      if (key) {\n        defineKeyPropWarningGetter(props, displayName);\n      }\n\n      if (ref) {\n        defineRefPropWarningGetter(props, displayName);\n      }\n    }\n  }\n\n  return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n  var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n  return newElement;\n}\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://reactjs.org/docs/react-api.html#cloneelement\n */\n\nfunction cloneElement(element, config, children) {\n  if (!!(element === null || element === undefined)) {\n    {\n      throw Error( \"React.cloneElement(...): The argument must be a React element, but you passed \" + element + \".\" );\n    }\n  }\n\n  var propName; // Original props are copied\n\n  var props = _assign({}, element.props); // Reserved names are extracted\n\n\n  var key = element.key;\n  var ref = element.ref; // Self is preserved since the owner is preserved.\n\n  var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a\n  // transpiler, and the original source is probably a better indicator of the\n  // true owner.\n\n  var source = element._source; // Owner will be preserved, unless ref is overridden\n\n  var owner = element._owner;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      // Silently steal the ref from the parent.\n      ref = config.ref;\n      owner = ReactCurrentOwner.current;\n    }\n\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    } // Remaining properties override existing props\n\n\n    var defaultProps;\n\n    if (element.type && element.type.defaultProps) {\n      defaultProps = element.type.defaultProps;\n    }\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        if (config[propName] === undefined && defaultProps !== undefined) {\n          // Resolve default props\n          props[propName] = defaultProps[propName];\n        } else {\n          props[propName] = config[propName];\n        }\n      }\n    }\n  } // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n\n\n  var childrenLength = arguments.length - 2;\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n\n    props.children = childArray;\n  }\n\n  return ReactElement(element.type, key, ref, self, source, owner, props);\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n  var escapeRegex = /[=:]/g;\n  var escaperLookup = {\n    '=': '=0',\n    ':': '=2'\n  };\n  var escapedString = ('' + key).replace(escapeRegex, function (match) {\n    return escaperLookup[match];\n  });\n  return '$' + escapedString;\n}\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\n\nvar didWarnAboutMaps = false;\nvar userProvidedKeyEscapeRegex = /\\/+/g;\n\nfunction escapeUserProvidedKey(text) {\n  return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\nvar POOL_SIZE = 10;\nvar traverseContextPool = [];\n\nfunction getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n  if (traverseContextPool.length) {\n    var traverseContext = traverseContextPool.pop();\n    traverseContext.result = mapResult;\n    traverseContext.keyPrefix = keyPrefix;\n    traverseContext.func = mapFunction;\n    traverseContext.context = mapContext;\n    traverseContext.count = 0;\n    return traverseContext;\n  } else {\n    return {\n      result: mapResult,\n      keyPrefix: keyPrefix,\n      func: mapFunction,\n      context: mapContext,\n      count: 0\n    };\n  }\n}\n\nfunction releaseTraverseContext(traverseContext) {\n  traverseContext.result = null;\n  traverseContext.keyPrefix = null;\n  traverseContext.func = null;\n  traverseContext.context = null;\n  traverseContext.count = 0;\n\n  if (traverseContextPool.length < POOL_SIZE) {\n    traverseContextPool.push(traverseContext);\n  }\n}\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n  var type = typeof children;\n\n  if (type === 'undefined' || type === 'boolean') {\n    // All of the above are perceived as null.\n    children = null;\n  }\n\n  var invokeCallback = false;\n\n  if (children === null) {\n    invokeCallback = true;\n  } else {\n    switch (type) {\n      case 'string':\n      case 'number':\n        invokeCallback = true;\n        break;\n\n      case 'object':\n        switch (children.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n          case REACT_PORTAL_TYPE:\n            invokeCallback = true;\n        }\n\n    }\n  }\n\n  if (invokeCallback) {\n    callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array\n    // so that it's consistent if the number of children grows.\n    nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n    return 1;\n  }\n\n  var child;\n  var nextName;\n  var subtreeCount = 0; // Count of children found in the current subtree.\n\n  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      child = children[i];\n      nextName = nextNamePrefix + getComponentKey(child, i);\n      subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n    }\n  } else {\n    var iteratorFn = getIteratorFn(children);\n\n    if (typeof iteratorFn === 'function') {\n\n      {\n        // Warn about using Maps as children\n        if (iteratorFn === children.entries) {\n          if (!didWarnAboutMaps) {\n            warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.');\n          }\n\n          didWarnAboutMaps = true;\n        }\n      }\n\n      var iterator = iteratorFn.call(children);\n      var step;\n      var ii = 0;\n\n      while (!(step = iterator.next()).done) {\n        child = step.value;\n        nextName = nextNamePrefix + getComponentKey(child, ii++);\n        subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n      }\n    } else if (type === 'object') {\n      var addendum = '';\n\n      {\n        addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();\n      }\n\n      var childrenString = '' + children;\n\n      {\n        {\n          throw Error( \"Objects are not valid as a React child (found: \" + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + \").\" + addendum );\n        }\n      }\n    }\n  }\n\n  return subtreeCount;\n}\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildren(children, callback, traverseContext) {\n  if (children == null) {\n    return 0;\n  }\n\n  return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\n\n\nfunction getComponentKey(component, index) {\n  // Do some typechecking here since we call this blindly. We want to ensure\n  // that we don't block potential future ES APIs.\n  if (typeof component === 'object' && component !== null && component.key != null) {\n    // Explicit key\n    return escape(component.key);\n  } // Implicit key determined by the index in the set\n\n\n  return index.toString(36);\n}\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n  var func = bookKeeping.func,\n      context = bookKeeping.context;\n  func.call(context, child, bookKeeping.count++);\n}\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenforeach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\n\n\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n  if (children == null) {\n    return children;\n  }\n\n  var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n  traverseAllChildren(children, forEachSingleChild, traverseContext);\n  releaseTraverseContext(traverseContext);\n}\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n  var result = bookKeeping.result,\n      keyPrefix = bookKeeping.keyPrefix,\n      func = bookKeeping.func,\n      context = bookKeeping.context;\n  var mappedChild = func.call(context, child, bookKeeping.count++);\n\n  if (Array.isArray(mappedChild)) {\n    mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {\n      return c;\n    });\n  } else if (mappedChild != null) {\n    if (isValidElement(mappedChild)) {\n      mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as\n      // traverseAllChildren used to do for objects as children\n      keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n    }\n\n    result.push(mappedChild);\n  }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n  var escapedPrefix = '';\n\n  if (prefix != null) {\n    escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n  }\n\n  var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n  releaseTraverseContext(traverseContext);\n}\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenmap\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\n\n\nfunction mapChildren(children, func, context) {\n  if (children == null) {\n    return children;\n  }\n\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n  return result;\n}\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrencount\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\n\n\nfunction countChildren(children) {\n  return traverseAllChildren(children, function () {\n    return null;\n  }, null);\n}\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrentoarray\n */\n\n\nfunction toArray(children) {\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, function (child) {\n    return child;\n  });\n  return result;\n}\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenonly\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\n\n\nfunction onlyChild(children) {\n  if (!isValidElement(children)) {\n    {\n      throw Error( \"React.Children.only expected to receive a single React element child.\" );\n    }\n  }\n\n  return children;\n}\n\nfunction createContext(defaultValue, calculateChangedBits) {\n  if (calculateChangedBits === undefined) {\n    calculateChangedBits = null;\n  } else {\n    {\n      if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {\n        error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);\n      }\n    }\n  }\n\n  var context = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    _calculateChangedBits: calculateChangedBits,\n    // As a workaround to support multiple concurrent renderers, we categorize\n    // some renderers as primary and others as secondary. We only expect\n    // there to be two concurrent renderers at most: React Native (primary) and\n    // Fabric (secondary); React DOM (primary) and React ART (secondary).\n    // Secondary renderers store their context values on separate fields.\n    _currentValue: defaultValue,\n    _currentValue2: defaultValue,\n    // Used to track how many concurrent renderers this context currently\n    // supports within in a single renderer. Such as parallel server rendering.\n    _threadCount: 0,\n    // These are circular\n    Provider: null,\n    Consumer: null\n  };\n  context.Provider = {\n    $$typeof: REACT_PROVIDER_TYPE,\n    _context: context\n  };\n  var hasWarnedAboutUsingNestedContextConsumers = false;\n  var hasWarnedAboutUsingConsumerProvider = false;\n\n  {\n    // A separate object, but proxies back to the original context object for\n    // backwards compatibility. It has a different $$typeof, so we can properly\n    // warn for the incorrect usage of Context as a Consumer.\n    var Consumer = {\n      $$typeof: REACT_CONTEXT_TYPE,\n      _context: context,\n      _calculateChangedBits: context._calculateChangedBits\n    }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here\n\n    Object.defineProperties(Consumer, {\n      Provider: {\n        get: function () {\n          if (!hasWarnedAboutUsingConsumerProvider) {\n            hasWarnedAboutUsingConsumerProvider = true;\n\n            error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');\n          }\n\n          return context.Provider;\n        },\n        set: function (_Provider) {\n          context.Provider = _Provider;\n        }\n      },\n      _currentValue: {\n        get: function () {\n          return context._currentValue;\n        },\n        set: function (_currentValue) {\n          context._currentValue = _currentValue;\n        }\n      },\n      _currentValue2: {\n        get: function () {\n          return context._currentValue2;\n        },\n        set: function (_currentValue2) {\n          context._currentValue2 = _currentValue2;\n        }\n      },\n      _threadCount: {\n        get: function () {\n          return context._threadCount;\n        },\n        set: function (_threadCount) {\n          context._threadCount = _threadCount;\n        }\n      },\n      Consumer: {\n        get: function () {\n          if (!hasWarnedAboutUsingNestedContextConsumers) {\n            hasWarnedAboutUsingNestedContextConsumers = true;\n\n            error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n          }\n\n          return context.Consumer;\n        }\n      }\n    }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty\n\n    context.Consumer = Consumer;\n  }\n\n  {\n    context._currentRenderer = null;\n    context._currentRenderer2 = null;\n  }\n\n  return context;\n}\n\nfunction lazy(ctor) {\n  var lazyType = {\n    $$typeof: REACT_LAZY_TYPE,\n    _ctor: ctor,\n    // React uses these fields to store the result.\n    _status: -1,\n    _result: null\n  };\n\n  {\n    // In production, this would just set it on the object.\n    var defaultProps;\n    var propTypes;\n    Object.defineProperties(lazyType, {\n      defaultProps: {\n        configurable: true,\n        get: function () {\n          return defaultProps;\n        },\n        set: function (newDefaultProps) {\n          error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n          defaultProps = newDefaultProps; // Match production behavior more closely:\n\n          Object.defineProperty(lazyType, 'defaultProps', {\n            enumerable: true\n          });\n        }\n      },\n      propTypes: {\n        configurable: true,\n        get: function () {\n          return propTypes;\n        },\n        set: function (newPropTypes) {\n          error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n          propTypes = newPropTypes; // Match production behavior more closely:\n\n          Object.defineProperty(lazyType, 'propTypes', {\n            enumerable: true\n          });\n        }\n      }\n    });\n  }\n\n  return lazyType;\n}\n\nfunction forwardRef(render) {\n  {\n    if (render != null && render.$$typeof === REACT_MEMO_TYPE) {\n      error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');\n    } else if (typeof render !== 'function') {\n      error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);\n    } else {\n      if (render.length !== 0 && render.length !== 2) {\n        error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');\n      }\n    }\n\n    if (render != null) {\n      if (render.defaultProps != null || render.propTypes != null) {\n        error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');\n      }\n    }\n  }\n\n  return {\n    $$typeof: REACT_FORWARD_REF_TYPE,\n    render: render\n  };\n}\n\nfunction isValidElementType(type) {\n  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction memo(type, compare) {\n  {\n    if (!isValidElementType(type)) {\n      error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);\n    }\n  }\n\n  return {\n    $$typeof: REACT_MEMO_TYPE,\n    type: type,\n    compare: compare === undefined ? null : compare\n  };\n}\n\nfunction resolveDispatcher() {\n  var dispatcher = ReactCurrentDispatcher.current;\n\n  if (!(dispatcher !== null)) {\n    {\n      throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n    }\n  }\n\n  return dispatcher;\n}\n\nfunction useContext(Context, unstable_observedBits) {\n  var dispatcher = resolveDispatcher();\n\n  {\n    if (unstable_observedBits !== undefined) {\n      error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\\n\\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '');\n    } // TODO: add a more generic warning for invalid values.\n\n\n    if (Context._context !== undefined) {\n      var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs\n      // and nobody should be using this in existing code.\n\n      if (realContext.Consumer === Context) {\n        error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');\n      } else if (realContext.Provider === Context) {\n        error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');\n      }\n    }\n  }\n\n  return dispatcher.useContext(Context, unstable_observedBits);\n}\nfunction useState(initialState) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useState(initialState);\n}\nfunction useReducer(reducer, initialArg, init) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useReducer(reducer, initialArg, init);\n}\nfunction useRef(initialValue) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useRef(initialValue);\n}\nfunction useEffect(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useEffect(create, deps);\n}\nfunction useLayoutEffect(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useLayoutEffect(create, deps);\n}\nfunction useCallback(callback, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useCallback(callback, deps);\n}\nfunction useMemo(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useMemo(create, deps);\n}\nfunction useImperativeHandle(ref, create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useImperativeHandle(ref, create, deps);\n}\nfunction useDebugValue(value, formatterFn) {\n  {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useDebugValue(value, formatterFn);\n  }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n  propTypesMisspellWarningShown = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n  if (ReactCurrentOwner.current) {\n    var name = getComponentName(ReactCurrentOwner.current.type);\n\n    if (name) {\n      return '\\n\\nCheck the render method of `' + name + '`.';\n    }\n  }\n\n  return '';\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n  if (source !== undefined) {\n    var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n    var lineNumber = source.lineNumber;\n    return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n  }\n\n  return '';\n}\n\nfunction getSourceInfoErrorAddendumForProps(elementProps) {\n  if (elementProps !== null && elementProps !== undefined) {\n    return getSourceInfoErrorAddendum(elementProps.__source);\n  }\n\n  return '';\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n  var info = getDeclarationErrorAddendum();\n\n  if (!info) {\n    var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n    if (parentName) {\n      info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n    }\n  }\n\n  return info;\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n  if (!element._store || element._store.validated || element.key != null) {\n    return;\n  }\n\n  element._store.validated = true;\n  var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n  if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n    return;\n  }\n\n  ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n  // property, it may be the creator of the child that's responsible for\n  // assigning it a key.\n\n  var childOwner = '';\n\n  if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n    // Give the component that originally created this child.\n    childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n  }\n\n  setCurrentlyValidatingElement(element);\n\n  {\n    error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);\n  }\n\n  setCurrentlyValidatingElement(null);\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n  if (typeof node !== 'object') {\n    return;\n  }\n\n  if (Array.isArray(node)) {\n    for (var i = 0; i < node.length; i++) {\n      var child = node[i];\n\n      if (isValidElement(child)) {\n        validateExplicitKey(child, parentType);\n      }\n    }\n  } else if (isValidElement(node)) {\n    // This element was passed in a valid location.\n    if (node._store) {\n      node._store.validated = true;\n    }\n  } else if (node) {\n    var iteratorFn = getIteratorFn(node);\n\n    if (typeof iteratorFn === 'function') {\n      // Entry iterators used to provide implicit keys,\n      // but now we print a separate warning for them later.\n      if (iteratorFn !== node.entries) {\n        var iterator = iteratorFn.call(node);\n        var step;\n\n        while (!(step = iterator.next()).done) {\n          if (isValidElement(step.value)) {\n            validateExplicitKey(step.value, parentType);\n          }\n        }\n      }\n    }\n  }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n  {\n    var type = element.type;\n\n    if (type === null || type === undefined || typeof type === 'string') {\n      return;\n    }\n\n    var name = getComponentName(type);\n    var propTypes;\n\n    if (typeof type === 'function') {\n      propTypes = type.propTypes;\n    } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n    // Inner props are checked in the reconciler.\n    type.$$typeof === REACT_MEMO_TYPE)) {\n      propTypes = type.propTypes;\n    } else {\n      return;\n    }\n\n    if (propTypes) {\n      setCurrentlyValidatingElement(element);\n      checkPropTypes(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);\n      setCurrentlyValidatingElement(null);\n    } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n      propTypesMisspellWarningShown = true;\n\n      error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');\n    }\n\n    if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n    }\n  }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n  {\n    setCurrentlyValidatingElement(fragment);\n    var keys = Object.keys(fragment.props);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n\n      if (key !== 'children' && key !== 'key') {\n        error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n        break;\n      }\n    }\n\n    if (fragment.ref !== null) {\n      error('Invalid attribute `ref` supplied to `React.Fragment`.');\n    }\n\n    setCurrentlyValidatingElement(null);\n  }\n}\nfunction createElementWithValidation(type, props, children) {\n  var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n  // succeed and there will likely be errors in render.\n\n  if (!validType) {\n    var info = '';\n\n    if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n      info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n    }\n\n    var sourceInfo = getSourceInfoErrorAddendumForProps(props);\n\n    if (sourceInfo) {\n      info += sourceInfo;\n    } else {\n      info += getDeclarationErrorAddendum();\n    }\n\n    var typeString;\n\n    if (type === null) {\n      typeString = 'null';\n    } else if (Array.isArray(type)) {\n      typeString = 'array';\n    } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n      typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n      info = ' Did you accidentally export a JSX literal instead of a component?';\n    } else {\n      typeString = typeof type;\n    }\n\n    {\n      error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n    }\n  }\n\n  var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.\n  // TODO: Drop this when these are no longer allowed as the type argument.\n\n  if (element == null) {\n    return element;\n  } // Skip key warning if the type isn't valid since our key validation logic\n  // doesn't expect a non-string/function type and can throw confusing errors.\n  // We don't want exception behavior to differ between dev and prod.\n  // (Rendering will throw with a helpful message and as soon as the type is\n  // fixed, the key warnings will appear.)\n\n\n  if (validType) {\n    for (var i = 2; i < arguments.length; i++) {\n      validateChildKeys(arguments[i], type);\n    }\n  }\n\n  if (type === REACT_FRAGMENT_TYPE) {\n    validateFragmentProps(element);\n  } else {\n    validatePropTypes(element);\n  }\n\n  return element;\n}\nvar didWarnAboutDeprecatedCreateFactory = false;\nfunction createFactoryWithValidation(type) {\n  var validatedFactory = createElementWithValidation.bind(null, type);\n  validatedFactory.type = type;\n\n  {\n    if (!didWarnAboutDeprecatedCreateFactory) {\n      didWarnAboutDeprecatedCreateFactory = true;\n\n      warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');\n    } // Legacy hook: remove it\n\n\n    Object.defineProperty(validatedFactory, 'type', {\n      enumerable: false,\n      get: function () {\n        warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n\n        Object.defineProperty(this, 'type', {\n          value: type\n        });\n        return type;\n      }\n    });\n  }\n\n  return validatedFactory;\n}\nfunction cloneElementWithValidation(element, props, children) {\n  var newElement = cloneElement.apply(this, arguments);\n\n  for (var i = 2; i < arguments.length; i++) {\n    validateChildKeys(arguments[i], newElement.type);\n  }\n\n  validatePropTypes(newElement);\n  return newElement;\n}\n\n{\n\n  try {\n    var frozenObject = Object.freeze({});\n    var testMap = new Map([[frozenObject, null]]);\n    var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.\n    // https://github.com/rollup/rollup/issues/1771\n    // TODO: we can remove these if Rollup fixes the bug.\n\n    testMap.set(0, 0);\n    testSet.add(0);\n  } catch (e) {\n  }\n}\n\nvar createElement$1 =  createElementWithValidation ;\nvar cloneElement$1 =  cloneElementWithValidation ;\nvar createFactory =  createFactoryWithValidation ;\nvar Children = {\n  map: mapChildren,\n  forEach: forEachChildren,\n  count: countChildren,\n  toArray: toArray,\n  only: onlyChild\n};\n\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;\nexports.cloneElement = cloneElement$1;\nexports.createContext = createContext;\nexports.createElement = createElement$1;\nexports.createFactory = createFactory;\nexports.createRef = createRef;\nexports.forwardRef = forwardRef;\nexports.isValidElement = isValidElement;\nexports.lazy = lazy;\nexports.memo = memo;\nexports.useCallback = useCallback;\nexports.useContext = useContext;\nexports.useDebugValue = useDebugValue;\nexports.useEffect = useEffect;\nexports.useImperativeHandle = useImperativeHandle;\nexports.useLayoutEffect = useLayoutEffect;\nexports.useMemo = useMemo;\nexports.useReducer = useReducer;\nexports.useRef = useRef;\nexports.useState = useState;\nexports.version = ReactVersion;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react/cjs/react.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/react/index.js":
-/*!*************************************************!*\
-  !*** ./jaas-client/node_modules/react/index.js ***!
-  \*************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react.development.js */ \"./jaas-client/node_modules/react/cjs/react.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js":
-/*!***************************************************************************!*\
-  !*** ./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js ***!
-  \***************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nfunction isAbsolute(pathname) {\n  return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n    list[i] = list[k];\n  }\n\n  list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n  if (from === undefined) from = '';\n\n  var toParts = (to && to.split('/')) || [];\n  var fromParts = (from && from.split('/')) || [];\n\n  var isToAbs = to && isAbsolute(to);\n  var isFromAbs = from && isAbsolute(from);\n  var mustEndAbs = isToAbs || isFromAbs;\n\n  if (to && isAbsolute(to)) {\n    // to is absolute\n    fromParts = toParts;\n  } else if (toParts.length) {\n    // to is relative, drop the filename\n    fromParts.pop();\n    fromParts = fromParts.concat(toParts);\n  }\n\n  if (!fromParts.length) return '/';\n\n  var hasTrailingSlash;\n  if (fromParts.length) {\n    var last = fromParts[fromParts.length - 1];\n    hasTrailingSlash = last === '.' || last === '..' || last === '';\n  } else {\n    hasTrailingSlash = false;\n  }\n\n  var up = 0;\n  for (var i = fromParts.length; i >= 0; i--) {\n    var part = fromParts[i];\n\n    if (part === '.') {\n      spliceOne(fromParts, i);\n    } else if (part === '..') {\n      spliceOne(fromParts, i);\n      up++;\n    } else if (up) {\n      spliceOne(fromParts, i);\n      up--;\n    }\n  }\n\n  if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n  if (\n    mustEndAbs &&\n    fromParts[0] !== '' &&\n    (!fromParts[0] || !isAbsolute(fromParts[0]))\n  )\n    fromParts.unshift('');\n\n  var result = fromParts.join('/');\n\n  if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n  return result;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (resolvePathname);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js ***!
-  \*********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v0.19.1\n * scheduler-tracing.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.\n\nvar interactionIDCounter = 0;\nvar threadIDCounter = 0; // Set of currently traced interactions.\n// Interactions \"stack\"–\n// Meaning that newly traced interactions are appended to the previously active set.\n// When an interaction goes out of scope, the previous set (if any) is restored.\n\nexports.__interactionsRef = null; // Listener(s) to notify when interactions begin and end.\n\nexports.__subscriberRef = null;\n\n{\n  exports.__interactionsRef = {\n    current: new Set()\n  };\n  exports.__subscriberRef = {\n    current: null\n  };\n}\nfunction unstable_clear(callback) {\n\n  var prevInteractions = exports.__interactionsRef.current;\n  exports.__interactionsRef.current = new Set();\n\n  try {\n    return callback();\n  } finally {\n    exports.__interactionsRef.current = prevInteractions;\n  }\n}\nfunction unstable_getCurrent() {\n  {\n    return exports.__interactionsRef.current;\n  }\n}\nfunction unstable_getThreadID() {\n  return ++threadIDCounter;\n}\nfunction unstable_trace(name, timestamp, callback) {\n  var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;\n\n  var interaction = {\n    __count: 1,\n    id: interactionIDCounter++,\n    name: name,\n    timestamp: timestamp\n  };\n  var prevInteractions = exports.__interactionsRef.current; // Traced interactions should stack/accumulate.\n  // To do that, clone the current interactions.\n  // The previous set will be restored upon completion.\n\n  var interactions = new Set(prevInteractions);\n  interactions.add(interaction);\n  exports.__interactionsRef.current = interactions;\n  var subscriber = exports.__subscriberRef.current;\n  var returnValue;\n\n  try {\n    if (subscriber !== null) {\n      subscriber.onInteractionTraced(interaction);\n    }\n  } finally {\n    try {\n      if (subscriber !== null) {\n        subscriber.onWorkStarted(interactions, threadID);\n      }\n    } finally {\n      try {\n        returnValue = callback();\n      } finally {\n        exports.__interactionsRef.current = prevInteractions;\n\n        try {\n          if (subscriber !== null) {\n            subscriber.onWorkStopped(interactions, threadID);\n          }\n        } finally {\n          interaction.__count--; // If no async work was scheduled for this interaction,\n          // Notify subscribers that it's completed.\n\n          if (subscriber !== null && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        }\n      }\n    }\n  }\n\n  return returnValue;\n}\nfunction unstable_wrap(callback) {\n  var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;\n\n  var wrappedInteractions = exports.__interactionsRef.current;\n  var subscriber = exports.__subscriberRef.current;\n\n  if (subscriber !== null) {\n    subscriber.onWorkScheduled(wrappedInteractions, threadID);\n  } // Update the pending async work count for the current interactions.\n  // Update after calling subscribers in case of error.\n\n\n  wrappedInteractions.forEach(function (interaction) {\n    interaction.__count++;\n  });\n  var hasRun = false;\n\n  function wrapped() {\n    var prevInteractions = exports.__interactionsRef.current;\n    exports.__interactionsRef.current = wrappedInteractions;\n    subscriber = exports.__subscriberRef.current;\n\n    try {\n      var returnValue;\n\n      try {\n        if (subscriber !== null) {\n          subscriber.onWorkStarted(wrappedInteractions, threadID);\n        }\n      } finally {\n        try {\n          returnValue = callback.apply(undefined, arguments);\n        } finally {\n          exports.__interactionsRef.current = prevInteractions;\n\n          if (subscriber !== null) {\n            subscriber.onWorkStopped(wrappedInteractions, threadID);\n          }\n        }\n      }\n\n      return returnValue;\n    } finally {\n      if (!hasRun) {\n        // We only expect a wrapped function to be executed once,\n        // But in the event that it's executed more than once–\n        // Only decrement the outstanding interaction counts once.\n        hasRun = true; // Update pending async counts for all wrapped interactions.\n        // If this was the last scheduled async work for any of them,\n        // Mark them as completed.\n\n        wrappedInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber !== null && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        });\n      }\n    }\n  }\n\n  wrapped.cancel = function cancel() {\n    subscriber = exports.__subscriberRef.current;\n\n    try {\n      if (subscriber !== null) {\n        subscriber.onWorkCanceled(wrappedInteractions, threadID);\n      }\n    } finally {\n      // Update pending async counts for all wrapped interactions.\n      // If this was the last scheduled async work for any of them,\n      // Mark them as completed.\n      wrappedInteractions.forEach(function (interaction) {\n        interaction.__count--;\n\n        if (subscriber && interaction.__count === 0) {\n          subscriber.onInteractionScheduledWorkCompleted(interaction);\n        }\n      });\n    }\n  };\n\n  return wrapped;\n}\n\nvar subscribers = null;\n\n{\n  subscribers = new Set();\n}\n\nfunction unstable_subscribe(subscriber) {\n  {\n    subscribers.add(subscriber);\n\n    if (subscribers.size === 1) {\n      exports.__subscriberRef.current = {\n        onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,\n        onInteractionTraced: onInteractionTraced,\n        onWorkCanceled: onWorkCanceled,\n        onWorkScheduled: onWorkScheduled,\n        onWorkStarted: onWorkStarted,\n        onWorkStopped: onWorkStopped\n      };\n    }\n  }\n}\nfunction unstable_unsubscribe(subscriber) {\n  {\n    subscribers.delete(subscriber);\n\n    if (subscribers.size === 0) {\n      exports.__subscriberRef.current = null;\n    }\n  }\n}\n\nfunction onInteractionTraced(interaction) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onInteractionTraced(interaction);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onInteractionScheduledWorkCompleted(interaction) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onInteractionScheduledWorkCompleted(interaction);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkScheduled(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkScheduled(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkStarted(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkStarted(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkStopped(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkStopped(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkCanceled(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkCanceled(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nexports.unstable_clear = unstable_clear;\nexports.unstable_getCurrent = unstable_getCurrent;\nexports.unstable_getThreadID = unstable_getThreadID;\nexports.unstable_subscribe = unstable_subscribe;\nexports.unstable_trace = unstable_trace;\nexports.unstable_unsubscribe = unstable_unsubscribe;\nexports.unstable_wrap = unstable_wrap;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/cjs/scheduler.development.js":
-/*!*************************************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/cjs/scheduler.development.js ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/** @license React v0.19.1\n * scheduler.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar enableSchedulerDebugging = false;\nvar enableProfiling = true;\n\nvar requestHostCallback;\nvar requestHostTimeout;\nvar cancelHostTimeout;\nvar shouldYieldToHost;\nvar requestPaint;\n\nif ( // If Scheduler runs in a non-DOM environment, it falls back to a naive\n// implementation using setTimeout.\ntypeof window === 'undefined' || // Check if MessageChannel is supported, too.\ntypeof MessageChannel !== 'function') {\n  // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,\n  // fallback to a naive implementation.\n  var _callback = null;\n  var _timeoutID = null;\n\n  var _flushCallback = function () {\n    if (_callback !== null) {\n      try {\n        var currentTime = exports.unstable_now();\n        var hasRemainingTime = true;\n\n        _callback(hasRemainingTime, currentTime);\n\n        _callback = null;\n      } catch (e) {\n        setTimeout(_flushCallback, 0);\n        throw e;\n      }\n    }\n  };\n\n  var initialTime = Date.now();\n\n  exports.unstable_now = function () {\n    return Date.now() - initialTime;\n  };\n\n  requestHostCallback = function (cb) {\n    if (_callback !== null) {\n      // Protect against re-entrancy.\n      setTimeout(requestHostCallback, 0, cb);\n    } else {\n      _callback = cb;\n      setTimeout(_flushCallback, 0);\n    }\n  };\n\n  requestHostTimeout = function (cb, ms) {\n    _timeoutID = setTimeout(cb, ms);\n  };\n\n  cancelHostTimeout = function () {\n    clearTimeout(_timeoutID);\n  };\n\n  shouldYieldToHost = function () {\n    return false;\n  };\n\n  requestPaint = exports.unstable_forceFrameRate = function () {};\n} else {\n  // Capture local references to native APIs, in case a polyfill overrides them.\n  var performance = window.performance;\n  var _Date = window.Date;\n  var _setTimeout = window.setTimeout;\n  var _clearTimeout = window.clearTimeout;\n\n  if (typeof console !== 'undefined') {\n    // TODO: Scheduler no longer requires these methods to be polyfilled. But\n    // maybe we want to continue warning if they don't exist, to preserve the\n    // option to rely on it in the future?\n    var requestAnimationFrame = window.requestAnimationFrame;\n    var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link\n\n    if (typeof requestAnimationFrame !== 'function') {\n      // Using console['error'] to evade Babel and ESLint\n      console['error'](\"This browser doesn't support requestAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n\n    if (typeof cancelAnimationFrame !== 'function') {\n      // Using console['error'] to evade Babel and ESLint\n      console['error'](\"This browser doesn't support cancelAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n  }\n\n  if (typeof performance === 'object' && typeof performance.now === 'function') {\n    exports.unstable_now = function () {\n      return performance.now();\n    };\n  } else {\n    var _initialTime = _Date.now();\n\n    exports.unstable_now = function () {\n      return _Date.now() - _initialTime;\n    };\n  }\n\n  var isMessageLoopRunning = false;\n  var scheduledHostCallback = null;\n  var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main\n  // thread, like user events. By default, it yields multiple times per frame.\n  // It does not attempt to align with frame boundaries, since most tasks don't\n  // need to be frame aligned; for those that do, use requestAnimationFrame.\n\n  var yieldInterval = 5;\n  var deadline = 0; // TODO: Make this configurable\n\n  {\n    // `isInputPending` is not available. Since we have no way of knowing if\n    // there's pending input, always yield at the end of the frame.\n    shouldYieldToHost = function () {\n      return exports.unstable_now() >= deadline;\n    }; // Since we yield every frame regardless, `requestPaint` has no effect.\n\n\n    requestPaint = function () {};\n  }\n\n  exports.unstable_forceFrameRate = function (fps) {\n    if (fps < 0 || fps > 125) {\n      // Using console['error'] to evade Babel and ESLint\n      console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported');\n      return;\n    }\n\n    if (fps > 0) {\n      yieldInterval = Math.floor(1000 / fps);\n    } else {\n      // reset the framerate\n      yieldInterval = 5;\n    }\n  };\n\n  var performWorkUntilDeadline = function () {\n    if (scheduledHostCallback !== null) {\n      var currentTime = exports.unstable_now(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync\n      // cycle. This means there's always time remaining at the beginning of\n      // the message event.\n\n      deadline = currentTime + yieldInterval;\n      var hasTimeRemaining = true;\n\n      try {\n        var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);\n\n        if (!hasMoreWork) {\n          isMessageLoopRunning = false;\n          scheduledHostCallback = null;\n        } else {\n          // If there's more work, schedule the next message event at the end\n          // of the preceding one.\n          port.postMessage(null);\n        }\n      } catch (error) {\n        // If a scheduler task throws, exit the current browser task so the\n        // error can be observed.\n        port.postMessage(null);\n        throw error;\n      }\n    } else {\n      isMessageLoopRunning = false;\n    } // Yielding to the browser will give it a chance to paint, so we can\n  };\n\n  var channel = new MessageChannel();\n  var port = channel.port2;\n  channel.port1.onmessage = performWorkUntilDeadline;\n\n  requestHostCallback = function (callback) {\n    scheduledHostCallback = callback;\n\n    if (!isMessageLoopRunning) {\n      isMessageLoopRunning = true;\n      port.postMessage(null);\n    }\n  };\n\n  requestHostTimeout = function (callback, ms) {\n    taskTimeoutID = _setTimeout(function () {\n      callback(exports.unstable_now());\n    }, ms);\n  };\n\n  cancelHostTimeout = function () {\n    _clearTimeout(taskTimeoutID);\n\n    taskTimeoutID = -1;\n  };\n}\n\nfunction push(heap, node) {\n  var index = heap.length;\n  heap.push(node);\n  siftUp(heap, node, index);\n}\nfunction peek(heap) {\n  var first = heap[0];\n  return first === undefined ? null : first;\n}\nfunction pop(heap) {\n  var first = heap[0];\n\n  if (first !== undefined) {\n    var last = heap.pop();\n\n    if (last !== first) {\n      heap[0] = last;\n      siftDown(heap, last, 0);\n    }\n\n    return first;\n  } else {\n    return null;\n  }\n}\n\nfunction siftUp(heap, node, i) {\n  var index = i;\n\n  while (true) {\n    var parentIndex = index - 1 >>> 1;\n    var parent = heap[parentIndex];\n\n    if (parent !== undefined && compare(parent, node) > 0) {\n      // The parent is larger. Swap positions.\n      heap[parentIndex] = node;\n      heap[index] = parent;\n      index = parentIndex;\n    } else {\n      // The parent is smaller. Exit.\n      return;\n    }\n  }\n}\n\nfunction siftDown(heap, node, i) {\n  var index = i;\n  var length = heap.length;\n\n  while (index < length) {\n    var leftIndex = (index + 1) * 2 - 1;\n    var left = heap[leftIndex];\n    var rightIndex = leftIndex + 1;\n    var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.\n\n    if (left !== undefined && compare(left, node) < 0) {\n      if (right !== undefined && compare(right, left) < 0) {\n        heap[index] = right;\n        heap[rightIndex] = node;\n        index = rightIndex;\n      } else {\n        heap[index] = left;\n        heap[leftIndex] = node;\n        index = leftIndex;\n      }\n    } else if (right !== undefined && compare(right, node) < 0) {\n      heap[index] = right;\n      heap[rightIndex] = node;\n      index = rightIndex;\n    } else {\n      // Neither child is smaller. Exit.\n      return;\n    }\n  }\n}\n\nfunction compare(a, b) {\n  // Compare sort index first, then task id.\n  var diff = a.sortIndex - b.sortIndex;\n  return diff !== 0 ? diff : a.id - b.id;\n}\n\n// TODO: Use symbols?\nvar NoPriority = 0;\nvar ImmediatePriority = 1;\nvar UserBlockingPriority = 2;\nvar NormalPriority = 3;\nvar LowPriority = 4;\nvar IdlePriority = 5;\n\nvar runIdCounter = 0;\nvar mainThreadIdCounter = 0;\nvar profilingStateSize = 4;\nvar sharedProfilingBuffer =  // $FlowFixMe Flow doesn't know about SharedArrayBuffer\ntypeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer\ntypeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9\n;\nvar profilingState =  sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks\n\nvar PRIORITY = 0;\nvar CURRENT_TASK_ID = 1;\nvar CURRENT_RUN_ID = 2;\nvar QUEUE_SIZE = 3;\n\n{\n  profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue\n  // array might include canceled tasks.\n\n  profilingState[QUEUE_SIZE] = 0;\n  profilingState[CURRENT_TASK_ID] = 0;\n} // Bytes per element is 4\n\n\nvar INITIAL_EVENT_LOG_SIZE = 131072;\nvar MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes\n\nvar eventLogSize = 0;\nvar eventLogBuffer = null;\nvar eventLog = null;\nvar eventLogIndex = 0;\nvar TaskStartEvent = 1;\nvar TaskCompleteEvent = 2;\nvar TaskErrorEvent = 3;\nvar TaskCancelEvent = 4;\nvar TaskRunEvent = 5;\nvar TaskYieldEvent = 6;\nvar SchedulerSuspendEvent = 7;\nvar SchedulerResumeEvent = 8;\n\nfunction logEvent(entries) {\n  if (eventLog !== null) {\n    var offset = eventLogIndex;\n    eventLogIndex += entries.length;\n\n    if (eventLogIndex + 1 > eventLogSize) {\n      eventLogSize *= 2;\n\n      if (eventLogSize > MAX_EVENT_LOG_SIZE) {\n        // Using console['error'] to evade Babel and ESLint\n        console['error'](\"Scheduler Profiling: Event log exceeded maximum size. Don't \" + 'forget to call `stopLoggingProfilingEvents()`.');\n        stopLoggingProfilingEvents();\n        return;\n      }\n\n      var newEventLog = new Int32Array(eventLogSize * 4);\n      newEventLog.set(eventLog);\n      eventLogBuffer = newEventLog.buffer;\n      eventLog = newEventLog;\n    }\n\n    eventLog.set(entries, offset);\n  }\n}\n\nfunction startLoggingProfilingEvents() {\n  eventLogSize = INITIAL_EVENT_LOG_SIZE;\n  eventLogBuffer = new ArrayBuffer(eventLogSize * 4);\n  eventLog = new Int32Array(eventLogBuffer);\n  eventLogIndex = 0;\n}\nfunction stopLoggingProfilingEvents() {\n  var buffer = eventLogBuffer;\n  eventLogSize = 0;\n  eventLogBuffer = null;\n  eventLog = null;\n  eventLogIndex = 0;\n  return buffer;\n}\nfunction markTaskStart(task, ms) {\n  {\n    profilingState[QUEUE_SIZE]++;\n\n    if (eventLog !== null) {\n      // performance.now returns a float, representing milliseconds. When the\n      // event is logged, it's coerced to an int. Convert to microseconds to\n      // maintain extra degrees of precision.\n      logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);\n    }\n  }\n}\nfunction markTaskCompleted(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskCompleteEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskCanceled(task, ms) {\n  {\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskCancelEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskErrored(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskErrorEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskRun(task, ms) {\n  {\n    runIdCounter++;\n    profilingState[PRIORITY] = task.priorityLevel;\n    profilingState[CURRENT_TASK_ID] = task.id;\n    profilingState[CURRENT_RUN_ID] = runIdCounter;\n\n    if (eventLog !== null) {\n      logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);\n    }\n  }\n}\nfunction markTaskYield(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[CURRENT_RUN_ID] = 0;\n\n    if (eventLog !== null) {\n      logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);\n    }\n  }\n}\nfunction markSchedulerSuspended(ms) {\n  {\n    mainThreadIdCounter++;\n\n    if (eventLog !== null) {\n      logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);\n    }\n  }\n}\nfunction markSchedulerUnsuspended(ms) {\n  {\n    if (eventLog !== null) {\n      logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);\n    }\n  }\n}\n\n/* eslint-disable no-var */\n// Math.pow(2, 30) - 1\n// 0b111111111111111111111111111111\n\nvar maxSigned31BitInt = 1073741823; // Times out immediately\n\nvar IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out\n\nvar USER_BLOCKING_PRIORITY = 250;\nvar NORMAL_PRIORITY_TIMEOUT = 5000;\nvar LOW_PRIORITY_TIMEOUT = 10000; // Never times out\n\nvar IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap\n\nvar taskQueue = [];\nvar timerQueue = []; // Incrementing id counter. Used to maintain insertion order.\n\nvar taskIdCounter = 1; // Pausing the scheduler is useful for debugging.\nvar currentTask = null;\nvar currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.\n\nvar isPerformingWork = false;\nvar isHostCallbackScheduled = false;\nvar isHostTimeoutScheduled = false;\n\nfunction advanceTimers(currentTime) {\n  // Check for tasks that are no longer delayed and add them to the queue.\n  var timer = peek(timerQueue);\n\n  while (timer !== null) {\n    if (timer.callback === null) {\n      // Timer was cancelled.\n      pop(timerQueue);\n    } else if (timer.startTime <= currentTime) {\n      // Timer fired. Transfer to the task queue.\n      pop(timerQueue);\n      timer.sortIndex = timer.expirationTime;\n      push(taskQueue, timer);\n\n      {\n        markTaskStart(timer, currentTime);\n        timer.isQueued = true;\n      }\n    } else {\n      // Remaining timers are pending.\n      return;\n    }\n\n    timer = peek(timerQueue);\n  }\n}\n\nfunction handleTimeout(currentTime) {\n  isHostTimeoutScheduled = false;\n  advanceTimers(currentTime);\n\n  if (!isHostCallbackScheduled) {\n    if (peek(taskQueue) !== null) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    } else {\n      var firstTimer = peek(timerQueue);\n\n      if (firstTimer !== null) {\n        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n      }\n    }\n  }\n}\n\nfunction flushWork(hasTimeRemaining, initialTime) {\n  {\n    markSchedulerUnsuspended(initialTime);\n  } // We'll need a host callback the next time work is scheduled.\n\n\n  isHostCallbackScheduled = false;\n\n  if (isHostTimeoutScheduled) {\n    // We scheduled a timeout but it's no longer needed. Cancel it.\n    isHostTimeoutScheduled = false;\n    cancelHostTimeout();\n  }\n\n  isPerformingWork = true;\n  var previousPriorityLevel = currentPriorityLevel;\n\n  try {\n    if (enableProfiling) {\n      try {\n        return workLoop(hasTimeRemaining, initialTime);\n      } catch (error) {\n        if (currentTask !== null) {\n          var currentTime = exports.unstable_now();\n          markTaskErrored(currentTask, currentTime);\n          currentTask.isQueued = false;\n        }\n\n        throw error;\n      }\n    } else {\n      // No catch in prod codepath.\n      return workLoop(hasTimeRemaining, initialTime);\n    }\n  } finally {\n    currentTask = null;\n    currentPriorityLevel = previousPriorityLevel;\n    isPerformingWork = false;\n\n    {\n      var _currentTime = exports.unstable_now();\n\n      markSchedulerSuspended(_currentTime);\n    }\n  }\n}\n\nfunction workLoop(hasTimeRemaining, initialTime) {\n  var currentTime = initialTime;\n  advanceTimers(currentTime);\n  currentTask = peek(taskQueue);\n\n  while (currentTask !== null && !(enableSchedulerDebugging )) {\n    if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n      // This currentTask hasn't expired, and we've reached the deadline.\n      break;\n    }\n\n    var callback = currentTask.callback;\n\n    if (callback !== null) {\n      currentTask.callback = null;\n      currentPriorityLevel = currentTask.priorityLevel;\n      var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n      markTaskRun(currentTask, currentTime);\n      var continuationCallback = callback(didUserCallbackTimeout);\n      currentTime = exports.unstable_now();\n\n      if (typeof continuationCallback === 'function') {\n        currentTask.callback = continuationCallback;\n        markTaskYield(currentTask, currentTime);\n      } else {\n        {\n          markTaskCompleted(currentTask, currentTime);\n          currentTask.isQueued = false;\n        }\n\n        if (currentTask === peek(taskQueue)) {\n          pop(taskQueue);\n        }\n      }\n\n      advanceTimers(currentTime);\n    } else {\n      pop(taskQueue);\n    }\n\n    currentTask = peek(taskQueue);\n  } // Return whether there's additional work\n\n\n  if (currentTask !== null) {\n    return true;\n  } else {\n    var firstTimer = peek(timerQueue);\n\n    if (firstTimer !== null) {\n      requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n    }\n\n    return false;\n  }\n}\n\nfunction unstable_runWithPriority(priorityLevel, eventHandler) {\n  switch (priorityLevel) {\n    case ImmediatePriority:\n    case UserBlockingPriority:\n    case NormalPriority:\n    case LowPriority:\n    case IdlePriority:\n      break;\n\n    default:\n      priorityLevel = NormalPriority;\n  }\n\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n}\n\nfunction unstable_next(eventHandler) {\n  var priorityLevel;\n\n  switch (currentPriorityLevel) {\n    case ImmediatePriority:\n    case UserBlockingPriority:\n    case NormalPriority:\n      // Shift down to normal priority\n      priorityLevel = NormalPriority;\n      break;\n\n    default:\n      // Anything lower than normal priority should remain at the current level.\n      priorityLevel = currentPriorityLevel;\n      break;\n  }\n\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n}\n\nfunction unstable_wrapCallback(callback) {\n  var parentPriorityLevel = currentPriorityLevel;\n  return function () {\n    // This is a fork of runWithPriority, inlined for performance.\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = parentPriorityLevel;\n\n    try {\n      return callback.apply(this, arguments);\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  };\n}\n\nfunction timeoutForPriorityLevel(priorityLevel) {\n  switch (priorityLevel) {\n    case ImmediatePriority:\n      return IMMEDIATE_PRIORITY_TIMEOUT;\n\n    case UserBlockingPriority:\n      return USER_BLOCKING_PRIORITY;\n\n    case IdlePriority:\n      return IDLE_PRIORITY;\n\n    case LowPriority:\n      return LOW_PRIORITY_TIMEOUT;\n\n    case NormalPriority:\n    default:\n      return NORMAL_PRIORITY_TIMEOUT;\n  }\n}\n\nfunction unstable_scheduleCallback(priorityLevel, callback, options) {\n  var currentTime = exports.unstable_now();\n  var startTime;\n  var timeout;\n\n  if (typeof options === 'object' && options !== null) {\n    var delay = options.delay;\n\n    if (typeof delay === 'number' && delay > 0) {\n      startTime = currentTime + delay;\n    } else {\n      startTime = currentTime;\n    }\n\n    timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);\n  } else {\n    timeout = timeoutForPriorityLevel(priorityLevel);\n    startTime = currentTime;\n  }\n\n  var expirationTime = startTime + timeout;\n  var newTask = {\n    id: taskIdCounter++,\n    callback: callback,\n    priorityLevel: priorityLevel,\n    startTime: startTime,\n    expirationTime: expirationTime,\n    sortIndex: -1\n  };\n\n  {\n    newTask.isQueued = false;\n  }\n\n  if (startTime > currentTime) {\n    // This is a delayed task.\n    newTask.sortIndex = startTime;\n    push(timerQueue, newTask);\n\n    if (peek(taskQueue) === null && newTask === peek(timerQueue)) {\n      // All tasks are delayed, and this is the task with the earliest delay.\n      if (isHostTimeoutScheduled) {\n        // Cancel an existing timeout.\n        cancelHostTimeout();\n      } else {\n        isHostTimeoutScheduled = true;\n      } // Schedule a timeout.\n\n\n      requestHostTimeout(handleTimeout, startTime - currentTime);\n    }\n  } else {\n    newTask.sortIndex = expirationTime;\n    push(taskQueue, newTask);\n\n    {\n      markTaskStart(newTask, currentTime);\n      newTask.isQueued = true;\n    } // Schedule a host callback, if needed. If we're already performing work,\n    // wait until the next time we yield.\n\n\n    if (!isHostCallbackScheduled && !isPerformingWork) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    }\n  }\n\n  return newTask;\n}\n\nfunction unstable_pauseExecution() {\n}\n\nfunction unstable_continueExecution() {\n\n  if (!isHostCallbackScheduled && !isPerformingWork) {\n    isHostCallbackScheduled = true;\n    requestHostCallback(flushWork);\n  }\n}\n\nfunction unstable_getFirstCallbackNode() {\n  return peek(taskQueue);\n}\n\nfunction unstable_cancelCallback(task) {\n  {\n    if (task.isQueued) {\n      var currentTime = exports.unstable_now();\n      markTaskCanceled(task, currentTime);\n      task.isQueued = false;\n    }\n  } // Null out the callback to indicate the task has been canceled. (Can't\n  // remove from the queue because you can't remove arbitrary nodes from an\n  // array based heap, only the first one.)\n\n\n  task.callback = null;\n}\n\nfunction unstable_getCurrentPriorityLevel() {\n  return currentPriorityLevel;\n}\n\nfunction unstable_shouldYield() {\n  var currentTime = exports.unstable_now();\n  advanceTimers(currentTime);\n  var firstTask = peek(taskQueue);\n  return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();\n}\n\nvar unstable_requestPaint = requestPaint;\nvar unstable_Profiling =  {\n  startLoggingProfilingEvents: startLoggingProfilingEvents,\n  stopLoggingProfilingEvents: stopLoggingProfilingEvents,\n  sharedProfilingBuffer: sharedProfilingBuffer\n} ;\n\nexports.unstable_IdlePriority = IdlePriority;\nexports.unstable_ImmediatePriority = ImmediatePriority;\nexports.unstable_LowPriority = LowPriority;\nexports.unstable_NormalPriority = NormalPriority;\nexports.unstable_Profiling = unstable_Profiling;\nexports.unstable_UserBlockingPriority = UserBlockingPriority;\nexports.unstable_cancelCallback = unstable_cancelCallback;\nexports.unstable_continueExecution = unstable_continueExecution;\nexports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;\nexports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;\nexports.unstable_next = unstable_next;\nexports.unstable_pauseExecution = unstable_pauseExecution;\nexports.unstable_requestPaint = unstable_requestPaint;\nexports.unstable_runWithPriority = unstable_runWithPriority;\nexports.unstable_scheduleCallback = unstable_scheduleCallback;\nexports.unstable_shouldYield = unstable_shouldYield;\nexports.unstable_wrapCallback = unstable_wrapCallback;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/cjs/scheduler.development.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/index.js":
-/*!*****************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/index.js ***!
-  \*****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/scheduler.development.js */ \"./jaas-client/node_modules/scheduler/cjs/scheduler.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/scheduler/tracing.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/node_modules/scheduler/tracing.js ***!
-  \*******************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/scheduler-tracing.development.js */ \"./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/tracing.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/index.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/index.js ***!
-  \****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar url = __webpack_require__(/*! ./url */ \"./jaas-client/node_modules/socket.io-client/lib/url.js\");\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar Manager = __webpack_require__(/*! ./manager */ \"./jaas-client/node_modules/socket.io-client/lib/manager.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup (uri, opts) {\n  if (typeof uri === 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var path = parsed.path;\n  var sameNamespace = cache[id] && path in cache[id].nsps;\n  var newConnection = opts.forceNew || opts['force new connection'] ||\n                      false === opts.multiplex || sameNamespace;\n\n  var io;\n\n  if (newConnection) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n  if (parsed.query && !opts.query) {\n    opts.query = parsed.query;\n  }\n  return io.socket(parsed.path, opts);\n}\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = __webpack_require__(/*! ./manager */ \"./jaas-client/node_modules/socket.io-client/lib/manager.js\");\nexports.Socket = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/socket.io-client/lib/socket.js\");\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/manager.js":
-/*!******************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/manager.js ***!
-  \******************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar eio = __webpack_require__(/*! engine.io-client */ \"./jaas-client/node_modules/engine.io-client/lib/index.js\");\nvar Socket = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/socket.io-client/lib/socket.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js\");\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar on = __webpack_require__(/*! ./on */ \"./jaas-client/node_modules/socket.io-client/lib/on.js\");\nvar bind = __webpack_require__(/*! component-bind */ \"./jaas-client/node_modules/component-bind/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:manager');\nvar indexOf = __webpack_require__(/*! indexof */ \"./jaas-client/node_modules/indexof/index.js\");\nvar Backoff = __webpack_require__(/*! backo2 */ \"./jaas-client/node_modules/backo2/index.js\");\n\n/**\n * IE6+ hasOwnProperty\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager (uri, opts) {\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' === typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connecting = [];\n  this.lastPing = null;\n  this.encoding = false;\n  this.packetBuffer = [];\n  var _parser = opts.parser || parser;\n  this.encoder = new _parser.Encoder();\n  this.decoder = new _parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function () {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n    }\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function () {\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].id = this.generateId(nsp);\n    }\n  }\n};\n\n/**\n * generate `socket.id` for the given `nsp`\n *\n * @param {String} nsp\n * @return {String}\n * @api private\n */\n\nManager.prototype.generateId = function (nsp) {\n  return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function (v) {\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function (v) {\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function (v) {\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function (v) {\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function (v) {\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function (v) {\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function () {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function (fn, opts) {\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function () {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function (data) {\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function () {\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function () {\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n  this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n};\n\n/**\n * Called upon a ping.\n *\n * @api private\n */\n\nManager.prototype.onping = function () {\n  this.lastPing = new Date();\n  this.emitAll('ping');\n};\n\n/**\n * Called upon a packet.\n *\n * @api private\n */\n\nManager.prototype.onpong = function () {\n  this.emitAll('pong', new Date() - this.lastPing);\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function (data) {\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function (err) {\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function (nsp, opts) {\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp, opts);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connecting', onConnecting);\n    socket.on('connect', function () {\n      socket.id = self.generateId(nsp);\n    });\n\n    if (this.autoConnect) {\n      // manually call here since connecting event is fired before listening\n      onConnecting();\n    }\n  }\n\n  function onConnecting () {\n    if (!~indexOf(self.connecting, socket)) {\n      self.connecting.push(socket);\n    }\n  }\n\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function (socket) {\n  var index = indexOf(this.connecting, socket);\n  if (~index) this.connecting.splice(index, 1);\n  if (this.connecting.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function (packet) {\n  debug('writing packet %j', packet);\n  var self = this;\n  if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function (encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i], packet.options);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function () {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function () {\n  debug('cleanup');\n\n  var subsLength = this.subs.length;\n  for (var i = 0; i < subsLength; i++) {\n    var sub = this.subs.shift();\n    sub.destroy();\n  }\n\n  this.packetBuffer = [];\n  this.encoding = false;\n  this.lastPing = null;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function () {\n  debug('disconnect');\n  this.skipReconnect = true;\n  this.reconnecting = false;\n  if ('opening' === this.readyState) {\n    // `onclose` will not fire because\n    // an open event never happened\n    this.cleanup();\n  }\n  this.backoff.reset();\n  this.readyState = 'closed';\n  if (this.engine) this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function (reason) {\n  debug('onclose');\n\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function () {\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function () {\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function (err) {\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function () {\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/manager.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/on.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/on.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on (obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function () {\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/on.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/socket.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/socket.js ***!
-  \*****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js\");\nvar toArray = __webpack_require__(/*! to-array */ \"./jaas-client/node_modules/to-array/index.js\");\nvar on = __webpack_require__(/*! ./on */ \"./jaas-client/node_modules/socket.io-client/lib/on.js\");\nvar bind = __webpack_require__(/*! component-bind */ \"./jaas-client/node_modules/component-bind/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:socket');\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar hasBin = __webpack_require__(/*! has-binary2 */ \"./jaas-client/node_modules/has-binary2/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  connecting: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1,\n  ping: 1,\n  pong: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket (io, nsp, opts) {\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n  this.flags = {};\n  if (opts && opts.query) {\n    this.query = opts.query;\n  }\n  if (this.io.autoConnect) this.open();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function () {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function () {\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' === this.io.readyState) this.onopen();\n  this.emit('connecting');\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function () {\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function (ev) {\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var packet = {\n    type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT,\n    data: args\n  };\n\n  packet.options = {};\n  packet.options.compress = !this.flags || false !== this.flags.compress;\n\n  // event ack callback\n  if ('function' === typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  this.flags = {};\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function (packet) {\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function () {\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' !== this.nsp) {\n    if (this.query) {\n      var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;\n      debug('sending connect packet with query %s', query);\n      this.packet({type: parser.CONNECT, query: query});\n    } else {\n      this.packet({type: parser.CONNECT});\n    }\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function (reason) {\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function (packet) {\n  var sameNamespace = packet.nsp === this.nsp;\n  var rootNamespaceError = packet.type === parser.ERROR && packet.nsp === '/';\n\n  if (!sameNamespace && !rootNamespaceError) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function (packet) {\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function (id) {\n  var self = this;\n  var sent = false;\n  return function () {\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    self.packet({\n      type: hasBin(args) ? parser.BINARY_ACK : parser.ACK,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function (packet) {\n  var ack = this.acks[packet.id];\n  if ('function' === typeof ack) {\n    debug('calling ack %s with %j', packet.id, packet.data);\n    ack.apply(this, packet.data);\n    delete this.acks[packet.id];\n  } else {\n    debug('bad ack %s', packet.id);\n  }\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function () {\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function () {\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function () {\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function () {\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function () {\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n\n/**\n * Sets the compress flag.\n *\n * @param {Boolean} if `true`, compresses the sending data\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.compress = function (compress) {\n  this.flags.compress = compress;\n  return this;\n};\n\n/**\n * Sets the binary flag\n *\n * @param {Boolean} whether the emitted data contains binary\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.binary = function (binary) {\n  this.flags.binary = binary;\n  return this;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/socket.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/lib/url.js":
-/*!**************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/lib/url.js ***!
-  \**************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar parseuri = __webpack_require__(/*! parseuri */ \"./jaas-client/node_modules/parseuri/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url (uri, loc) {\n  var obj = uri;\n\n  // default to window.location\n  loc = loc || (typeof location !== 'undefined' && location);\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' === typeof uri) {\n    if ('/' === uri.charAt(0)) {\n      if ('/' === uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.host + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' !== typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    } else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  var ipv6 = obj.host.indexOf(':') !== -1;\n  var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\n  // define unique id\n  obj.id = obj.protocol + '://' + host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/url.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js ***!
-  \*******************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/binary.js":
-/*!*************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/binary.js ***!
-  \*************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js\");\nvar isBuf = __webpack_require__(/*! ./is-buffer */ \"./jaas-client/node_modules/socket.io-parser/is-buffer.js\");\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]');\nvar withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]');\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet) {\n  var buffers = [];\n  var packetData = packet.data;\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData, buffers);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\nfunction _deconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (isBuf(data)) {\n    var placeholder = { _placeholder: true, num: buffers.length };\n    buffers.push(data);\n    return placeholder;\n  } else if (isArray(data)) {\n    var newData = new Array(data.length);\n    for (var i = 0; i < data.length; i++) {\n      newData[i] = _deconstructPacket(data[i], buffers);\n    }\n    return newData;\n  } else if (typeof data === 'object' && !(data instanceof Date)) {\n    var newData = {};\n    for (var key in data) {\n      newData[key] = _deconstructPacket(data[key], buffers);\n    }\n    return newData;\n  }\n  return data;\n}\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  packet.data = _reconstructPacket(packet.data, buffers);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\nfunction _reconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (data && data._placeholder) {\n    return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n  } else if (isArray(data)) {\n    for (var i = 0; i < data.length; i++) {\n      data[i] = _reconstructPacket(data[i], buffers);\n    }\n  } else if (typeof data === 'object') {\n    for (var key in data) {\n      data[key] = _reconstructPacket(data[key], buffers);\n    }\n  }\n\n  return data;\n}\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (typeof obj === 'object' && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/binary.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/index.js":
-/*!************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/index.js ***!
-  \************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * Module dependencies.\n */\n\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js\")('socket.io-parser');\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js\");\nvar binary = __webpack_require__(/*! ./binary */ \"./jaas-client/node_modules/socket.io-parser/binary.js\");\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js\");\nvar isBuf = __webpack_require__(/*! ./is-buffer */ \"./jaas-client/node_modules/socket.io-parser/is-buffer.js\");\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'ACK',\n  'ERROR',\n  'BINARY_EVENT',\n  'BINARY_ACK'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\nvar ERROR_PACKET = exports.ERROR + '\"encode error\"';\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    encodeAsBinary(obj, callback);\n  } else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n\n  // first is type\n  var str = '' + obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    str += obj.attachments + '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' !== obj.nsp) {\n    str += obj.nsp + ',';\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    var payload = tryStringify(obj.data);\n    if (payload !== false) {\n      str += payload;\n    } else {\n      return ERROR_PACKET;\n    }\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\nfunction tryStringify(str) {\n  try {\n    return JSON.stringify(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if (typeof obj === 'string') {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  } else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  } else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var i = 0;\n  // look up type\n  var p = {\n    type: Number(str.charAt(0))\n  };\n\n  if (null == exports.types[p.type]) {\n    return error('unknown packet type ' + p.type);\n  }\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {\n    var buf = '';\n    while (str.charAt(++i) !== '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) !== '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' === str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' === c) break;\n      p.nsp += c;\n      if (i === str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i === str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    var payload = tryParse(str.substr(i));\n    var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));\n    if (isPayloadValid) {\n      p.data = payload;\n    } else {\n      return error('invalid payload');\n    }\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\nfunction tryParse(str) {\n  try {\n    return JSON.parse(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length === this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(msg) {\n  return {\n    type: exports.ERROR,\n    data: 'parser error: ' + msg\n  };\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/is-buffer.js":
-/*!****************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/is-buffer.js ***!
-  \****************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(Buffer) {\nmodule.exports = isBuf;\n\nvar withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function';\nvar withNativeArrayBuffer = typeof ArrayBuffer === 'function';\n\nvar isView = function (obj) {\n  return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer);\n};\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (withNativeBuffer && Buffer.isBuffer(obj)) ||\n          (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj)));\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/is-buffer.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js":
-/*!*******************************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js ***!
-  \*******************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js":
-/*!*************************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js ***!
-  \*************************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(/*! ./debug */ \"./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js\");\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js":
-/*!***********************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js ***!
-  \***********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = __webpack_require__(/*! ms */ \"./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js\");\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js":
-/*!*********************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js ***!
-  \*********************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isNaN(val) === false) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  return plural(ms, d, 'day') ||\n    plural(ms, h, 'hour') ||\n    plural(ms, m, 'minute') ||\n    plural(ms, s, 'second') ||\n    ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return;\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name;\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/soundmanager2/script/soundmanager2.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/soundmanager2/script/soundmanager2.js ***!
-  \************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/** @license\r\n *\r\n * SoundManager 2: JavaScript Sound for the Web\r\n * ----------------------------------------------\r\n * http://schillmania.com/projects/soundmanager2/\r\n *\r\n * Copyright (c) 2007, Scott Schiller. All rights reserved.\r\n * Code provided under the BSD License:\r\n * http://schillmania.com/projects/soundmanager2/license.txt\r\n *\r\n * V2.97a.20170601\r\n */\r\n\r\n/**\r\n * About this file\r\n * -------------------------------------------------------------------------------------\r\n * This is the fully-commented source version of the SoundManager 2 API,\r\n * recommended for use during development and testing.\r\n *\r\n * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)\r\n * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion\r\n * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)\r\n *\r\n * You may notice <d> and </d> comments in this source; these are delimiters for\r\n * debug blocks which are removed in the -nodebug builds, further optimizing code size.\r\n *\r\n * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)\r\n */\r\n\r\n(function SM2(window, _undefined) {\r\n\r\n/* global Audio, document, window, navigator, define, module, SM2_DEFER, opera, setTimeout, setInterval, clearTimeout, sm2Debugger */\r\n\r\n'use strict';\r\n\r\nif (!window || !window.document) {\r\n\r\n  // Don't cross the [environment] streams. SM2 expects to be running in a browser, not under node.js etc.\r\n  // Additionally, if a browser somehow manages to fail this test, as Egon said: \"It would be bad.\"\r\n\r\n  throw new Error('SoundManager requires a browser with window and document objects.');\r\n\r\n}\r\n\r\nvar soundManager = null;\r\n\r\n/**\r\n * The SoundManager constructor.\r\n *\r\n * @constructor\r\n * @param {string} smURL Optional: Path to SWF files\r\n * @param {string} smID Optional: The ID to use for the SWF container element\r\n * @this {SoundManager}\r\n * @return {SoundManager} The new SoundManager instance\r\n */\r\n\r\nfunction SoundManager(smURL, smID) {\r\n\r\n  /**\r\n   * soundManager configuration options list\r\n   * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)\r\n   * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})\r\n   */\r\n\r\n  this.setupOptions = {\r\n\r\n    url: (smURL || null),             // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/\r\n    flashVersion: 8,                  // flash build to use (8 or 9.) Some API features require 9.\r\n    debugMode: true,                  // enable debugging output (console.log() with HTML fallback)\r\n    debugFlash: false,                // enable debugging output inside SWF, troubleshoot Flash/browser issues\r\n    useConsole: true,                 // use console.log() if available (otherwise, writes to #soundmanager-debug element)\r\n    consoleOnly: true,                // if console is being used, do not create/write to #soundmanager-debug\r\n    waitForWindowLoad: false,         // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r\n    bgColor: '#ffffff',               // SWF background color. N/A when wmode = 'transparent'\r\n    useHighPerformance: false,        // position:fixed flash movie can help increase js/flash speed, minimize lag\r\n    flashPollingInterval: null,       // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.\r\n    html5PollingInterval: null,       // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.\r\n    flashLoadTimeout: 1000,           // msec to wait for flash movie to load before failing (0 = infinity)\r\n    wmode: null,                      // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)\r\n    allowScriptAccess: 'always',      // for scripting the SWF (object/embed property), 'always' or 'sameDomain'\r\n    useFlashBlock: false,             // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.\r\n    useHTML5Audio: true,              // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (MP3/MP4 support varies.) Ideally, transparent vs. Flash API where possible.\r\n    forceUseGlobalHTML5Audio: false,  // if true, a single Audio() object is used for all sounds - and only one can play at a time.\r\n    ignoreMobileRestrictions: false,  // if true, SM2 will not apply global HTML5 audio rules to mobile UAs. iOS > 7 and WebViews may allow multiple Audio() instances.\r\n    html5Test: /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.\r\n    preferFlash: false,               // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.\r\n    noSWFCache: false,                // if true, appends ?ts={date} to break aggressive SWF caching.\r\n    idPrefix: 'sound'                 // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.\r\n\r\n  };\r\n\r\n  this.defaultOptions = {\r\n\r\n    /**\r\n     * the default configuration for sound objects made with createSound() and related methods\r\n     * eg., volume, auto-load behaviour and so forth\r\n     */\r\n\r\n    autoLoad: false,        // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r\n    autoPlay: false,        // enable playing of file as soon as possible (much faster if \"stream\" is true)\r\n    from: null,             // position to start playback within a sound (msec), default = beginning\r\n    loops: 1,               // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)\r\n    onid3: null,            // callback function for \"ID3 data is added/available\"\r\n    onerror: null,          // callback function for \"load failed\" (or, playback/network/decode error under HTML5.)\r\n    onload: null,           // callback function for \"load finished\"\r\n    whileloading: null,     // callback function for \"download progress update\" (X of Y bytes received)\r\n    onplay: null,           // callback for \"play\" start\r\n    onpause: null,          // callback for \"pause\"\r\n    onresume: null,         // callback for \"resume\" (pause toggle)\r\n    whileplaying: null,     // callback during play (position update)\r\n    onposition: null,       // object containing times and function callbacks for positions of interest\r\n    onstop: null,           // callback for \"user stop\"\r\n    onfinish: null,         // callback function for \"sound finished playing\"\r\n    multiShot: true,        // let sounds \"restart\" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r\n    multiShotEvents: false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled\r\n    position: null,         // offset (milliseconds) to seek to within loaded sound data.\r\n    pan: 0,                 // \"pan\" settings, left-to-right, -100 to 100\r\n    playbackRate: 1,        // rate at which to play the sound (HTML5-only)\r\n    stream: true,           // allows playing before entire file has loaded (recommended)\r\n    to: null,               // position to end playback within a sound (msec), default = end\r\n    type: null,             // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3\r\n    usePolicyFile: false,   // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)\r\n    volume: 100             // self-explanatory. 0-100, the latter being the max.\r\n\r\n  };\r\n\r\n  this.flash9Options = {\r\n\r\n    /**\r\n     * flash 9-only options,\r\n     * merged into defaultOptions if flash 9 is being used\r\n     */\r\n\r\n    onfailure: null,        // callback function for when playing fails (Flash 9, MovieStar + RTMP-only)\r\n    isMovieStar: null,      // \"MovieStar\" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r\n    usePeakData: false,     // enable left/right channel peak (level) data\r\n    useWaveformData: false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.\r\n    useEQData: false,       // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.\r\n    onbufferchange: null,   // callback for \"isBuffering\" property change\r\n    ondataerror: null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)\r\n\r\n  };\r\n\r\n  this.movieStarOptions = {\r\n\r\n    /**\r\n     * flash 9.0r115+ MPEG4 audio options,\r\n     * merged into defaultOptions if flash 9+movieStar mode is enabled\r\n     */\r\n\r\n    bufferTime: 3,          // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)\r\n    serverURL: null,        // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants\r\n    onconnect: null,        // rtmp: callback for connection to flash media server\r\n    duration: null          // rtmp: song duration (msec)\r\n\r\n  };\r\n\r\n  this.audioFormats = {\r\n\r\n    /**\r\n     * determines HTML5 support + flash requirements.\r\n     * if no support (via flash and/or HTML5) for a \"required\" format, SM2 will fail to start.\r\n     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)\r\n     */\r\n\r\n    mp3: {\r\n      type: ['audio/mpeg; codecs=\"mp3\"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],\r\n      required: true\r\n    },\r\n\r\n    mp4: {\r\n      related: ['aac', 'm4a', 'm4b'], // additional formats under the MP4 container\r\n      type: ['audio/mp4; codecs=\"mp4a.40.2\"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],\r\n      required: false\r\n    },\r\n\r\n    ogg: {\r\n      type: ['audio/ogg; codecs=vorbis'],\r\n      required: false\r\n    },\r\n\r\n    opus: {\r\n      type: ['audio/ogg; codecs=opus', 'audio/opus'],\r\n      required: false\r\n    },\r\n\r\n    wav: {\r\n      type: ['audio/wav; codecs=\"1\"', 'audio/wav', 'audio/wave', 'audio/x-wav'],\r\n      required: false\r\n    },\r\n\r\n    flac: {\r\n      type: ['audio/flac'],\r\n      required: false\r\n    }\r\n\r\n  };\r\n\r\n  // HTML attributes (id + class names) for the SWF container\r\n\r\n  this.movieID = 'sm2-container';\r\n  this.id = (smID || 'sm2movie');\r\n\r\n  this.debugID = 'soundmanager-debug';\r\n  this.debugURLParam = /([#?&])debug=1/i;\r\n\r\n  // dynamic attributes\r\n\r\n  this.versionNumber = 'V2.97a.20170601';\r\n  this.version = null;\r\n  this.movieURL = null;\r\n  this.altURL = null;\r\n  this.swfLoaded = false;\r\n  this.enabled = false;\r\n  this.oMC = null;\r\n  this.sounds = {};\r\n  this.soundIDs = [];\r\n  this.muted = false;\r\n  this.didFlashBlock = false;\r\n  this.filePattern = null;\r\n\r\n  this.filePatterns = {\r\n    flash8: /\\.mp3(\\?.*)?$/i,\r\n    flash9: /\\.mp3(\\?.*)?$/i\r\n  };\r\n\r\n  // support indicators, set at init\r\n\r\n  this.features = {\r\n    buffering: false,\r\n    peakData: false,\r\n    waveformData: false,\r\n    eqData: false,\r\n    movieStar: false\r\n  };\r\n\r\n  // flash sandbox info, used primarily in troubleshooting\r\n\r\n  this.sandbox = {\r\n    // <d>\r\n    type: null,\r\n    types: {\r\n      remote: 'remote (domain-based) rules',\r\n      localWithFile: 'local with file access (no internet access)',\r\n      localWithNetwork: 'local with network (internet access only, no local access)',\r\n      localTrusted: 'local, trusted (local+internet access)'\r\n    },\r\n    description: null,\r\n    noRemote: null,\r\n    noLocal: null\r\n    // </d>\r\n  };\r\n\r\n  /**\r\n   * format support (html5/flash)\r\n   * stores canPlayType() results based on audioFormats.\r\n   * eg. { mp3: boolean, mp4: boolean }\r\n   * treat as read-only.\r\n   */\r\n\r\n  this.html5 = {\r\n    usingFlash: null // set if/when flash fallback is needed\r\n  };\r\n\r\n  // file type support hash\r\n  this.flash = {};\r\n\r\n  // determined at init time\r\n  this.html5Only = false;\r\n\r\n  // used for special cases (eg. iPad/iPhone/palm OS?)\r\n  this.ignoreFlash = false;\r\n\r\n  /**\r\n   * a few private internals (OK, a lot. :D)\r\n   */\r\n\r\n  var SMSound,\r\n  sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],\r\n  canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5ErrorCodes, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, didSetup, msecScale = 1000,\r\n  is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie|trident/i),\r\n  isWebkit = ua.match(/webkit/i),\r\n  isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)),\r\n  isOpera = (ua.match(/opera/i)),\r\n  mobileHTML5 = (ua.match(/(mobile|pre\\/|xoom)/i) || is_iDevice || isAndroid),\r\n  isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS\\sX\\s10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, \"Silk\") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159\r\n  hasConsole = (window.console !== _undefined && console.log !== _undefined),\r\n  isFocused = (doc.hasFocus !== _undefined ? doc.hasFocus() : null),\r\n  tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())),\r\n  okToDisable = !tryInitOnFocus,\r\n  flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i,\r\n  emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)\r\n  emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading\r\n  overHTTP = (doc.location ? doc.location.protocol.match(/http/i) : null),\r\n  http = (!overHTTP ? '//' : ''),\r\n  // mp3, mp4, aac etc.\r\n  netStreamMimeTypes = /^\\s*audio\\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\\s*(?:$|;)/i,\r\n  // Flash v9.0r115+ \"moviestar\" formats\r\n  netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],\r\n  netStreamPattern = new RegExp('\\\\.(' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n  this.mimePattern = /^\\s*audio\\/(?:x-)?(?:mp(?:eg|3))\\s*(?:$|;)/i; // default mp3 set\r\n\r\n  // use altURL if not \"online\"\r\n  this.useAltURL = !overHTTP;\r\n\r\n  swfCSS = {\r\n    swfBox: 'sm2-object-box',\r\n    swfDefault: 'movieContainer',\r\n    swfError: 'swf_error', // SWF loaded, but SM2 couldn't start (other error)\r\n    swfTimedout: 'swf_timedout',\r\n    swfLoaded: 'swf_loaded',\r\n    swfUnblocked: 'swf_unblocked', // or loaded OK\r\n    sm2Debug: 'sm2_debug',\r\n    highPerf: 'high_performance',\r\n    flashDebug: 'flash_debug'\r\n  };\r\n\r\n  /**\r\n   * HTML5 error codes, per W3C\r\n   * Error code 1, MEDIA_ERR_ABORTED: Client aborted download at user's request.\r\n   * Error code 2, MEDIA_ERR_NETWORK: A network error of some description caused the user agent to stop fetching the media resource, after the resource was established to be usable.\r\n   * Error code 3, MEDIA_ERR_DECODE: An error of some description occurred while decoding the media resource, after the resource was established to be usable.\r\n   * Error code 4, MEDIA_ERR_SRC_NOT_SUPPORTED: Media (audio file) not supported (\"not usable.\")\r\n   * Reference: https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n   */\r\n  html5ErrorCodes = [\r\n    null,\r\n    'MEDIA_ERR_ABORTED',\r\n    'MEDIA_ERR_NETWORK',\r\n    'MEDIA_ERR_DECODE',\r\n    'MEDIA_ERR_SRC_NOT_SUPPORTED'\r\n  ];\r\n\r\n  /**\r\n   * basic HTML5 Audio() support test\r\n   * try...catch because of IE 9 \"not implemented\" nonsense\r\n   * https://github.com/Modernizr/Modernizr/issues/224\r\n   */\r\n\r\n  this.hasHTML5 = (function() {\r\n    try {\r\n      // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.\r\n      return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);\r\n    } catch(e) {\r\n      return false;\r\n    }\r\n  }());\r\n\r\n  /**\r\n   * Public SoundManager API\r\n   * -----------------------\r\n   */\r\n\r\n  /**\r\n   * Configures top-level soundManager properties.\r\n   *\r\n   * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }\r\n   * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.\r\n   */\r\n\r\n  this.setup = function(options) {\r\n\r\n    var noURL = (!sm2.url);\r\n\r\n    // warn if flash options have already been applied\r\n\r\n    if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {\r\n      complain(str('setupLate'));\r\n    }\r\n\r\n    // TODO: defer: true?\r\n\r\n    assign(options);\r\n\r\n    if (!useGlobalHTML5Audio) {\r\n\r\n      if (mobileHTML5) {\r\n\r\n        // force the singleton HTML5 pattern on mobile, by default.\r\n        if (!sm2.setupOptions.ignoreMobileRestrictions || sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n          messages.push(strings.globalHTML5);\r\n          useGlobalHTML5Audio = true;\r\n        }\r\n\r\n      } else if (sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n\r\n        // only apply singleton HTML5 on desktop if forced.\r\n        messages.push(strings.globalHTML5);\r\n        useGlobalHTML5Audio = true;\r\n\r\n      }\r\n\r\n    }\r\n\r\n    if (!didSetup && mobileHTML5) {\r\n\r\n      if (sm2.setupOptions.ignoreMobileRestrictions) {\r\n\r\n        messages.push(strings.ignoreMobile);\r\n\r\n      } else {\r\n\r\n        // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.\r\n\r\n        // <d>\r\n        if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {\r\n          // notify that defaults are being changed.\r\n          sm2._wD(strings.mobileUA);\r\n        }\r\n        // </d>\r\n\r\n        sm2.setupOptions.useHTML5Audio = true;\r\n        sm2.setupOptions.preferFlash = false;\r\n\r\n        if (is_iDevice) {\r\n\r\n          // no flash here.\r\n          sm2.ignoreFlash = true;\r\n\r\n        } else if ((isAndroid && !ua.match(/android\\s2\\.3/i)) || !isAndroid) {\r\n\r\n          /**\r\n           * Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence.\r\n           * Common use case: exiting sound onfinish() -> createSound() -> play()\r\n           * Presuming similar restrictions for other mobile, non-Android, non-iOS devices.\r\n           */\r\n\r\n          // <d>\r\n          sm2._wD(strings.globalHTML5);\r\n          // </d>\r\n\r\n          useGlobalHTML5Audio = true;\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // special case 1: \"Late setup\". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.\r\n\r\n    if (options) {\r\n\r\n      if (noURL && didDCLoaded && options.url !== _undefined) {\r\n        sm2.beginDelayedInit();\r\n      }\r\n\r\n      // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.\r\n\r\n      if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {\r\n        setTimeout(domContentLoaded, 1);\r\n      }\r\n\r\n    }\r\n\r\n    didSetup = true;\r\n\r\n    return sm2;\r\n\r\n  };\r\n\r\n  this.ok = function() {\r\n\r\n    return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));\r\n\r\n  };\r\n\r\n  this.supported = this.ok; // legacy\r\n\r\n  this.getMovie = function(movie_id) {\r\n\r\n    // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version\r\n    return id(movie_id) || doc[movie_id] || window[movie_id];\r\n\r\n  };\r\n\r\n  /**\r\n   * Creates a SMSound sound object instance. Can also be overloaded, e.g., createSound('mySound', '/some.mp3');\r\n   *\r\n   * @param {object} oOptions Sound options (at minimum, url parameter is required.)\r\n   * @return {object} SMSound The new SMSound object.\r\n   */\r\n\r\n  this.createSound = function(oOptions, _url) {\r\n\r\n    var cs, cs_string, options, oSound = null;\r\n\r\n    // <d>\r\n    cs = sm + '.createSound(): ';\r\n    cs_string = cs + str(!didInit ? 'notReady' : 'notOK');\r\n    // </d>\r\n\r\n    if (!didInit || !sm2.ok()) {\r\n      complain(cs_string);\r\n      return false;\r\n    }\r\n\r\n    if (_url !== _undefined) {\r\n      // function overloading in JS! :) ... assume simple createSound(id, url) use case.\r\n      oOptions = {\r\n        id: oOptions,\r\n        url: _url\r\n      };\r\n    }\r\n\r\n    // inherit from defaultOptions\r\n    options = mixin(oOptions);\r\n\r\n    options.url = parseURL(options.url);\r\n\r\n    // generate an id, if needed.\r\n    if (options.id === _undefined) {\r\n      options.id = sm2.setupOptions.idPrefix + (idCounter++);\r\n    }\r\n\r\n    // <d>\r\n    if (options.id.toString().charAt(0).match(/^[0-9]$/)) {\r\n      sm2._wD(cs + str('badID', options.id), 2);\r\n    }\r\n\r\n    sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);\r\n    // </d>\r\n\r\n    if (idCheck(options.id, true)) {\r\n      sm2._wD(cs + options.id + ' exists', 1);\r\n      return sm2.sounds[options.id];\r\n    }\r\n\r\n    function make() {\r\n\r\n      options = loopFix(options);\r\n      sm2.sounds[options.id] = new SMSound(options);\r\n      sm2.soundIDs.push(options.id);\r\n      return sm2.sounds[options.id];\r\n\r\n    }\r\n\r\n    if (html5OK(options)) {\r\n\r\n      oSound = make();\r\n      // <d>\r\n      if (!sm2.html5Only) {\r\n        sm2._wD(options.id + ': Using HTML5');\r\n      }\r\n      // </d>\r\n      oSound._setup_html5(options);\r\n\r\n    } else {\r\n\r\n      if (sm2.html5Only) {\r\n        sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');\r\n        return make();\r\n      }\r\n\r\n      // TODO: Move HTML5/flash checks into generic URL parsing/handling function.\r\n\r\n      if (sm2.html5.usingFlash && options.url && options.url.match(/data:/i)) {\r\n        // data: URIs not supported by Flash, either.\r\n        sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');\r\n        return make();\r\n      }\r\n\r\n      if (fV > 8) {\r\n        if (options.isMovieStar === null) {\r\n          // attempt to detect MPEG-4 formats\r\n          options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));\r\n        }\r\n        // <d>\r\n        if (options.isMovieStar) {\r\n          sm2._wD(cs + 'using MovieStar handling');\r\n          if (options.loops > 1) {\r\n            _wDS('noNSLoop');\r\n          }\r\n        }\r\n        // </d>\r\n      }\r\n\r\n      options = policyFix(options, cs);\r\n      oSound = make();\r\n\r\n      if (fV === 8) {\r\n        flash._createSound(options.id, options.loops || 1, options.usePolicyFile);\r\n      } else {\r\n        flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar ? options.bufferTime : false), options.loops || 1, options.serverURL, options.duration || null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);\r\n        if (!options.serverURL) {\r\n          // We are connected immediately\r\n          oSound.connected = true;\r\n          if (options.onconnect) {\r\n            options.onconnect.apply(oSound);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!options.serverURL && (options.autoLoad || options.autoPlay)) {\r\n        // call load for non-rtmp streams\r\n        oSound.load(options);\r\n      }\r\n\r\n    }\r\n\r\n    // rtmp will play in onconnect\r\n    if (!options.serverURL && options.autoPlay) {\r\n      oSound.play();\r\n    }\r\n\r\n    return oSound;\r\n\r\n  };\r\n\r\n  /**\r\n   * Destroys a SMSound sound object instance.\r\n   *\r\n   * @param {string} sID The ID of the sound to destroy\r\n   */\r\n\r\n  this.destroySound = function(sID, _bFromSound) {\r\n\r\n    // explicitly destroy a sound before normal page unload, etc.\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    var oS = sm2.sounds[sID], i;\r\n\r\n    oS.stop();\r\n\r\n    // Disable all callbacks after stop(), when the sound is being destroyed\r\n    oS._iO = {};\r\n\r\n    oS.unload();\r\n\r\n    for (i = 0; i < sm2.soundIDs.length; i++) {\r\n      if (sm2.soundIDs[i] === sID) {\r\n        sm2.soundIDs.splice(i, 1);\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (!_bFromSound) {\r\n      // ignore if being called from SMSound instance\r\n      oS.destruct(true);\r\n    }\r\n\r\n    oS = null;\r\n    delete sm2.sounds[sID];\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the load() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {object} oOptions Optional: Sound options\r\n   */\r\n\r\n  this.load = function(sID, oOptions) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].load(oOptions);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the unload() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   */\r\n\r\n  this.unload = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].unload();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the onPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPosition The position to watch for\r\n   * @param {function} oMethod The relevant callback to fire\r\n   * @param {object} oScope Optional: The scope to apply the callback to\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.onPosition = function(sID, nPosition, oMethod, oScope) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);\r\n\r\n  };\r\n\r\n  // legacy/backwards-compability: lower-case method name\r\n  this.onposition = this.onPosition;\r\n\r\n  /**\r\n   * Calls the clearOnPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPosition The position to watch for\r\n   * @param {function} oMethod Optional: The relevant callback to fire\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.clearOnPosition = function(sID, nPosition, oMethod) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the play() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {object} oOptions Optional: Sound options\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.play = function(sID, oOptions) {\r\n\r\n    var result = null,\r\n        // legacy function-overloading use case: play('mySound', '/path/to/some.mp3');\r\n        overloaded = (oOptions && !(oOptions instanceof Object));\r\n\r\n    if (!didInit || !sm2.ok()) {\r\n      complain(sm + '.play(): ' + str(!didInit ? 'notReady' : 'notOK'));\r\n      return false;\r\n    }\r\n\r\n    if (!idCheck(sID, overloaded)) {\r\n\r\n      // no sound found for the given ID. Bail.\r\n      if (!overloaded) return false;\r\n\r\n      if (overloaded) {\r\n        oOptions = {\r\n          url: oOptions\r\n        };\r\n      }\r\n\r\n      if (oOptions && oOptions.url) {\r\n        // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});\r\n        sm2._wD(sm + '.play(): Attempting to create \"' + sID + '\"', 1);\r\n        oOptions.id = sID;\r\n        result = sm2.createSound(oOptions).play();\r\n      }\r\n\r\n    } else if (overloaded) {\r\n\r\n      // existing sound object case\r\n      oOptions = {\r\n        url: oOptions\r\n      };\r\n\r\n    }\r\n\r\n    if (result === null) {\r\n      // default case\r\n      result = sm2.sounds[sID].play(oOptions);\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  // just for convenience\r\n  this.start = this.play;\r\n\r\n  /**\r\n   * Calls the setPlaybackRate() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPlaybackRate = function(sID, rate, allowOverride) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPlaybackRate(rate, allowOverride);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nMsecOffset Position (milliseconds)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPosition = function(sID, nMsecOffset) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPosition(nMsecOffset);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the stop() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.stop = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    sm2._wD(sm + '.stop(' + sID + ')', 1);\r\n\r\n    return sm2.sounds[sID].stop();\r\n\r\n  };\r\n\r\n  /**\r\n   * Stops all currently-playing sounds.\r\n   */\r\n\r\n  this.stopAll = function() {\r\n\r\n    var oSound;\r\n    sm2._wD(sm + '.stopAll()', 1);\r\n\r\n    for (oSound in sm2.sounds) {\r\n      if (sm2.sounds.hasOwnProperty(oSound)) {\r\n        // apply only to sound objects\r\n        sm2.sounds[oSound].stop();\r\n      }\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the pause() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.pause = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].pause();\r\n\r\n  };\r\n\r\n  /**\r\n   * Pauses all currently-playing sounds.\r\n   */\r\n\r\n  this.pauseAll = function() {\r\n\r\n    var i;\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].pause();\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the resume() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.resume = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].resume();\r\n\r\n  };\r\n\r\n  /**\r\n   * Resumes all currently-paused sounds.\r\n   */\r\n\r\n  this.resumeAll = function() {\r\n\r\n    var i;\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].resume();\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the togglePause() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.togglePause = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].togglePause();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setPan() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPan The pan value (-100 to 100)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPan = function(sID, nPan) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPan(nPan);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setVolume() method of a SMSound object by ID\r\n   * Overloaded case: pass only volume argument eg., setVolume(50) to apply to all sounds.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nVol The volume value (0 to 100)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setVolume = function(sID, nVol) {\r\n\r\n    // setVolume(50) function overloading case - apply to all sounds\r\n\r\n    var i, j;\r\n\r\n    if (sID !== _undefined && !isNaN(sID) && nVol === _undefined) {\r\n      for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n        sm2.sounds[sm2.soundIDs[i]].setVolume(sID);\r\n      }\r\n      return false;\r\n    }\r\n\r\n    // setVolume('mySound', 50) case\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setVolume(nVol);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the mute() method of either a single SMSound object by ID, or all sound objects.\r\n   *\r\n   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n   */\r\n\r\n  this.mute = function(sID) {\r\n\r\n    var i = 0;\r\n\r\n    if (sID instanceof String) {\r\n      sID = null;\r\n    }\r\n\r\n    if (!sID) {\r\n\r\n      sm2._wD(sm + '.mute(): Muting all sounds');\r\n      for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n        sm2.sounds[sm2.soundIDs[i]].mute();\r\n      }\r\n      sm2.muted = true;\r\n\r\n    } else {\r\n\r\n      if (!idCheck(sID)) return false;\r\n\r\n      sm2._wD(sm + '.mute(): Muting \"' + sID + '\"');\r\n      return sm2.sounds[sID].mute();\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Mutes all sounds.\r\n   */\r\n\r\n  this.muteAll = function() {\r\n\r\n    sm2.mute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.\r\n   *\r\n   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n   */\r\n\r\n  this.unmute = function(sID) {\r\n\r\n    var i;\r\n\r\n    if (sID instanceof String) {\r\n      sID = null;\r\n    }\r\n\r\n    if (!sID) {\r\n\r\n      sm2._wD(sm + '.unmute(): Unmuting all sounds');\r\n      for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n        sm2.sounds[sm2.soundIDs[i]].unmute();\r\n      }\r\n      sm2.muted = false;\r\n\r\n    } else {\r\n\r\n      if (!idCheck(sID)) return false;\r\n\r\n      sm2._wD(sm + '.unmute(): Unmuting \"' + sID + '\"');\r\n\r\n      return sm2.sounds[sID].unmute();\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Unmutes all sounds.\r\n   */\r\n\r\n  this.unmuteAll = function() {\r\n\r\n    sm2.unmute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the toggleMute() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.toggleMute = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].toggleMute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Retrieves the memory used by the flash plugin.\r\n   *\r\n   * @return {number} The amount of memory in use\r\n   */\r\n\r\n  this.getMemoryUse = function() {\r\n\r\n    // flash-only\r\n    var ram = 0;\r\n\r\n    if (flash && fV !== 8) {\r\n      ram = parseInt(flash._getMemoryUse(), 10);\r\n    }\r\n\r\n    return ram;\r\n\r\n  };\r\n\r\n  /**\r\n   * Undocumented: NOPs soundManager and all SMSound objects.\r\n   */\r\n\r\n  this.disable = function(bNoDisable) {\r\n\r\n    // destroy all functions\r\n    var i;\r\n\r\n    if (bNoDisable === _undefined) {\r\n      bNoDisable = false;\r\n    }\r\n\r\n    // already disabled?\r\n    if (disabled) return false;\r\n\r\n    disabled = true;\r\n\r\n    _wDS('shutdown', 1);\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      disableObject(sm2.sounds[sm2.soundIDs[i]]);\r\n    }\r\n\r\n    disableObject(sm2);\r\n\r\n    // fire \"complete\", despite fail\r\n    initComplete(bNoDisable);\r\n\r\n    event.remove(window, 'load', initUserOnload);\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of a MIME type, eg. 'audio/mp3'.\r\n   */\r\n\r\n  this.canPlayMIME = function(sMIME) {\r\n\r\n    var result;\r\n\r\n    if (sm2.hasHTML5) {\r\n      result = html5CanPlay({\r\n        type: sMIME\r\n      });\r\n    }\r\n\r\n    if (!result && needsFlash) {\r\n      // if flash 9, test netStream (movieStar) types as well.\r\n      result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less \"weird\" (per JSLint)\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of a URL based on audio support.\r\n   *\r\n   * @param {string} sURL The URL to test\r\n   * @return {boolean} URL playability\r\n   */\r\n\r\n  this.canPlayURL = function(sURL) {\r\n\r\n    var result;\r\n\r\n    if (sm2.hasHTML5) {\r\n      result = html5CanPlay({\r\n        url: sURL\r\n      });\r\n    }\r\n\r\n    if (!result && needsFlash) {\r\n      result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of an HTML DOM &lt;a&gt; object (or similar object literal) based on audio support.\r\n   *\r\n   * @param {object} oLink an HTML DOM &lt;a&gt; object or object literal including href and/or type attributes\r\n   * @return {boolean} URL playability\r\n   */\r\n\r\n  this.canPlayLink = function(oLink) {\r\n\r\n    if (oLink.type !== _undefined && oLink.type && sm2.canPlayMIME(oLink.type)) return true;\r\n\r\n    return sm2.canPlayURL(oLink.href);\r\n\r\n  };\r\n\r\n  /**\r\n   * Retrieves a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.getSoundById = function(sID, _suppressDebug) {\r\n\r\n    if (!sID) return null;\r\n\r\n    var result = sm2.sounds[sID];\r\n\r\n    // <d>\r\n    if (!result && !_suppressDebug) {\r\n      sm2._wD(sm + '.getSoundById(): Sound \"' + sID + '\" not found.', 2);\r\n    }\r\n    // </d>\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Queues a callback for execution when SoundManager has successfully initialized.\r\n   *\r\n   * @param {function} oMethod The callback method to fire\r\n   * @param {object} oScope Optional: The scope to apply to the callback\r\n   */\r\n\r\n  this.onready = function(oMethod, oScope) {\r\n\r\n    var sType = 'onready',\r\n        result = false;\r\n\r\n    if (typeof oMethod === 'function') {\r\n\r\n      // <d>\r\n      if (didInit) {\r\n        sm2._wD(str('queue', sType));\r\n      }\r\n      // </d>\r\n\r\n      if (!oScope) {\r\n        oScope = window;\r\n      }\r\n\r\n      addOnEvent(sType, oMethod, oScope);\r\n      processOnEvents();\r\n\r\n      result = true;\r\n\r\n    } else {\r\n\r\n      throw str('needFunction', sType);\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Queues a callback for execution when SoundManager has failed to initialize.\r\n   *\r\n   * @param {function} oMethod The callback method to fire\r\n   * @param {object} oScope Optional: The scope to apply to the callback\r\n   */\r\n\r\n  this.ontimeout = function(oMethod, oScope) {\r\n\r\n    var sType = 'ontimeout',\r\n        result = false;\r\n\r\n    if (typeof oMethod === 'function') {\r\n\r\n      // <d>\r\n      if (didInit) {\r\n        sm2._wD(str('queue', sType));\r\n      }\r\n      // </d>\r\n\r\n      if (!oScope) {\r\n        oScope = window;\r\n      }\r\n\r\n      addOnEvent(sType, oMethod, oScope);\r\n      processOnEvents({ type: sType });\r\n\r\n      result = true;\r\n\r\n    } else {\r\n\r\n      throw str('needFunction', sType);\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Writes console.log()-style debug output to a console or in-browser element.\r\n   * Applies when debugMode = true\r\n   *\r\n   * @param {string} sText The console message\r\n   * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.\r\n   */\r\n\r\n  this._writeDebug = function(sText, sTypeOrObject) {\r\n\r\n    // pseudo-private console.log()-style output\r\n    // <d>\r\n\r\n    var sDID = 'soundmanager-debug', o, oItem;\r\n\r\n    if (!sm2.setupOptions.debugMode) return false;\r\n\r\n    if (hasConsole && sm2.useConsole) {\r\n      if (sTypeOrObject && typeof sTypeOrObject === 'object') {\r\n        // object passed; dump to console.\r\n        console.log(sText, sTypeOrObject);\r\n      } else if (debugLevels[sTypeOrObject] !== _undefined) {\r\n        console[debugLevels[sTypeOrObject]](sText);\r\n      } else {\r\n        console.log(sText);\r\n      }\r\n      if (sm2.consoleOnly) return true;\r\n    }\r\n\r\n    o = id(sDID);\r\n\r\n    if (!o) return false;\r\n\r\n    oItem = doc.createElement('div');\r\n\r\n    if (++wdCount % 2 === 0) {\r\n      oItem.className = 'sm2-alt';\r\n    }\r\n\r\n    if (sTypeOrObject === _undefined) {\r\n      sTypeOrObject = 0;\r\n    } else {\r\n      sTypeOrObject = parseInt(sTypeOrObject, 10);\r\n    }\r\n\r\n    oItem.appendChild(doc.createTextNode(sText));\r\n\r\n    if (sTypeOrObject) {\r\n      if (sTypeOrObject >= 2) {\r\n        oItem.style.fontWeight = 'bold';\r\n      }\r\n      if (sTypeOrObject === 3) {\r\n        oItem.style.color = '#ff3333';\r\n      }\r\n    }\r\n\r\n    // top-to-bottom\r\n    // o.appendChild(oItem);\r\n\r\n    // bottom-to-top\r\n    o.insertBefore(oItem, o.firstChild);\r\n\r\n    o = null;\r\n    // </d>\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  // <d>\r\n  // last-resort debugging option\r\n  if (wl.indexOf('sm2-debug=alert') !== -1) {\r\n    this._writeDebug = function(sText) {\r\n      window.alert(sText);\r\n    };\r\n  }\r\n  // </d>\r\n\r\n  // alias\r\n  this._wD = this._writeDebug;\r\n\r\n  /**\r\n   * Provides debug / state information on all SMSound objects.\r\n   */\r\n\r\n  this._debug = function() {\r\n\r\n    // <d>\r\n    var i, j;\r\n    _wDS('currentObj', 1);\r\n\r\n    for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n      sm2.sounds[sm2.soundIDs[i]]._debug();\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  /**\r\n   * Restarts and re-initializes the SoundManager instance.\r\n   *\r\n   * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.\r\n   * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).\r\n   * @return {object} soundManager The soundManager instance.\r\n   */\r\n\r\n  this.reboot = function(resetEvents, excludeInit) {\r\n\r\n    // reset some (or all) state, and re-init unless otherwise specified.\r\n\r\n    // <d>\r\n    if (sm2.soundIDs.length) {\r\n      sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');\r\n    }\r\n    // </d>\r\n\r\n    var i, j, k;\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].destruct();\r\n    }\r\n\r\n    // trash ze flash (remove from the DOM)\r\n\r\n    if (flash) {\r\n\r\n      try {\r\n\r\n        if (isIE) {\r\n          oRemovedHTML = flash.innerHTML;\r\n        }\r\n\r\n        oRemoved = flash.parentNode.removeChild(flash);\r\n\r\n      } catch(e) {\r\n\r\n        // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.\r\n\r\n        _wDS('badRemove', 2);\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // actually, force recreate of movie.\r\n\r\n    oRemovedHTML = oRemoved = needsFlash = flash = null;\r\n\r\n    sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;\r\n\r\n    sm2.soundIDs = [];\r\n    sm2.sounds = {};\r\n\r\n    idCounter = 0;\r\n    didSetup = false;\r\n\r\n    if (!resetEvents) {\r\n      // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init\r\n      for (i in on_queue) {\r\n        if (on_queue.hasOwnProperty(i)) {\r\n          for (j = 0, k = on_queue[i].length; j < k; j++) {\r\n            on_queue[i][j].fired = false;\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      // remove all callbacks entirely\r\n      on_queue = [];\r\n    }\r\n\r\n    // <d>\r\n    if (!excludeInit) {\r\n      sm2._wD(sm + ': Rebooting...');\r\n    }\r\n    // </d>\r\n\r\n    // reset HTML5 and flash canPlay test results\r\n\r\n    sm2.html5 = {\r\n      usingFlash: null\r\n    };\r\n\r\n    sm2.flash = {};\r\n\r\n    // reset device-specific HTML/flash mode switches\r\n\r\n    sm2.html5Only = false;\r\n    sm2.ignoreFlash = false;\r\n\r\n    window.setTimeout(function() {\r\n\r\n      // by default, re-init\r\n\r\n      if (!excludeInit) {\r\n        sm2.beginDelayedInit();\r\n      }\r\n\r\n    }, 20);\r\n\r\n    return sm2;\r\n\r\n  };\r\n\r\n  this.reset = function() {\r\n\r\n    /**\r\n     * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.\r\n     * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().\r\n     * @return {object} soundManager The soundManager instance.\r\n     */\r\n\r\n    _wDS('reset');\r\n\r\n    return sm2.reboot(true, true);\r\n\r\n  };\r\n\r\n  /**\r\n   * Undocumented: Determines the SM2 flash movie's load progress.\r\n   *\r\n   * @return {number or null} Percent loaded, or if invalid/unsupported, null.\r\n   */\r\n\r\n  this.getMoviePercent = function() {\r\n\r\n    /**\r\n     * Interesting syntax notes...\r\n     * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof \"function\" nor instanceof Function, but are still valid.\r\n     * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw \"object doesn't support this property or method\".\r\n     * Thus, 'in' syntax must be used.\r\n     */\r\n\r\n    return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null);\r\n\r\n  };\r\n\r\n  /**\r\n   * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().\r\n   */\r\n\r\n  this.beginDelayedInit = function() {\r\n\r\n    windowLoaded = true;\r\n    domContentLoaded();\r\n\r\n    setTimeout(function() {\r\n\r\n      if (initPending) return false;\r\n\r\n      createMovie();\r\n      initMovie();\r\n      initPending = true;\r\n\r\n      return true;\r\n\r\n    }, 20);\r\n\r\n    delayWaitForEI();\r\n\r\n  };\r\n\r\n  /**\r\n   * Destroys the SoundManager instance and all SMSound instances.\r\n   */\r\n\r\n  this.destruct = function() {\r\n\r\n    sm2._wD(sm + '.destruct()');\r\n    sm2.disable(true);\r\n\r\n  };\r\n\r\n  /**\r\n   * SMSound() (sound object) constructor\r\n   * ------------------------------------\r\n   *\r\n   * @param {object} oOptions Sound options (id and url are required attributes)\r\n   * @return {SMSound} The new SMSound object\r\n   */\r\n\r\n  SMSound = function(oOptions) {\r\n\r\n    var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;\r\n\r\n    lastHTML5State = {\r\n      // tracks duration + position (time)\r\n      duration: null,\r\n      time: null\r\n    };\r\n\r\n    this.id = oOptions.id;\r\n\r\n    // legacy\r\n    this.sID = this.id;\r\n\r\n    this.url = oOptions.url;\r\n    this.options = mixin(oOptions);\r\n\r\n    // per-play-instance-specific options\r\n    this.instanceOptions = this.options;\r\n\r\n    // short alias\r\n    this._iO = this.instanceOptions;\r\n\r\n    // assign property defaults\r\n    this.pan = this.options.pan;\r\n    this.volume = this.options.volume;\r\n\r\n    // whether or not this object is using HTML5\r\n    this.isHTML5 = false;\r\n\r\n    // internal HTML5 Audio() object reference\r\n    this._a = null;\r\n\r\n    // for flash 8 special-case createSound() without url, followed by load/play with url case\r\n    urlOmitted = (!this.url);\r\n\r\n    /**\r\n     * SMSound() public methods\r\n     * ------------------------\r\n     */\r\n\r\n    this.id3 = {};\r\n\r\n    /**\r\n     * Writes SMSound object parameters to debug console\r\n     */\r\n\r\n    this._debug = function() {\r\n\r\n      // <d>\r\n      sm2._wD(s.id + ': Merged options:', s.options);\r\n      // </d>\r\n\r\n    };\r\n\r\n    /**\r\n     * Begins loading a sound per its *url*.\r\n     *\r\n     * @param {object} options Optional: Sound options\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.load = function(options) {\r\n\r\n      var oSound = null, instanceOptions;\r\n\r\n      if (options !== _undefined) {\r\n        s._iO = mixin(options, s.options);\r\n      } else {\r\n        options = s.options;\r\n        s._iO = options;\r\n        if (lastURL && lastURL !== s.url) {\r\n          _wDS('manURL');\r\n          s._iO.url = s.url;\r\n          s.url = null;\r\n        }\r\n      }\r\n\r\n      if (!s._iO.url) {\r\n        s._iO.url = s.url;\r\n      }\r\n\r\n      s._iO.url = parseURL(s._iO.url);\r\n\r\n      // ensure we're in sync\r\n      s.instanceOptions = s._iO;\r\n\r\n      // local shortcut\r\n      instanceOptions = s._iO;\r\n\r\n      sm2._wD(s.id + ': load (' + instanceOptions.url + ')');\r\n\r\n      if (!instanceOptions.url && !s.url) {\r\n        sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);\r\n        return s;\r\n      }\r\n\r\n      // <d>\r\n      if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {\r\n        // flash 8 load() -> play() won't work before onload has fired.\r\n        sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);\r\n      }\r\n      // </d>\r\n\r\n      if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {\r\n        _wDS('onURL', 1);\r\n        // if loaded and an onload() exists, fire immediately.\r\n        if (s.readyState === 3 && instanceOptions.onload) {\r\n          // assume success based on truthy duration.\r\n          wrapCallback(s, function() {\r\n            instanceOptions.onload.apply(s, [(!!s.duration)]);\r\n          });\r\n        }\r\n        return s;\r\n      }\r\n\r\n      // reset a few state properties\r\n\r\n      s.loaded = false;\r\n      s.readyState = 1;\r\n      s.playState = 0;\r\n      s.id3 = {};\r\n\r\n      // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.\r\n\r\n      if (html5OK(instanceOptions)) {\r\n\r\n        oSound = s._setup_html5(instanceOptions);\r\n\r\n        if (!oSound._called_load) {\r\n\r\n          s._html5_canplay = false;\r\n\r\n          // TODO: review called_load / html5_canplay logic\r\n\r\n          // if url provided directly to load(), assign it here.\r\n\r\n          if (s.url !== instanceOptions.url) {\r\n\r\n            sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);\r\n\r\n            s._a.src = instanceOptions.url;\r\n\r\n            // TODO: review / re-apply all relevant options (volume, loop, onposition etc.)\r\n\r\n            // reset position for new URL\r\n            s.setPosition(0);\r\n\r\n          }\r\n\r\n          // given explicit load call, try to preload.\r\n\r\n          // early HTML5 implementation (non-standard)\r\n          s._a.autobuffer = 'auto';\r\n\r\n          // standard property, values: none / metadata / auto\r\n          // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx\r\n          s._a.preload = 'auto';\r\n\r\n          s._a._called_load = true;\r\n\r\n        } else {\r\n\r\n          sm2._wD(s.id + ': Ignoring request to load again');\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        if (sm2.html5Only) {\r\n          sm2._wD(s.id + ': No flash support. Exiting.');\r\n          return s;\r\n        }\r\n\r\n        if (s._iO.url && s._iO.url.match(/data:/i)) {\r\n          // data: URIs not supported by Flash, either.\r\n          sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');\r\n          return s;\r\n        }\r\n\r\n        try {\r\n          s.isHTML5 = false;\r\n          s._iO = policyFix(loopFix(instanceOptions));\r\n          // if we have \"position\", disable auto-play as we'll be seeking to that position at onload().\r\n          if (s._iO.autoPlay && (s._iO.position || s._iO.from)) {\r\n            sm2._wD(s.id + ': Disabling autoPlay because of non-zero offset case');\r\n            s._iO.autoPlay = false;\r\n          }\r\n          // re-assign local shortcut\r\n          instanceOptions = s._iO;\r\n          if (fV === 8) {\r\n            flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);\r\n          } else {\r\n            flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops || 1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);\r\n          }\r\n        } catch(e) {\r\n          _wDS('smError', 2);\r\n          debugTS('onload', false);\r\n          catchError({\r\n            type: 'SMSOUND_LOAD_JS_EXCEPTION',\r\n            fatal: true\r\n          });\r\n        }\r\n\r\n      }\r\n\r\n      // after all of this, ensure sound url is up to date.\r\n      s.url = instanceOptions.url;\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unloads a sound, canceling any open HTTP requests.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.unload = function() {\r\n\r\n      // Flash 8/AS2 can't \"close\" a stream - fake it by loading an empty URL\r\n      // Flash 9/AS3: Close stream, preventing further load\r\n      // HTML5: Most UAs will use empty URL\r\n\r\n      if (s.readyState !== 0) {\r\n\r\n        sm2._wD(s.id + ': unload()');\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          if (fV === 8) {\r\n            flash._unload(s.id, emptyURL);\r\n          } else {\r\n            flash._unload(s.id);\r\n          }\r\n\r\n        } else {\r\n\r\n          stop_html5_timer();\r\n\r\n          if (s._a) {\r\n\r\n            s._a.pause();\r\n\r\n            // update empty URL, too\r\n            lastURL = html5Unload(s._a);\r\n\r\n          }\r\n\r\n        }\r\n\r\n        // reset load/status flags\r\n        resetProperties();\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unloads and destroys a sound.\r\n     */\r\n\r\n    this.destruct = function(_bFromSM) {\r\n\r\n      sm2._wD(s.id + ': Destruct');\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        // kill sound within Flash\r\n        // Disable the onfailure handler\r\n        s._iO.onfailure = null;\r\n        flash._destroySound(s.id);\r\n\r\n      } else {\r\n\r\n        stop_html5_timer();\r\n\r\n        if (s._a) {\r\n          s._a.pause();\r\n          html5Unload(s._a);\r\n          if (!useGlobalHTML5Audio) {\r\n            remove_html5_events();\r\n          }\r\n          // break obvious circular reference\r\n          s._a._s = null;\r\n          s._a = null;\r\n        }\r\n\r\n      }\r\n\r\n      if (!_bFromSM) {\r\n        // ensure deletion from controller\r\n        sm2.destroySound(s.id, true);\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Begins playing a sound.\r\n     *\r\n     * @param {object} options Optional: Sound options\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.play = function(options, _updatePlayState) {\r\n\r\n      var fN, allowMulti, a, onready,\r\n          audioClone, onended, oncanplay,\r\n          startOK = true;\r\n\r\n      // <d>\r\n      fN = s.id + ': play(): ';\r\n      // </d>\r\n\r\n      // default to true\r\n      _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);\r\n\r\n      if (!options) {\r\n        options = {};\r\n      }\r\n\r\n      // first, use local URL (if specified)\r\n      if (s.url) {\r\n        s._iO.url = s.url;\r\n      }\r\n\r\n      // mix in any options defined at createSound()\r\n      s._iO = mixin(s._iO, s.options);\r\n\r\n      // mix in any options specific to this method\r\n      s._iO = mixin(options, s._iO);\r\n\r\n      s._iO.url = parseURL(s._iO.url);\r\n\r\n      s.instanceOptions = s._iO;\r\n\r\n      // RTMP-only\r\n      if (!s.isHTML5 && s._iO.serverURL && !s.connected) {\r\n        if (!s.getAutoPlay()) {\r\n          sm2._wD(fN + ' Netstream not connected yet - setting autoPlay');\r\n          s.setAutoPlay(true);\r\n        }\r\n        // play will be called in onconnect()\r\n        return s;\r\n      }\r\n\r\n      if (html5OK(s._iO)) {\r\n        s._setup_html5(s._iO);\r\n        start_html5_timer();\r\n      }\r\n\r\n      if (s.playState === 1 && !s.paused) {\r\n\r\n        allowMulti = s._iO.multiShot;\r\n\r\n        if (!allowMulti) {\r\n\r\n          sm2._wD(fN + 'Already playing (one-shot)', 1);\r\n\r\n          if (s.isHTML5) {\r\n            // go back to original position.\r\n            s.setPosition(s._iO.position);\r\n          }\r\n\r\n          return s;\r\n\r\n        }\r\n\r\n        sm2._wD(fN + 'Already playing (multi-shot)', 1);\r\n\r\n      }\r\n\r\n      // edge case: play() with explicit URL parameter\r\n      if (options.url && options.url !== s.url) {\r\n\r\n        // special case for createSound() followed by load() / play() with url; avoid double-load case.\r\n        if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {\r\n\r\n          urlOmitted = false;\r\n\r\n        } else {\r\n\r\n          // load using merged options\r\n          s.load(s._iO);\r\n\r\n        }\r\n\r\n      }\r\n\r\n      if (!s.loaded) {\r\n\r\n        if (s.readyState === 0) {\r\n\r\n          sm2._wD(fN + 'Attempting to load');\r\n\r\n          // try to get this sound playing ASAP\r\n          if (!s.isHTML5 && !sm2.html5Only) {\r\n\r\n            // flash: assign directly because setAutoPlay() increments the instanceCount\r\n            s._iO.autoPlay = true;\r\n            s.load(s._iO);\r\n\r\n          } else if (s.isHTML5) {\r\n\r\n            // iOS needs this when recycling sounds, loading a new URL on an existing object.\r\n            s.load(s._iO);\r\n\r\n          } else {\r\n\r\n            sm2._wD(fN + 'Unsupported type. Exiting.');\r\n\r\n            return s;\r\n\r\n          }\r\n\r\n          // HTML5 hack - re-set instanceOptions?\r\n          s.instanceOptions = s._iO;\r\n\r\n        } else if (s.readyState === 2) {\r\n\r\n          sm2._wD(fN + 'Could not load - exiting', 2);\r\n\r\n          return s;\r\n\r\n        } else {\r\n\r\n          sm2._wD(fN + 'Loading - attempting to play...');\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        // \"play()\"\r\n        sm2._wD(fN.substr(0, fN.lastIndexOf(':')));\r\n\r\n      }\r\n\r\n      if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {\r\n        // flash 9 needs a position reset if play() is called while at the end of a sound.\r\n        sm2._wD(fN + 'Sound at end, resetting to position: 0');\r\n        options.position = 0;\r\n      }\r\n\r\n      /**\r\n       * Streams will pause when their buffer is full if they are being loaded.\r\n       * In this case paused is true, but the song hasn't started playing yet.\r\n       * If we just call resume() the onplay() callback will never be called.\r\n       * So only call resume() if the position is > 0.\r\n       * Another reason is because options like volume won't have been applied yet.\r\n       * For normal sounds, just resume.\r\n       */\r\n\r\n      if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {\r\n\r\n        // https://gist.github.com/37b17df75cc4d7a90bf6\r\n        sm2._wD(fN + 'Resuming from paused state', 1);\r\n        s.resume();\r\n\r\n      } else {\r\n\r\n        s._iO = mixin(options, s._iO);\r\n\r\n        /**\r\n         * Preload in the event of play() with position under Flash,\r\n         * or from/to parameters and non-RTMP case\r\n         */\r\n        if (((!s.isHTML5 && s._iO.position !== null && s._iO.position > 0) || (s._iO.from !== null && s._iO.from > 0) || s._iO.to !== null) && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {\r\n\r\n          onready = function() {\r\n            // sound \"canplay\" or onload()\r\n            // re-apply position/from/to to instance options, and start playback\r\n            s._iO = mixin(options, s._iO);\r\n            s.play(s._iO);\r\n          };\r\n\r\n          // HTML5 needs to at least have \"canplay\" fired before seeking.\r\n          if (s.isHTML5 && !s._html5_canplay) {\r\n\r\n            // this hasn't been loaded yet. load it first, and then do this again.\r\n            sm2._wD(fN + 'Beginning load for non-zero offset case');\r\n\r\n            s.load({\r\n              // note: custom HTML5-only event added for from/to implementation.\r\n              _oncanplay: onready\r\n            });\r\n\r\n          } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {\r\n\r\n            // to be safe, preload the whole thing in Flash.\r\n\r\n            sm2._wD(fN + 'Preloading for non-zero offset case');\r\n\r\n            s.load({\r\n              onload: onready\r\n            });\r\n\r\n          }\r\n\r\n          // otherwise, we're ready to go. re-apply local options, and continue\r\n\r\n          s._iO = applyFromTo();\r\n\r\n        }\r\n\r\n        // sm2._wD(fN + 'Starting to play');\r\n\r\n        // increment instance counter, where enabled + supported\r\n        if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {\r\n          s.instanceCount++;\r\n        }\r\n\r\n        // if first play and onposition parameters exist, apply them now\r\n        if (s._iO.onposition && s.playState === 0) {\r\n          attachOnPosition(s);\r\n        }\r\n\r\n        s.playState = 1;\r\n        s.paused = false;\r\n\r\n        s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);\r\n\r\n        if (!s.isHTML5) {\r\n          s._iO = policyFix(loopFix(s._iO));\r\n        }\r\n\r\n        if (s._iO.onplay && _updatePlayState) {\r\n          s._iO.onplay.apply(s);\r\n          onplay_called = true;\r\n        }\r\n\r\n        s.setVolume(s._iO.volume, true);\r\n        s.setPan(s._iO.pan, true);\r\n\r\n        if (s._iO.playbackRate !== 1) {\r\n          s.setPlaybackRate(s._iO.playbackRate);\r\n        }\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);\r\n\r\n          if (fV === 9 && !startOK) {\r\n            // edge case: no sound hardware, or 32-channel flash ceiling hit.\r\n            // applies only to Flash 9, non-NetStream/MovieStar sounds.\r\n            // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29\r\n            sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);\r\n            if (s._iO.onplayerror) {\r\n              s._iO.onplayerror.apply(s);\r\n            }\r\n\r\n          }\r\n\r\n        } else if (s.instanceCount < 2) {\r\n\r\n            // HTML5 single-instance case\r\n\r\n            start_html5_timer();\r\n\r\n            a = s._setup_html5();\r\n\r\n            s.setPosition(s._iO.position);\r\n\r\n            a.play();\r\n\r\n          } else {\r\n\r\n            // HTML5 multi-shot case\r\n\r\n            sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');\r\n\r\n            audioClone = new Audio(s._iO.url);\r\n\r\n            onended = function() {\r\n              event.remove(audioClone, 'ended', onended);\r\n              s._onfinish(s);\r\n              // cleanup\r\n              html5Unload(audioClone);\r\n              audioClone = null;\r\n            };\r\n\r\n            oncanplay = function() {\r\n              event.remove(audioClone, 'canplay', oncanplay);\r\n              try {\r\n                audioClone.currentTime = s._iO.position / msecScale;\r\n              } catch(err) {\r\n                complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position / msecScale));\r\n              }\r\n              audioClone.play();\r\n            };\r\n\r\n            event.add(audioClone, 'ended', onended);\r\n\r\n            // apply volume to clones, too\r\n            if (s._iO.volume !== _undefined) {\r\n              audioClone.volume = Math.max(0, Math.min(1, s._iO.volume / 100));\r\n            }\r\n\r\n            // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.\r\n            if (s.muted) {\r\n              audioClone.muted = true;\r\n            }\r\n\r\n            if (s._iO.position) {\r\n              // HTML5 audio can't seek before onplay() event has fired.\r\n              // wait for canplay, then seek to position and start playback.\r\n              event.add(audioClone, 'canplay', oncanplay);\r\n            } else {\r\n              // begin playback at currentTime: 0\r\n              audioClone.play();\r\n            }\r\n\r\n          }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    // just for convenience\r\n    this.start = this.play;\r\n\r\n    /**\r\n     * Stops playing a sound (and optionally, all sounds)\r\n     *\r\n     * @param {boolean} bAll Optional: Whether to stop all sounds\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.stop = function(bAll) {\r\n\r\n      var instanceOptions = s._iO,\r\n          originalPosition;\r\n\r\n      if (s.playState === 1) {\r\n\r\n        sm2._wD(s.id + ': stop()');\r\n\r\n        s._onbufferchange(0);\r\n        s._resetOnPosition(0);\r\n        s.paused = false;\r\n\r\n        if (!s.isHTML5) {\r\n          s.playState = 0;\r\n        }\r\n\r\n        // remove onPosition listeners, if any\r\n        detachOnPosition();\r\n\r\n        // and \"to\" position, if set\r\n        if (instanceOptions.to) {\r\n          s.clearOnPosition(instanceOptions.to);\r\n        }\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          flash._stop(s.id, bAll);\r\n\r\n          // hack for netStream: just unload\r\n          if (instanceOptions.serverURL) {\r\n            s.unload();\r\n          }\r\n\r\n        } else if (s._a) {\r\n\r\n            originalPosition = s.position;\r\n\r\n            // act like Flash, though\r\n            s.setPosition(0);\r\n\r\n            // hack: reflect old position for onstop() (also like Flash)\r\n            s.position = originalPosition;\r\n\r\n            // html5 has no stop()\r\n            // NOTE: pausing means iOS requires interaction to resume.\r\n            s._a.pause();\r\n\r\n            s.playState = 0;\r\n\r\n            // and update UI\r\n            s._onTimer();\r\n\r\n            stop_html5_timer();\r\n\r\n          }\r\n\r\n        s.instanceCount = 0;\r\n        s._iO = {};\r\n\r\n        if (instanceOptions.onstop) {\r\n          instanceOptions.onstop.apply(s);\r\n        }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Undocumented/internal: Sets autoPlay for RTMP.\r\n     *\r\n     * @param {boolean} autoPlay state\r\n     */\r\n\r\n    this.setAutoPlay = function(autoPlay) {\r\n\r\n      sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));\r\n      s._iO.autoPlay = autoPlay;\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setAutoPlay(s.id, autoPlay);\r\n        if (autoPlay) {\r\n          // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)\r\n          if (!s.instanceCount && s.readyState === 1) {\r\n            s.instanceCount++;\r\n            sm2._wD(s.id + ': Incremented instance count to ' + s.instanceCount);\r\n          }\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Undocumented/internal: Returns the autoPlay boolean.\r\n     *\r\n     * @return {boolean} The current autoPlay value\r\n     */\r\n\r\n    this.getAutoPlay = function() {\r\n\r\n      return s._iO.autoPlay;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the playback rate of a sound (HTML5-only.)\r\n     *\r\n     * @param {number} playbackRate (+/-)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPlaybackRate = function(playbackRate) {\r\n\r\n      // Per Mozilla, limit acceptable values to prevent playback from stopping (unless allowOverride is truthy.)\r\n      // https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained\r\n      var normalizedRate = Math.max(0.5, Math.min(4, playbackRate));\r\n\r\n      // <d>\r\n      if (normalizedRate !== playbackRate) {\r\n        sm2._wD(s.id + ': setPlaybackRate(' + playbackRate + '): limiting rate to ' + normalizedRate, 2);\r\n      }\r\n      // </d>\r\n\r\n      if (s.isHTML5) {\r\n        try {\r\n          s._iO.playbackRate = normalizedRate;\r\n          s._a.playbackRate = normalizedRate;\r\n        } catch(e) {\r\n          sm2._wD(s.id + ': setPlaybackRate(' + normalizedRate + ') failed: ' + e.message, 2);\r\n        }\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the position of a sound.\r\n     *\r\n     * @param {number} nMsecOffset Position (milliseconds)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPosition = function(nMsecOffset) {\r\n\r\n      if (nMsecOffset === _undefined) {\r\n        nMsecOffset = 0;\r\n      }\r\n\r\n      var position, position1K,\r\n          // Use the duration from the instance options, if we don't have a track duration yet.\r\n          // position >= 0 and <= current available (loaded) duration\r\n          offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));\r\n\r\n      s.position = offset;\r\n      position1K = s.position / msecScale;\r\n      s._resetOnPosition(s.position);\r\n      s._iO.position = offset;\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        position = (fV === 9 ? s.position : position1K);\r\n\r\n        if (s.readyState && s.readyState !== 2) {\r\n          // if paused or not playing, will not resume (by playing)\r\n          flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);\r\n        }\r\n\r\n      } else if (s._a) {\r\n\r\n        // Set the position in the canplay handler if the sound is not ready yet\r\n        if (s._html5_canplay) {\r\n\r\n          if (s._a.currentTime.toFixed(3) !== position1K.toFixed(3)) {\r\n\r\n            /**\r\n             * DOM/JS errors/exceptions to watch out for:\r\n             * if seek is beyond (loaded?) position, \"DOM exception 11\"\r\n             * \"INDEX_SIZE_ERR\": DOM exception 1\r\n             */\r\n            sm2._wD(s.id + ': setPosition(' + position1K + ')');\r\n\r\n            try {\r\n              s._a.currentTime = position1K;\r\n              if (s.playState === 0 || s.paused) {\r\n                // allow seek without auto-play/resume\r\n                s._a.pause();\r\n              }\r\n            } catch(e) {\r\n              sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);\r\n            }\r\n\r\n          }\r\n\r\n        } else if (position1K) {\r\n\r\n          // warn on non-zero seek attempts\r\n          sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);\r\n          return s;\r\n\r\n        }\r\n\r\n        if (s.paused) {\r\n\r\n          // if paused, refresh UI right away by forcing update\r\n          s._onTimer(true);\r\n\r\n        }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Pauses sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.pause = function(_bCallFlash) {\r\n\r\n      if (s.paused || (s.playState === 0 && s.readyState !== 1)) return s;\r\n\r\n      sm2._wD(s.id + ': pause()');\r\n      s.paused = true;\r\n\r\n      if (!s.isHTML5) {\r\n        if (_bCallFlash || _bCallFlash === _undefined) {\r\n          flash._pause(s.id, s._iO.multiShot);\r\n        }\r\n      } else {\r\n        s._setup_html5().pause();\r\n        stop_html5_timer();\r\n      }\r\n\r\n      if (s._iO.onpause) {\r\n        s._iO.onpause.apply(s);\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Resumes sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    /**\r\n     * When auto-loaded streams pause on buffer full they have a playState of 0.\r\n     * We need to make sure that the playState is set to 1 when these streams \"resume\".\r\n     * When a paused stream is resumed, we need to trigger the onplay() callback if it\r\n     * hasn't been called already. In this case since the sound is being played for the\r\n     * first time, I think it's more appropriate to call onplay() rather than onresume().\r\n     */\r\n\r\n    this.resume = function() {\r\n\r\n      var instanceOptions = s._iO;\r\n\r\n      if (!s.paused) return s;\r\n\r\n      sm2._wD(s.id + ': resume()');\r\n      s.paused = false;\r\n      s.playState = 1;\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {\r\n          // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.\r\n          s.setPosition(s.position);\r\n        }\r\n\r\n        // flash method is toggle-based (pause/resume)\r\n        flash._pause(s.id, instanceOptions.multiShot);\r\n\r\n      } else {\r\n\r\n        s._setup_html5().play();\r\n        start_html5_timer();\r\n\r\n      }\r\n\r\n      if (!onplay_called && instanceOptions.onplay) {\r\n\r\n        instanceOptions.onplay.apply(s);\r\n        onplay_called = true;\r\n\r\n      } else if (instanceOptions.onresume) {\r\n\r\n        instanceOptions.onresume.apply(s);\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Toggles sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.togglePause = function() {\r\n\r\n      sm2._wD(s.id + ': togglePause()');\r\n\r\n      if (s.playState === 0) {\r\n        s.play({\r\n          position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)\r\n        });\r\n        return s;\r\n      }\r\n\r\n      if (s.paused) {\r\n        s.resume();\r\n      } else {\r\n        s.pause();\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the panning (L-R) effect.\r\n     *\r\n     * @param {number} nPan The pan value (-100 to 100)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPan = function(nPan, bInstanceOnly) {\r\n\r\n      if (nPan === _undefined) {\r\n        nPan = 0;\r\n      }\r\n\r\n      if (bInstanceOnly === _undefined) {\r\n        bInstanceOnly = false;\r\n      }\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setPan(s.id, nPan);\r\n      } // else { no HTML5 pan? }\r\n\r\n      s._iO.pan = nPan;\r\n\r\n      if (!bInstanceOnly) {\r\n        s.pan = nPan;\r\n        s.options.pan = nPan;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the volume.\r\n     *\r\n     * @param {number} nVol The volume value (0 to 100)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setVolume = function(nVol, _bInstanceOnly) {\r\n\r\n      /**\r\n       * Note: Setting volume has no effect on iOS \"special snowflake\" devices.\r\n       * Hardware volume control overrides software, and volume\r\n       * will always return 1 per Apple docs. (iOS 4 + 5.)\r\n       * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html\r\n       */\r\n\r\n      if (nVol === _undefined) {\r\n        nVol = 100;\r\n      }\r\n\r\n      if (_bInstanceOnly === _undefined) {\r\n        _bInstanceOnly = false;\r\n      }\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted ? 0 : nVol);\r\n\r\n      } else if (s._a) {\r\n\r\n        if (sm2.muted && !s.muted) {\r\n          s.muted = true;\r\n          s._a.muted = true;\r\n        }\r\n\r\n        // valid range for native HTML5 Audio(): 0-1\r\n        s._a.volume = Math.max(0, Math.min(1, nVol / 100));\r\n\r\n      }\r\n\r\n      s._iO.volume = nVol;\r\n\r\n      if (!_bInstanceOnly) {\r\n        s.volume = nVol;\r\n        s.options.volume = nVol;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Mutes the sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.mute = function() {\r\n\r\n      s.muted = true;\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setVolume(s.id, 0);\r\n      } else if (s._a) {\r\n        s._a.muted = true;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unmutes the sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.unmute = function() {\r\n\r\n      s.muted = false;\r\n      var hasIO = (s._iO.volume !== _undefined);\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setVolume(s.id, hasIO ? s._iO.volume : s.options.volume);\r\n      } else if (s._a) {\r\n        s._a.muted = false;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Toggles the muted state of a sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.toggleMute = function() {\r\n\r\n      return (s.muted ? s.unmute() : s.mute());\r\n\r\n    };\r\n\r\n    /**\r\n     * Registers a callback to be fired when a sound reaches a given position during playback.\r\n     *\r\n     * @param {number} nPosition The position to watch for\r\n     * @param {function} oMethod The relevant callback to fire\r\n     * @param {object} oScope Optional: The scope to apply the callback to\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.onPosition = function(nPosition, oMethod, oScope) {\r\n\r\n      // TODO: basic dupe checking?\r\n\r\n      onPositionItems.push({\r\n        position: parseInt(nPosition, 10),\r\n        method: oMethod,\r\n        scope: (oScope !== _undefined ? oScope : s),\r\n        fired: false\r\n      });\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    // legacy/backwards-compability: lower-case method name\r\n    this.onposition = this.onPosition;\r\n\r\n    /**\r\n     * Removes registered callback(s) from a sound, by position and/or callback.\r\n     *\r\n     * @param {number} nPosition The position to clear callback(s) for\r\n     * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.clearOnPosition = function(nPosition, oMethod) {\r\n\r\n      var i;\r\n\r\n      nPosition = parseInt(nPosition, 10);\r\n\r\n      if (isNaN(nPosition)) {\r\n        // safety check\r\n        return;\r\n      }\r\n\r\n      for (i = 0; i < onPositionItems.length; i++) {\r\n\r\n        if (nPosition === onPositionItems[i].position) {\r\n          // remove this item if no method was specified, or, if the method matches\r\n\r\n          if (!oMethod || (oMethod === onPositionItems[i].method)) {\r\n\r\n            if (onPositionItems[i].fired) {\r\n              // decrement \"fired\" counter, too\r\n              onPositionFired--;\r\n            }\r\n\r\n            onPositionItems.splice(i, 1);\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._processOnPosition = function() {\r\n\r\n      var i, item, j = onPositionItems.length;\r\n\r\n      if (!j || !s.playState || onPositionFired >= j) return false;\r\n\r\n      for (i = j - 1; i >= 0; i--) {\r\n\r\n        item = onPositionItems[i];\r\n\r\n        if (!item.fired && s.position >= item.position) {\r\n\r\n          item.fired = true;\r\n          onPositionFired++;\r\n          item.method.apply(item.scope, [item.position]);\r\n\r\n          //  reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.\r\n          j = onPositionItems.length;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._resetOnPosition = function(nPosition) {\r\n\r\n      // reset \"fired\" for items interested in this position\r\n      var i, item, j = onPositionItems.length;\r\n\r\n      if (!j) return false;\r\n\r\n      for (i = j - 1; i >= 0; i--) {\r\n\r\n        item = onPositionItems[i];\r\n\r\n        if (item.fired && nPosition <= item.position) {\r\n          item.fired = false;\r\n          onPositionFired--;\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * SMSound() private internals\r\n     * --------------------------------\r\n     */\r\n\r\n    applyFromTo = function() {\r\n\r\n      var instanceOptions = s._iO,\r\n          f = instanceOptions.from,\r\n          t = instanceOptions.to,\r\n          start, end;\r\n\r\n      end = function() {\r\n\r\n        // end has been reached.\r\n        sm2._wD(s.id + ': \"To\" time of ' + t + ' reached.');\r\n\r\n        // detach listener\r\n        s.clearOnPosition(t, end);\r\n\r\n        // stop should clear this, too\r\n        s.stop();\r\n\r\n      };\r\n\r\n      start = function() {\r\n\r\n        sm2._wD(s.id + ': Playing \"from\" ' + f);\r\n\r\n        // add listener for end\r\n        if (t !== null && !isNaN(t)) {\r\n          s.onPosition(t, end);\r\n        }\r\n\r\n      };\r\n\r\n      if (f !== null && !isNaN(f)) {\r\n\r\n        // apply to instance options, guaranteeing correct start position.\r\n        instanceOptions.position = f;\r\n\r\n        // multiShot timing can't be tracked, so prevent that.\r\n        instanceOptions.multiShot = false;\r\n\r\n        start();\r\n\r\n      }\r\n\r\n      // return updated instanceOptions including starting position\r\n      return instanceOptions;\r\n\r\n    };\r\n\r\n    attachOnPosition = function() {\r\n\r\n      var item,\r\n          op = s._iO.onposition;\r\n\r\n      // attach onposition things, if any, now.\r\n\r\n      if (op) {\r\n\r\n        for (item in op) {\r\n          if (op.hasOwnProperty(item)) {\r\n            s.onPosition(parseInt(item, 10), op[item]);\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    detachOnPosition = function() {\r\n\r\n      var item,\r\n          op = s._iO.onposition;\r\n\r\n      // detach any onposition()-style listeners.\r\n\r\n      if (op) {\r\n\r\n        for (item in op) {\r\n          if (op.hasOwnProperty(item)) {\r\n            s.clearOnPosition(parseInt(item, 10));\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    start_html5_timer = function() {\r\n\r\n      if (s.isHTML5) {\r\n        startTimer(s);\r\n      }\r\n\r\n    };\r\n\r\n    stop_html5_timer = function() {\r\n\r\n      if (s.isHTML5) {\r\n        stopTimer(s);\r\n      }\r\n\r\n    };\r\n\r\n    resetProperties = function(retainPosition) {\r\n\r\n      if (!retainPosition) {\r\n        onPositionItems = [];\r\n        onPositionFired = 0;\r\n      }\r\n\r\n      onplay_called = false;\r\n\r\n      s._hasTimer = null;\r\n      s._a = null;\r\n      s._html5_canplay = false;\r\n      s.bytesLoaded = null;\r\n      s.bytesTotal = null;\r\n      s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);\r\n      s.durationEstimate = null;\r\n      s.buffered = [];\r\n\r\n      // legacy: 1D array\r\n      s.eqData = [];\r\n\r\n      s.eqData.left = [];\r\n      s.eqData.right = [];\r\n\r\n      s.failures = 0;\r\n      s.isBuffering = false;\r\n      s.instanceOptions = {};\r\n      s.instanceCount = 0;\r\n      s.loaded = false;\r\n      s.metadata = {};\r\n\r\n      // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r\n      s.readyState = 0;\r\n\r\n      s.muted = false;\r\n      s.paused = false;\r\n\r\n      s.peakData = {\r\n        left: 0,\r\n        right: 0\r\n      };\r\n\r\n      s.waveformData = {\r\n        left: [],\r\n        right: []\r\n      };\r\n\r\n      s.playState = 0;\r\n      s.position = null;\r\n\r\n      s.id3 = {};\r\n\r\n    };\r\n\r\n    resetProperties();\r\n\r\n    /**\r\n     * Pseudo-private SMSound internals\r\n     * --------------------------------\r\n     */\r\n\r\n    this._onTimer = function(bForce) {\r\n\r\n      /**\r\n       * HTML5-only _whileplaying() etc.\r\n       * called from both HTML5 native events, and polling/interval-based timers\r\n       * mimics flash and fires only when time/duration change, so as to be polling-friendly\r\n       */\r\n\r\n      var duration, isNew = false, time, x = {};\r\n\r\n      if (s._hasTimer || bForce) {\r\n\r\n        // TODO: May not need to track readyState (1 = loading)\r\n\r\n        if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {\r\n\r\n          duration = s._get_html5_duration();\r\n\r\n          if (duration !== lastHTML5State.duration) {\r\n\r\n            lastHTML5State.duration = duration;\r\n            s.duration = duration;\r\n            isNew = true;\r\n\r\n          }\r\n\r\n          // TODO: investigate why this goes wack if not set/re-set each time.\r\n          s.durationEstimate = s.duration;\r\n\r\n          time = (s._a.currentTime * msecScale || 0);\r\n\r\n          if (time !== lastHTML5State.time) {\r\n\r\n            lastHTML5State.time = time;\r\n            isNew = true;\r\n\r\n          }\r\n\r\n          if (isNew || bForce) {\r\n\r\n            s._whileplaying(time, x, x, x, x);\r\n\r\n          }\r\n\r\n        }/* else {\r\n\r\n          // sm2._wD('_onTimer: Warn for \"'+s.id+'\": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));\r\n\r\n          return false;\r\n\r\n        }*/\r\n\r\n      }\r\n\r\n      return isNew;\r\n\r\n    };\r\n\r\n    this._get_html5_duration = function() {\r\n\r\n      var instanceOptions = s._iO,\r\n          // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null\r\n          d = (s._a && s._a.duration ? s._a.duration * msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),\r\n          result = (d && !isNaN(d) && d !== Infinity ? d : null);\r\n\r\n      return result;\r\n\r\n    };\r\n\r\n    this._apply_loop = function(a, nLoops) {\r\n\r\n      /**\r\n       * boolean instead of \"loop\", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop\r\n       * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.\r\n       */\r\n\r\n      // <d>\r\n      if (!a.loop && nLoops > 1) {\r\n        sm2._wD('Note: Native HTML5 looping is infinite.', 1);\r\n      }\r\n      // </d>\r\n\r\n      a.loop = (nLoops > 1 ? 'loop' : '');\r\n\r\n    };\r\n\r\n    this._setup_html5 = function(options) {\r\n\r\n      var instanceOptions = mixin(s._iO, options),\r\n          a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,\r\n          dURL = decodeURI(instanceOptions.url),\r\n          sameURL;\r\n\r\n      /**\r\n       * \"First things first, I, Poppa...\" (reset the previous state of the old sound, if playing)\r\n       * Fixes case with devices that can only play one sound at a time\r\n       * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state\r\n       */\r\n\r\n      if (useGlobalHTML5Audio) {\r\n\r\n        if (dURL === decodeURI(lastGlobalHTML5URL)) {\r\n          // global HTML5 audio: re-use of URL\r\n          sameURL = true;\r\n        }\r\n\r\n      } else if (dURL === decodeURI(lastURL)) {\r\n\r\n        // options URL is the same as the \"last\" URL, and we used (loaded) it\r\n        sameURL = true;\r\n\r\n      }\r\n\r\n      if (a) {\r\n\r\n        if (a._s) {\r\n\r\n          if (useGlobalHTML5Audio) {\r\n\r\n            if (a._s && a._s.playState && !sameURL) {\r\n\r\n              // global HTML5 audio case, and loading a new URL. stop the currently-playing one.\r\n              a._s.stop();\r\n\r\n            }\r\n\r\n          } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {\r\n\r\n            // non-global HTML5 reuse case: same url, ignore request\r\n            s._apply_loop(a, instanceOptions.loops);\r\n\r\n            return a;\r\n\r\n          }\r\n\r\n        }\r\n\r\n        if (!sameURL) {\r\n\r\n          // don't retain onPosition() stuff with new URLs.\r\n\r\n          if (lastURL) {\r\n            resetProperties(false);\r\n          }\r\n\r\n          // assign new HTML5 URL\r\n\r\n          a.src = instanceOptions.url;\r\n\r\n          s.url = instanceOptions.url;\r\n\r\n          lastURL = instanceOptions.url;\r\n\r\n          lastGlobalHTML5URL = instanceOptions.url;\r\n\r\n          a._called_load = false;\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n          s._a = new Audio(instanceOptions.url);\r\n          s._a.load();\r\n\r\n        } else {\r\n\r\n          // null for stupid Opera 9.64 case\r\n          s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());\r\n\r\n        }\r\n\r\n        // assign local reference\r\n        a = s._a;\r\n\r\n        a._called_load = false;\r\n\r\n        if (useGlobalHTML5Audio) {\r\n\r\n          globalHTML5Audio = a;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      s.isHTML5 = true;\r\n\r\n      // store a ref on the track\r\n      s._a = a;\r\n\r\n      // store a ref on the audio\r\n      a._s = s;\r\n\r\n      add_html5_events();\r\n\r\n      s._apply_loop(a, instanceOptions.loops);\r\n\r\n      if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n        s.load();\r\n\r\n      } else {\r\n\r\n        // early HTML5 implementation (non-standard)\r\n        a.autobuffer = false;\r\n\r\n        // standard ('none' is also an option.)\r\n        a.preload = 'auto';\r\n\r\n      }\r\n\r\n      return a;\r\n\r\n    };\r\n\r\n    add_html5_events = function() {\r\n\r\n      if (s._a._added_events) return false;\r\n\r\n      var f;\r\n\r\n      function add(oEvt, oFn, bCapture) {\r\n        return s._a ? s._a.addEventListener(oEvt, oFn, bCapture || false) : null;\r\n      }\r\n\r\n      s._a._added_events = true;\r\n\r\n      for (f in html5_events) {\r\n        if (html5_events.hasOwnProperty(f)) {\r\n          add(f, html5_events[f]);\r\n        }\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    remove_html5_events = function() {\r\n\r\n      // Remove event listeners\r\n\r\n      var f;\r\n\r\n      function remove(oEvt, oFn, bCapture) {\r\n        return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture || false) : null);\r\n      }\r\n\r\n      sm2._wD(s.id + ': Removing event listeners');\r\n      s._a._added_events = false;\r\n\r\n      for (f in html5_events) {\r\n        if (html5_events.hasOwnProperty(f)) {\r\n          remove(f, html5_events[f]);\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Pseudo-private event internals\r\n     * ------------------------------\r\n     */\r\n\r\n    this._onload = function(nSuccess) {\r\n\r\n      var fN,\r\n          // check for duration to prevent false positives from flash 8 when loading from cache.\r\n          loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);\r\n\r\n      // <d>\r\n      fN = s.id + ': ';\r\n      sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));\r\n\r\n      if (!loadOK && !s.isHTML5) {\r\n        if (sm2.sandbox.noRemote === true) {\r\n          sm2._wD(fN + str('noNet'), 1);\r\n        }\r\n        if (sm2.sandbox.noLocal === true) {\r\n          sm2._wD(fN + str('noLocal'), 1);\r\n        }\r\n      }\r\n      // </d>\r\n\r\n      s.loaded = loadOK;\r\n      s.readyState = (loadOK ? 3 : 2);\r\n      s._onbufferchange(0);\r\n\r\n      if (!loadOK && !s.isHTML5) {\r\n        // note: no error code from Flash.\r\n        s._onerror();\r\n      }\r\n\r\n      if (s._iO.onload) {\r\n        wrapCallback(s, function() {\r\n          s._iO.onload.apply(s, [loadOK]);\r\n        });\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._onerror = function(errorCode, description) {\r\n\r\n      // https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n      if (s._iO.onerror) {\r\n        wrapCallback(s, function() {\r\n          s._iO.onerror.apply(s, [errorCode, description]);\r\n        });\r\n      }\r\n\r\n    };\r\n\r\n    this._onbufferchange = function(nIsBuffering) {\r\n\r\n      // ignore if not playing\r\n      if (s.playState === 0) return false;\r\n\r\n      if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) return false;\r\n\r\n      s.isBuffering = (nIsBuffering === 1);\r\n\r\n      if (s._iO.onbufferchange) {\r\n        sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);\r\n        s._iO.onbufferchange.apply(s, [nIsBuffering]);\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * Playback may have stopped due to buffering, or related reason.\r\n     * This state can be encountered on iOS < 6 when auto-play is blocked.\r\n     */\r\n\r\n    this._onsuspend = function() {\r\n\r\n      if (s._iO.onsuspend) {\r\n        sm2._wD(s.id + ': Playback suspended');\r\n        s._iO.onsuspend.apply(s);\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * flash 9/movieStar + RTMP-only method, should fire only once at most\r\n     * at this point we just recreate failed sounds rather than trying to reconnect\r\n     */\r\n\r\n    this._onfailure = function(msg, level, code) {\r\n\r\n      s.failures++;\r\n      sm2._wD(s.id + ': Failure (' + s.failures + '): ' + msg);\r\n\r\n      if (s._iO.onfailure && s.failures === 1) {\r\n        s._iO.onfailure(msg, level, code);\r\n      } else {\r\n        sm2._wD(s.id + ': Ignoring failure');\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * flash 9/movieStar + RTMP-only method for unhandled warnings/exceptions from Flash\r\n     * e.g., RTMP \"method missing\" warning (non-fatal) for getStreamLength on server\r\n     */\r\n\r\n    this._onwarning = function(msg, level, code) {\r\n\r\n      if (s._iO.onwarning) {\r\n        s._iO.onwarning(msg, level, code);\r\n      }\r\n\r\n    };\r\n\r\n    this._onfinish = function() {\r\n\r\n      // store local copy before it gets trashed...\r\n      var io_onfinish = s._iO.onfinish;\r\n\r\n      s._onbufferchange(0);\r\n      s._resetOnPosition(0);\r\n\r\n      // reset some state items\r\n      if (s.instanceCount) {\r\n\r\n        s.instanceCount--;\r\n\r\n        if (!s.instanceCount) {\r\n\r\n          // remove onPosition listeners, if any\r\n          detachOnPosition();\r\n\r\n          // reset instance options\r\n          s.playState = 0;\r\n          s.paused = false;\r\n          s.instanceCount = 0;\r\n          s.instanceOptions = {};\r\n          s._iO = {};\r\n          stop_html5_timer();\r\n\r\n          // reset position, too\r\n          if (s.isHTML5) {\r\n            s.position = 0;\r\n          }\r\n\r\n        }\r\n\r\n        if (!s.instanceCount || s._iO.multiShotEvents) {\r\n          // fire onfinish for last, or every instance\r\n          if (io_onfinish) {\r\n            sm2._wD(s.id + ': onfinish()');\r\n            wrapCallback(s, function() {\r\n              io_onfinish.apply(s);\r\n            });\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {\r\n\r\n      var instanceOptions = s._iO;\r\n\r\n      s.bytesLoaded = nBytesLoaded;\r\n      s.bytesTotal = nBytesTotal;\r\n      s.duration = Math.floor(nDuration);\r\n      s.bufferLength = nBufferLength;\r\n\r\n      if (!s.isHTML5 && !instanceOptions.isMovieStar) {\r\n\r\n        if (instanceOptions.duration) {\r\n          // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.\r\n          s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;\r\n        } else {\r\n          s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);\r\n        }\r\n\r\n      } else {\r\n\r\n        s.durationEstimate = s.duration;\r\n\r\n      }\r\n\r\n      // for flash, reflect sequential-load-style buffering\r\n      if (!s.isHTML5) {\r\n        s.buffered = [{\r\n          start: 0,\r\n          end: s.duration\r\n        }];\r\n      }\r\n\r\n      // allow whileloading to fire even if \"load\" fired under HTML5, due to HTTP range/partials\r\n      if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {\r\n        instanceOptions.whileloading.apply(s);\r\n      }\r\n\r\n    };\r\n\r\n    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {\r\n\r\n      var instanceOptions = s._iO,\r\n          eqLeft;\r\n\r\n      // flash safety net\r\n      if (isNaN(nPosition) || nPosition === null) return false;\r\n\r\n      // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.\r\n      s.position = Math.max(0, nPosition);\r\n\r\n      s._processOnPosition();\r\n\r\n      if (!s.isHTML5 && fV > 8) {\r\n\r\n        if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {\r\n          s.peakData = {\r\n            left: oPeakData.leftPeak,\r\n            right: oPeakData.rightPeak\r\n          };\r\n        }\r\n\r\n        if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {\r\n          s.waveformData = {\r\n            left: oWaveformDataLeft.split(','),\r\n            right: oWaveformDataRight.split(',')\r\n          };\r\n        }\r\n\r\n        if (instanceOptions.useEQData) {\r\n          if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {\r\n            eqLeft = oEQData.leftEQ.split(',');\r\n            s.eqData = eqLeft;\r\n            s.eqData.left = eqLeft;\r\n            if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {\r\n              s.eqData.right = oEQData.rightEQ.split(',');\r\n            }\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n      if (s.playState === 1) {\r\n\r\n        // special case/hack: ensure buffering is false if loading from cache (and not yet started)\r\n        if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {\r\n          s._onbufferchange(0);\r\n        }\r\n\r\n        if (instanceOptions.whileplaying) {\r\n          // flash may call after actual finish\r\n          instanceOptions.whileplaying.apply(s);\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._oncaptiondata = function(oData) {\r\n\r\n      /**\r\n       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n       *\r\n       * @param {object} oData\r\n       */\r\n\r\n      sm2._wD(s.id + ': Caption data received.');\r\n\r\n      s.captiondata = oData;\r\n\r\n      if (s._iO.oncaptiondata) {\r\n        s._iO.oncaptiondata.apply(s, [oData]);\r\n      }\r\n\r\n    };\r\n\r\n    this._onmetadata = function(oMDProps, oMDData) {\r\n\r\n      /**\r\n       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n       * RTMP may include song title, MovieStar content may include encoding info\r\n       *\r\n       * @param {array} oMDProps (names)\r\n       * @param {array} oMDData (values)\r\n       */\r\n\r\n      sm2._wD(s.id + ': Metadata received.');\r\n\r\n      var oData = {}, i, j;\r\n\r\n      for (i = 0, j = oMDProps.length; i < j; i++) {\r\n        oData[oMDProps[i]] = oMDData[i];\r\n      }\r\n\r\n      s.metadata = oData;\r\n\r\n      if (s._iO.onmetadata) {\r\n        s._iO.onmetadata.call(s, s.metadata);\r\n      }\r\n\r\n    };\r\n\r\n    this._onid3 = function(oID3Props, oID3Data) {\r\n\r\n      /**\r\n       * internal: flash 8 + flash 9 ID3 feature\r\n       * may include artist, song title etc.\r\n       *\r\n       * @param {array} oID3Props (names)\r\n       * @param {array} oID3Data (values)\r\n       */\r\n\r\n      sm2._wD(s.id + ': ID3 data received.');\r\n\r\n      var oData = [], i, j;\r\n\r\n      for (i = 0, j = oID3Props.length; i < j; i++) {\r\n        oData[oID3Props[i]] = oID3Data[i];\r\n      }\r\n\r\n      s.id3 = mixin(s.id3, oData);\r\n\r\n      if (s._iO.onid3) {\r\n        s._iO.onid3.apply(s);\r\n      }\r\n\r\n    };\r\n\r\n    // flash/RTMP-only\r\n\r\n    this._onconnect = function(bSuccess) {\r\n\r\n      bSuccess = (bSuccess === 1);\r\n      sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));\r\n      s.connected = bSuccess;\r\n\r\n      if (bSuccess) {\r\n\r\n        s.failures = 0;\r\n\r\n        if (idCheck(s.id)) {\r\n          if (s.getAutoPlay()) {\r\n            // only update the play state if auto playing\r\n            s.play(_undefined, s.getAutoPlay());\r\n          } else if (s._iO.autoLoad) {\r\n            s.load();\r\n          }\r\n        }\r\n\r\n        if (s._iO.onconnect) {\r\n          s._iO.onconnect.apply(s, [bSuccess]);\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._ondataerror = function(sError) {\r\n\r\n      // flash 9 wave/eq data handler\r\n      // hack: called at start, and end from flash at/after onfinish()\r\n      if (s.playState > 0) {\r\n        sm2._wD(s.id + ': Data error: ' + sError);\r\n        if (s._iO.ondataerror) {\r\n          s._iO.ondataerror.apply(s);\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    // <d>\r\n    this._debug();\r\n    // </d>\r\n\r\n  }; // SMSound()\r\n\r\n  /**\r\n   * Private SoundManager internals\r\n   * ------------------------------\r\n   */\r\n\r\n  getDocument = function() {\r\n\r\n    return (doc.body || doc.getElementsByTagName('div')[0]);\r\n\r\n  };\r\n\r\n  id = function(sID) {\r\n\r\n    return doc.getElementById(sID);\r\n\r\n  };\r\n\r\n  mixin = function(oMain, oAdd) {\r\n\r\n    // non-destructive merge\r\n    var o1 = (oMain || {}), o2, o;\r\n\r\n    // if unspecified, o2 is the default options object\r\n    o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);\r\n\r\n    for (o in o2) {\r\n\r\n      if (o2.hasOwnProperty(o) && o1[o] === _undefined) {\r\n\r\n        if (typeof o2[o] !== 'object' || o2[o] === null) {\r\n\r\n          // assign directly\r\n          o1[o] = o2[o];\r\n\r\n        } else {\r\n\r\n          // recurse through o2\r\n          o1[o] = mixin(o1[o], o2[o]);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return o1;\r\n\r\n  };\r\n\r\n  wrapCallback = function(oSound, callback) {\r\n\r\n    /**\r\n     * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue\r\n     * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).\r\n     * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.\r\n     * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.\r\n     * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player\r\n     */\r\n    if (!oSound.isHTML5 && fV === 8) {\r\n      window.setTimeout(callback, 0);\r\n    } else {\r\n      callback();\r\n    }\r\n\r\n  };\r\n\r\n  // additional soundManager properties that soundManager.setup() will accept\r\n\r\n  extraOptions = {\r\n    onready: 1,\r\n    ontimeout: 1,\r\n    defaultOptions: 1,\r\n    flash9Options: 1,\r\n    movieStarOptions: 1\r\n  };\r\n\r\n  assign = function(o, oParent) {\r\n\r\n    /**\r\n     * recursive assignment of properties, soundManager.setup() helper\r\n     * allows property assignment based on whitelist\r\n     */\r\n\r\n    var i,\r\n        result = true,\r\n        hasParent = (oParent !== _undefined),\r\n        setupOptions = sm2.setupOptions,\r\n        bonusOptions = extraOptions;\r\n\r\n    // <d>\r\n\r\n    // if soundManager.setup() called, show accepted parameters.\r\n\r\n    if (o === _undefined) {\r\n\r\n      result = [];\r\n\r\n      for (i in setupOptions) {\r\n\r\n        if (setupOptions.hasOwnProperty(i)) {\r\n          result.push(i);\r\n        }\r\n\r\n      }\r\n\r\n      for (i in bonusOptions) {\r\n\r\n        if (bonusOptions.hasOwnProperty(i)) {\r\n\r\n          if (typeof sm2[i] === 'object') {\r\n            result.push(i + ': {...}');\r\n          } else if (sm2[i] instanceof Function) {\r\n            result.push(i + ': function() {...}');\r\n          } else {\r\n            result.push(i);\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n      sm2._wD(str('setup', result.join(', ')));\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // </d>\r\n\r\n    for (i in o) {\r\n\r\n      if (o.hasOwnProperty(i)) {\r\n\r\n        // if not an {object} we want to recurse through...\r\n\r\n        if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {\r\n\r\n          // check \"allowed\" options\r\n\r\n          if (hasParent && bonusOptions[oParent] !== _undefined) {\r\n\r\n            // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }\r\n            sm2[oParent][i] = o[i];\r\n\r\n          } else if (setupOptions[i] !== _undefined) {\r\n\r\n            // special case: assign to setupOptions object, which soundManager property references\r\n            sm2.setupOptions[i] = o[i];\r\n\r\n            // assign directly to soundManager, too\r\n            sm2[i] = o[i];\r\n\r\n          } else if (bonusOptions[i] === _undefined) {\r\n\r\n            // invalid or disallowed parameter. complain.\r\n            complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n            result = false;\r\n\r\n          } else if (sm2[i] instanceof Function) {\r\n\r\n            /**\r\n             * valid extraOptions (bonusOptions) parameter.\r\n             * is it a method, like onready/ontimeout? call it.\r\n             * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});\r\n             */\r\n            sm2[i].apply(sm2, (o[i] instanceof Array ? o[i] : [o[i]]));\r\n\r\n          } else {\r\n\r\n            // good old-fashioned direct assignment\r\n            sm2[i] = o[i];\r\n\r\n          }\r\n\r\n        } else if (bonusOptions[i] === _undefined) {\r\n\r\n          // recursion case, eg., { defaultOptions: { ... } }\r\n\r\n          // invalid or disallowed parameter. complain.\r\n          complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n          result = false;\r\n\r\n        } else {\r\n\r\n          // recurse through object\r\n          return assign(o[i], i);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  function preferFlashCheck(kind) {\r\n\r\n    // whether flash should play a given type\r\n    return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));\r\n\r\n  }\r\n\r\n  /**\r\n   * Internal DOM2-level event helpers\r\n   * ---------------------------------\r\n   */\r\n\r\n  event = (function() {\r\n\r\n    // normalize event methods\r\n    var old = (window.attachEvent),\r\n    evt = {\r\n      add: (old ? 'attachEvent' : 'addEventListener'),\r\n      remove: (old ? 'detachEvent' : 'removeEventListener')\r\n    };\r\n\r\n    // normalize \"on\" event prefix, optional capture argument\r\n    function getArgs(oArgs) {\r\n\r\n      var args = slice.call(oArgs),\r\n          len = args.length;\r\n\r\n      if (old) {\r\n        // prefix\r\n        args[1] = 'on' + args[1];\r\n        if (len > 3) {\r\n          // no capture\r\n          args.pop();\r\n        }\r\n      } else if (len === 3) {\r\n        args.push(false);\r\n      }\r\n\r\n      return args;\r\n\r\n    }\r\n\r\n    function apply(args, sType) {\r\n\r\n      // normalize and call the event method, with the proper arguments\r\n      var element = args.shift(),\r\n          method = [evt[sType]];\r\n\r\n      if (old) {\r\n        // old IE can't do apply().\r\n        element[method](args[0], args[1]);\r\n      } else {\r\n        element[method].apply(element, args);\r\n      }\r\n\r\n    }\r\n\r\n    function add() {\r\n      apply(getArgs(arguments), 'add');\r\n    }\r\n\r\n    function remove() {\r\n      apply(getArgs(arguments), 'remove');\r\n    }\r\n\r\n    return {\r\n      add: add,\r\n      remove: remove\r\n    };\r\n\r\n  }());\r\n\r\n  /**\r\n   * Internal HTML5 event handling\r\n   * -----------------------------\r\n   */\r\n\r\n  function html5_event(oFn) {\r\n\r\n    // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds\r\n\r\n    return function(e) {\r\n\r\n      var s = this._s,\r\n          result;\r\n\r\n      if (!s || !s._a) {\r\n        // <d>\r\n        if (s && s.id) {\r\n          sm2._wD(s.id + ': Ignoring ' + e.type);\r\n        } else {\r\n          sm2._wD(h5 + 'Ignoring ' + e.type);\r\n        }\r\n        // </d>\r\n        result = null;\r\n      } else {\r\n        result = oFn.call(this, e);\r\n      }\r\n\r\n      return result;\r\n\r\n    };\r\n\r\n  }\r\n\r\n  html5_events = {\r\n\r\n    // HTML5 event-name-to-handler map\r\n\r\n    abort: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': abort');\r\n\r\n    }),\r\n\r\n    // enough has loaded to play\r\n\r\n    canplay: html5_event(function() {\r\n\r\n      var s = this._s,\r\n          position1K;\r\n\r\n      if (s._html5_canplay) {\r\n        // this event has already fired. ignore.\r\n        return;\r\n      }\r\n\r\n      s._html5_canplay = true;\r\n      sm2._wD(s.id + ': canplay');\r\n      s._onbufferchange(0);\r\n\r\n      // position according to instance options\r\n      position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position / msecScale : null);\r\n\r\n      // set the position if position was provided before the sound loaded\r\n      if (this.currentTime !== position1K) {\r\n        sm2._wD(s.id + ': canplay: Setting position to ' + position1K);\r\n        try {\r\n          this.currentTime = position1K;\r\n        } catch(ee) {\r\n          sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);\r\n        }\r\n      }\r\n\r\n      // hack for HTML5 from/to case\r\n      if (s._iO._oncanplay) {\r\n        s._iO._oncanplay();\r\n      }\r\n\r\n    }),\r\n\r\n    canplaythrough: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      if (!s.loaded) {\r\n        s._onbufferchange(0);\r\n        s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());\r\n        s._onload(true);\r\n      }\r\n\r\n    }),\r\n\r\n    durationchange: html5_event(function() {\r\n\r\n      // durationchange may fire at various times, probably the safest way to capture accurate/final duration.\r\n\r\n      var s = this._s,\r\n          duration;\r\n\r\n      duration = s._get_html5_duration();\r\n\r\n      if (!isNaN(duration) && duration !== s.duration) {\r\n\r\n        sm2._wD(this._s.id + ': durationchange (' + duration + ')' + (s.duration ? ', previously ' + s.duration : ''));\r\n\r\n        s.durationEstimate = s.duration = duration;\r\n\r\n      }\r\n\r\n    }),\r\n\r\n    // TODO: Reserved for potential use\r\n    /*\r\n    emptied: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': emptied');\r\n\r\n    }),\r\n    */\r\n\r\n    ended: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      sm2._wD(s.id + ': ended');\r\n\r\n      s._onfinish();\r\n\r\n    }),\r\n\r\n    error: html5_event(function() {\r\n\r\n      var description = (html5ErrorCodes[this.error.code] || null);\r\n      sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code + (description ? ' (' + description + ')' : ''));\r\n      this._s._onload(false);\r\n      this._s._onerror(this.error.code, description);\r\n\r\n    }),\r\n\r\n    loadeddata: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      sm2._wD(s.id + ': loadeddata');\r\n\r\n      // safari seems to nicely report progress events, eventually totalling 100%\r\n      if (!s._loaded && !isSafari) {\r\n        s.duration = s._get_html5_duration();\r\n      }\r\n\r\n    }),\r\n\r\n    loadedmetadata: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': loadedmetadata');\r\n\r\n    }),\r\n\r\n    loadstart: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': loadstart');\r\n      // assume buffering at first\r\n      this._s._onbufferchange(1);\r\n\r\n    }),\r\n\r\n    play: html5_event(function() {\r\n\r\n      // sm2._wD(this._s.id + ': play()');\r\n      // once play starts, no buffering\r\n      this._s._onbufferchange(0);\r\n\r\n    }),\r\n\r\n    playing: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': playing ' + String.fromCharCode(9835));\r\n      // once play starts, no buffering\r\n      this._s._onbufferchange(0);\r\n\r\n    }),\r\n\r\n    progress: html5_event(function(e) {\r\n\r\n      // note: can fire repeatedly after \"loaded\" event, due to use of HTTP range/partials\r\n\r\n      var s = this._s,\r\n          i, j, progStr, buffered = 0,\r\n          isProgress = (e.type === 'progress'),\r\n          ranges = e.target.buffered,\r\n          // firefox 3.6 implements e.loaded/total (bytes)\r\n          loaded = (e.loaded || 0),\r\n          total = (e.total || 1);\r\n\r\n      // reset the \"buffered\" (loaded byte ranges) array\r\n      s.buffered = [];\r\n\r\n      if (ranges && ranges.length) {\r\n\r\n        // if loaded is 0, try TimeRanges implementation as % of load\r\n        // https://developer.mozilla.org/en/DOM/TimeRanges\r\n\r\n        // re-build \"buffered\" array\r\n        // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.\r\n        for (i = 0, j = ranges.length; i < j; i++) {\r\n          s.buffered.push({\r\n            start: ranges.start(i) * msecScale,\r\n            end: ranges.end(i) * msecScale\r\n          });\r\n        }\r\n\r\n        // use the last value locally\r\n        buffered = (ranges.end(0) - ranges.start(0)) * msecScale;\r\n\r\n        // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges\r\n        loaded = Math.min(1, buffered / (e.target.duration * msecScale));\r\n\r\n        // <d>\r\n        if (isProgress && ranges.length > 1) {\r\n          progStr = [];\r\n          j = ranges.length;\r\n          for (i = 0; i < j; i++) {\r\n            progStr.push((e.target.buffered.start(i) * msecScale) + '-' + (e.target.buffered.end(i) * msecScale));\r\n          }\r\n          sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));\r\n        }\r\n\r\n        if (isProgress && !isNaN(loaded)) {\r\n          sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded * 100) + '% loaded');\r\n        }\r\n        // </d>\r\n\r\n      }\r\n\r\n      if (!isNaN(loaded)) {\r\n\r\n        // TODO: prevent calls with duplicate values.\r\n        s._whileloading(loaded, total, s._get_html5_duration());\r\n        if (loaded && total && loaded === total) {\r\n          // in case \"onload\" doesn't fire (eg. gecko 1.9.2)\r\n          html5_events.canplaythrough.call(this, e);\r\n        }\r\n\r\n      }\r\n\r\n    }),\r\n\r\n    ratechange: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': ratechange');\r\n\r\n    }),\r\n\r\n    suspend: html5_event(function(e) {\r\n\r\n      // download paused/stopped, may have finished (eg. onload)\r\n      var s = this._s;\r\n\r\n      sm2._wD(this._s.id + ': suspend');\r\n      html5_events.progress.call(this, e);\r\n      s._onsuspend();\r\n\r\n    }),\r\n\r\n    stalled: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': stalled');\r\n\r\n    }),\r\n\r\n    timeupdate: html5_event(function() {\r\n\r\n      this._s._onTimer();\r\n\r\n    }),\r\n\r\n    waiting: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      // see also: seeking\r\n      sm2._wD(this._s.id + ': waiting');\r\n\r\n      // playback faster than download rate, etc.\r\n      s._onbufferchange(1);\r\n\r\n    })\r\n\r\n  };\r\n\r\n  html5OK = function(iO) {\r\n\r\n    // playability test based on URL or MIME type\r\n\r\n    var result;\r\n\r\n    if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {\r\n\r\n      // nothing to check\r\n      result = false;\r\n\r\n    } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {\r\n\r\n      // RTMP, or preferring flash\r\n      result = false;\r\n\r\n    } else {\r\n\r\n      // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er\r\n      result = ((iO.type ? html5CanPlay({ type: iO.type }) : html5CanPlay({ url: iO.url }) || sm2.html5Only || iO.url.match(/data:/i)));\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  html5Unload = function(oAudio) {\r\n\r\n    /**\r\n     * Internal method: Unload media, and cancel any current/pending network requests.\r\n     * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.\r\n     * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media\r\n     * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.\r\n     * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.\r\n     */\r\n\r\n    var url;\r\n\r\n    if (oAudio) {\r\n\r\n      // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME.\r\n      // Desktop Safari complains / fails on data: URI, so it gets about:blank.\r\n      url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));\r\n\r\n      oAudio.src = url;\r\n\r\n      // reset some state, too\r\n      if (oAudio._called_unload !== _undefined) {\r\n        oAudio._called_load = false;\r\n      }\r\n\r\n    }\r\n\r\n    if (useGlobalHTML5Audio) {\r\n\r\n      // ensure URL state is trashed, also\r\n      lastGlobalHTML5URL = null;\r\n\r\n    }\r\n\r\n    return url;\r\n\r\n  };\r\n\r\n  html5CanPlay = function(o) {\r\n\r\n    /**\r\n     * Try to find MIME, test and return truthiness\r\n     * o = {\r\n     *  url: '/path/to/an.mp3',\r\n     *  type: 'audio/mp3'\r\n     * }\r\n     */\r\n\r\n    if (!sm2.useHTML5Audio || !sm2.hasHTML5) return false;\r\n\r\n    var url = (o.url || null),\r\n        mime = (o.type || null),\r\n        aF = sm2.audioFormats,\r\n        result,\r\n        offset,\r\n        fileExt,\r\n        item;\r\n\r\n    // account for known cases like audio/mp3\r\n\r\n    if (mime && sm2.html5[mime] !== _undefined) return (sm2.html5[mime] && !preferFlashCheck(mime));\r\n\r\n    if (!html5Ext) {\r\n\r\n      html5Ext = [];\r\n\r\n      for (item in aF) {\r\n\r\n        if (aF.hasOwnProperty(item)) {\r\n\r\n          html5Ext.push(item);\r\n\r\n          if (aF[item].related) {\r\n            html5Ext = html5Ext.concat(aF[item].related);\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n      html5Ext = new RegExp('\\\\.(' + html5Ext.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n    }\r\n\r\n    // TODO: Strip URL queries, etc.\r\n    fileExt = (url ? url.toLowerCase().match(html5Ext) : null);\r\n\r\n    if (!fileExt || !fileExt.length) {\r\n\r\n      if (!mime) {\r\n\r\n        result = false;\r\n\r\n      } else {\r\n\r\n        // audio/mp3 -> mp3, result should be known\r\n        offset = mime.indexOf(';');\r\n\r\n        // strip \"audio/X; codecs...\"\r\n        fileExt = (offset !== -1 ? mime.substr(0, offset) : mime).substr(6);\r\n\r\n      }\r\n\r\n    } else {\r\n\r\n      // match the raw extension name - \"mp3\", for example\r\n      fileExt = fileExt[1];\r\n\r\n    }\r\n\r\n    if (fileExt && sm2.html5[fileExt] !== _undefined) {\r\n\r\n      // result known\r\n      result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));\r\n\r\n    } else {\r\n\r\n      mime = 'audio/' + fileExt;\r\n      result = sm2.html5.canPlayType({ type: mime });\r\n\r\n      sm2.html5[fileExt] = result;\r\n\r\n      // sm2._wD('canPlayType, found result: ' + result);\r\n      result = (result && sm2.html5[mime] && !preferFlashCheck(mime));\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  testHTML5 = function() {\r\n\r\n    /**\r\n     * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on\r\n     * assigns results to html5[] and flash[].\r\n     */\r\n\r\n    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {\r\n\r\n      // without HTML5, we need Flash.\r\n      sm2.html5.usingFlash = true;\r\n      needsFlash = true;\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load \"null\" as a URL. :/\r\n    var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),\r\n        item, lookup, support = {}, aF, i;\r\n\r\n    function cp(m) {\r\n\r\n      var canPlay, j,\r\n          result = false,\r\n          isOK = false;\r\n\r\n      if (!a || typeof a.canPlayType !== 'function') return result;\r\n\r\n      if (m instanceof Array) {\r\n\r\n        // iterate through all mime types, return any successes\r\n\r\n        for (i = 0, j = m.length; i < j; i++) {\r\n\r\n          if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {\r\n\r\n            isOK = true;\r\n            sm2.html5[m[i]] = true;\r\n\r\n            // note flash support, too\r\n            sm2.flash[m[i]] = !!(m[i].match(flashMIME));\r\n\r\n          }\r\n\r\n        }\r\n\r\n        result = isOK;\r\n\r\n      } else {\r\n\r\n        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);\r\n        result = !!(canPlay && (canPlay.match(sm2.html5Test)));\r\n\r\n      }\r\n\r\n      return result;\r\n\r\n    }\r\n\r\n    // test all registered formats + codecs\r\n\r\n    aF = sm2.audioFormats;\r\n\r\n    for (item in aF) {\r\n\r\n      if (aF.hasOwnProperty(item)) {\r\n\r\n        lookup = 'audio/' + item;\r\n\r\n        support[item] = cp(aF[item].type);\r\n\r\n        // write back generic type too, eg. audio/mp3\r\n        support[lookup] = support[item];\r\n\r\n        // assign flash\r\n        if (item.match(flashMIME)) {\r\n\r\n          sm2.flash[item] = true;\r\n          sm2.flash[lookup] = true;\r\n\r\n        } else {\r\n\r\n          sm2.flash[item] = false;\r\n          sm2.flash[lookup] = false;\r\n\r\n        }\r\n\r\n        // assign result to related formats, too\r\n\r\n        if (aF[item] && aF[item].related) {\r\n\r\n          for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n\r\n            // eg. audio/m4a\r\n            support['audio/' + aF[item].related[i]] = support[item];\r\n            sm2.html5[aF[item].related[i]] = support[item];\r\n            sm2.flash[aF[item].related[i]] = support[item];\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    support.canPlayType = (a ? cp : null);\r\n    sm2.html5 = mixin(sm2.html5, support);\r\n\r\n    sm2.html5.usingFlash = featureCheck();\r\n    needsFlash = sm2.html5.usingFlash;\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  strings = {\r\n\r\n    // <d>\r\n    notReady: 'Unavailable - wait until onready() has fired.',\r\n    notOK: 'Audio support is not available.',\r\n    domError: sm + 'exception caught while appending SWF to DOM.',\r\n    spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',\r\n    swf404: smc + 'Verify that %s is a valid path.',\r\n    tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',\r\n    checkSWF: 'See SWF output for more debug info.',\r\n    localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',\r\n    waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',\r\n    waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',\r\n    waitSWF: smc + 'Waiting for 100% SWF load...',\r\n    needFunction: smc + 'Function object expected for %s',\r\n    badID: 'Sound ID \"%s\" should be a string, starting with a non-numeric character',\r\n    currentObj: smc + '_debug(): Current sound objects',\r\n    waitOnload: smc + 'Waiting for window.onload()',\r\n    docLoaded: smc + 'Document already loaded',\r\n    onload: smc + 'initComplete(): calling soundManager.onload()',\r\n    onloadOK: sm + '.onload() complete',\r\n    didInit: smc + 'init(): Already called?',\r\n    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',\r\n    badRemove: smc + 'Failed to remove Flash node.',\r\n    shutdown: sm + '.disable(): Shutting down',\r\n    queue: smc + 'Queueing %s handler',\r\n    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',\r\n    fbTimeout: 'No flash response, applying .' + swfCSS.swfTimedout + ' CSS...',\r\n    fbLoaded: 'Flash loaded',\r\n    fbHandler: smc + 'flashBlockHandler()',\r\n    manURL: 'SMSound.load(): Using manually-assigned URL',\r\n    onURL: sm + '.load(): current URL already assigned.',\r\n    badFV: sm + '.flashVersion must be 8 or 9. \"%s\" is invalid. Reverting to %s.',\r\n    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',\r\n    noNSLoop: 'Note: Looping not implemented for MovieStar formats',\r\n    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',\r\n    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',\r\n    needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',\r\n    gotFocus: smc + 'Got window focus.',\r\n    policy: 'Enabling usePolicyFile for data access',\r\n    setup: sm + '.setup(): allowed parameters: %s',\r\n    setupError: sm + '.setup(): \"%s\" cannot be assigned with this method.',\r\n    setupUndef: sm + '.setup(): Could not find option \"%s\"',\r\n    setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',\r\n    noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',\r\n    sm2Loaded: 'SoundManager 2: Ready. ' + String.fromCharCode(10003),\r\n    reset: sm + '.reset(): Removing event callbacks',\r\n    mobileUA: 'Mobile UA detected, preferring HTML5 by default.',\r\n    globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.',\r\n    ignoreMobile: 'Ignoring mobile restrictions for this device.'\r\n    // </d>\r\n\r\n  };\r\n\r\n  str = function() {\r\n\r\n    // internal string replace helper.\r\n    // arguments: o [,items to replace]\r\n    // <d>\r\n\r\n    var args,\r\n        i, j, o,\r\n        sstr;\r\n\r\n    // real array, please\r\n    args = slice.call(arguments);\r\n\r\n    // first argument\r\n    o = args.shift();\r\n\r\n    sstr = (strings && strings[o] ? strings[o] : '');\r\n\r\n    if (sstr && args && args.length) {\r\n      for (i = 0, j = args.length; i < j; i++) {\r\n        sstr = sstr.replace('%s', args[i]);\r\n      }\r\n    }\r\n\r\n    return sstr;\r\n    // </d>\r\n\r\n  };\r\n\r\n  loopFix = function(sOpt) {\r\n\r\n    // flash 8 requires stream = false for looping to work\r\n    if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {\r\n      _wDS('as2loop');\r\n      sOpt.stream = false;\r\n    }\r\n\r\n    return sOpt;\r\n\r\n  };\r\n\r\n  policyFix = function(sOpt, sPre) {\r\n\r\n    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {\r\n      sm2._wD((sPre || '') + str('policy'));\r\n      sOpt.usePolicyFile = true;\r\n    }\r\n\r\n    return sOpt;\r\n\r\n  };\r\n\r\n  complain = function(sMsg) {\r\n\r\n    // <d>\r\n    if (hasConsole && console.warn !== _undefined) {\r\n      console.warn(sMsg);\r\n    } else {\r\n      sm2._wD(sMsg);\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  doNothing = function() {\r\n\r\n    return false;\r\n\r\n  };\r\n\r\n  disableObject = function(o) {\r\n\r\n    var oProp;\r\n\r\n    for (oProp in o) {\r\n      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {\r\n        o[oProp] = doNothing;\r\n      }\r\n    }\r\n\r\n    oProp = null;\r\n\r\n  };\r\n\r\n  failSafely = function(bNoDisable) {\r\n\r\n    // general failure exception handler\r\n\r\n    if (bNoDisable === _undefined) {\r\n      bNoDisable = false;\r\n    }\r\n\r\n    if (disabled || bNoDisable) {\r\n      sm2.disable(bNoDisable);\r\n    }\r\n\r\n  };\r\n\r\n  normalizeMovieURL = function(movieURL) {\r\n\r\n    var urlParams = null, url;\r\n\r\n    if (movieURL) {\r\n\r\n      if (movieURL.match(/\\.swf(\\?.*)?$/i)) {\r\n\r\n        urlParams = movieURL.substr(movieURL.toLowerCase().lastIndexOf('.swf?') + 4);\r\n\r\n        // assume user knows what they're doing\r\n        if (urlParams) return movieURL;\r\n\r\n      } else if (movieURL.lastIndexOf('/') !== movieURL.length - 1) {\r\n\r\n        // append trailing slash, if needed\r\n        movieURL += '/';\r\n\r\n      }\r\n\r\n    }\r\n\r\n    url = (movieURL && movieURL.lastIndexOf('/') !== -1 ? movieURL.substr(0, movieURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;\r\n\r\n    if (sm2.noSWFCache) {\r\n      url += ('?ts=' + new Date().getTime());\r\n    }\r\n\r\n    return url;\r\n\r\n  };\r\n\r\n  setVersionInfo = function() {\r\n\r\n    // short-hand for internal use\r\n\r\n    fV = parseInt(sm2.flashVersion, 10);\r\n\r\n    if (fV !== 8 && fV !== 9) {\r\n      sm2._wD(str('badFV', fV, defaultFlashVersion));\r\n      sm2.flashVersion = fV = defaultFlashVersion;\r\n    }\r\n\r\n    // debug flash movie, if applicable\r\n\r\n    var isDebug = (sm2.debugMode || sm2.debugFlash ? '_debug.swf' : '.swf');\r\n\r\n    if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {\r\n      sm2._wD(str('needfl9'));\r\n      sm2.flashVersion = fV = 9;\r\n    }\r\n\r\n    sm2.version = sm2.versionNumber + (sm2.html5Only ? ' (HTML5-only mode)' : (fV === 9 ? ' (AS3/Flash 9)' : ' (AS2/Flash 8)'));\r\n\r\n    // set up default options\r\n    if (fV > 8) {\r\n\r\n      // +flash 9 base options\r\n      sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);\r\n      sm2.features.buffering = true;\r\n\r\n      // +moviestar support\r\n      sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);\r\n      sm2.filePatterns.flash9 = new RegExp('\\\\.(mp3|' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n      sm2.features.movieStar = true;\r\n\r\n    } else {\r\n\r\n      sm2.features.movieStar = false;\r\n\r\n    }\r\n\r\n    // regExp for flash canPlay(), etc.\r\n    sm2.filePattern = sm2.filePatterns[(fV !== 8 ? 'flash9' : 'flash8')];\r\n\r\n    // if applicable, use _debug versions of SWFs\r\n    sm2.movieURL = (fV === 8 ? 'soundmanager2.swf' : 'soundmanager2_flash9.swf').replace('.swf', isDebug);\r\n\r\n    sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);\r\n\r\n  };\r\n\r\n  setPolling = function(bPolling, bHighPerformance) {\r\n\r\n    if (!flash) {\r\n      return;\r\n    }\r\n\r\n    flash._setPolling(bPolling, bHighPerformance);\r\n\r\n  };\r\n\r\n  initDebug = function() {\r\n\r\n    // starts debug mode, creating output <div> for UAs without console object\r\n\r\n    // allow force of debug mode via URL\r\n    // <d>\r\n    if (sm2.debugURLParam.test(wl)) {\r\n      sm2.setupOptions.debugMode = sm2.debugMode = true;\r\n    }\r\n\r\n    if (id(sm2.debugID)) {\r\n      return;\r\n    }\r\n\r\n    var oD, oDebug, oTarget, oToggle, tmp;\r\n\r\n    if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {\r\n\r\n      oD = doc.createElement('div');\r\n      oD.id = sm2.debugID + '-toggle';\r\n\r\n      oToggle = {\r\n        position: 'fixed',\r\n        bottom: '0px',\r\n        right: '0px',\r\n        width: '1.2em',\r\n        height: '1.2em',\r\n        lineHeight: '1.2em',\r\n        margin: '2px',\r\n        textAlign: 'center',\r\n        border: '1px solid #999',\r\n        cursor: 'pointer',\r\n        background: '#fff',\r\n        color: '#333',\r\n        zIndex: 10001\r\n      };\r\n\r\n      oD.appendChild(doc.createTextNode('-'));\r\n      oD.onclick = toggleDebug;\r\n      oD.title = 'Toggle SM2 debug console';\r\n\r\n      if (ua.match(/msie 6/i)) {\r\n        oD.style.position = 'absolute';\r\n        oD.style.cursor = 'hand';\r\n      }\r\n\r\n      for (tmp in oToggle) {\r\n        if (oToggle.hasOwnProperty(tmp)) {\r\n          oD.style[tmp] = oToggle[tmp];\r\n        }\r\n      }\r\n\r\n      oDebug = doc.createElement('div');\r\n      oDebug.id = sm2.debugID;\r\n      oDebug.style.display = (sm2.debugMode ? 'block' : 'none');\r\n\r\n      if (sm2.debugMode && !id(oD.id)) {\r\n        try {\r\n          oTarget = getDocument();\r\n          oTarget.appendChild(oD);\r\n        } catch(e2) {\r\n          throw new Error(str('domError') + ' \\n' + e2.toString());\r\n        }\r\n        oTarget.appendChild(oDebug);\r\n      }\r\n\r\n    }\r\n\r\n    oTarget = null;\r\n    // </d>\r\n\r\n  };\r\n\r\n  idCheck = this.getSoundById;\r\n\r\n  // <d>\r\n  _wDS = function(o, errorLevel) {\r\n\r\n    return (!o ? '' : sm2._wD(str(o), errorLevel));\r\n\r\n  };\r\n\r\n  toggleDebug = function() {\r\n\r\n    var o = id(sm2.debugID),\r\n    oT = id(sm2.debugID + '-toggle');\r\n\r\n    if (!o) {\r\n      return;\r\n    }\r\n\r\n    if (debugOpen) {\r\n      // minimize\r\n      oT.innerHTML = '+';\r\n      o.style.display = 'none';\r\n    } else {\r\n      oT.innerHTML = '-';\r\n      o.style.display = 'block';\r\n    }\r\n\r\n    debugOpen = !debugOpen;\r\n\r\n  };\r\n\r\n  debugTS = function(sEventType, bSuccess, sMessage) {\r\n\r\n    // troubleshooter debug hooks\r\n\r\n    if (window.sm2Debugger !== _undefined) {\r\n      try {\r\n        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);\r\n      } catch(e) {\r\n        // oh well\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n  // </d>\r\n\r\n  getSWFCSS = function() {\r\n\r\n    var css = [];\r\n\r\n    if (sm2.debugMode) {\r\n      css.push(swfCSS.sm2Debug);\r\n    }\r\n\r\n    if (sm2.debugFlash) {\r\n      css.push(swfCSS.flashDebug);\r\n    }\r\n\r\n    if (sm2.useHighPerformance) {\r\n      css.push(swfCSS.highPerf);\r\n    }\r\n\r\n    return css.join(' ');\r\n\r\n  };\r\n\r\n  flashBlockHandler = function() {\r\n\r\n    // *possible* flash block situation.\r\n\r\n    var name = str('fbHandler'),\r\n        p = sm2.getMoviePercent(),\r\n        css = swfCSS,\r\n        error = {\r\n          type: 'FLASHBLOCK'\r\n        };\r\n\r\n    if (sm2.html5Only) {\r\n      // no flash, or unused\r\n      return;\r\n    }\r\n\r\n    if (!sm2.ok()) {\r\n\r\n      if (needsFlash) {\r\n        // make the movie more visible, so user can fix\r\n        sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null ? css.swfTimedout : css.swfError);\r\n        sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));\r\n      }\r\n\r\n      sm2.didFlashBlock = true;\r\n\r\n      // fire onready(), complain lightly\r\n      processOnEvents({\r\n        type: 'ontimeout',\r\n        ignoreInit: true,\r\n        error: error\r\n      });\r\n\r\n      catchError(error);\r\n\r\n    } else {\r\n\r\n      // SM2 loaded OK (or recovered)\r\n\r\n      // <d>\r\n      if (sm2.didFlashBlock) {\r\n        sm2._wD(name + ': Unblocked');\r\n      }\r\n      // </d>\r\n\r\n      if (sm2.oMC) {\r\n        sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock ? ' ' + css.swfUnblocked : '')].join(' ');\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  addOnEvent = function(sType, oMethod, oScope) {\r\n\r\n    if (on_queue[sType] === _undefined) {\r\n      on_queue[sType] = [];\r\n    }\r\n\r\n    on_queue[sType].push({\r\n      method: oMethod,\r\n      scope: (oScope || null),\r\n      fired: false\r\n    });\r\n\r\n  };\r\n\r\n  processOnEvents = function(oOptions) {\r\n\r\n    // if unspecified, assume OK/error\r\n\r\n    if (!oOptions) {\r\n      oOptions = {\r\n        type: (sm2.ok() ? 'onready' : 'ontimeout')\r\n      };\r\n    }\r\n\r\n    // not ready yet.\r\n    if (!didInit && oOptions && !oOptions.ignoreInit) return false;\r\n\r\n    // invalid case\r\n    if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) return false;\r\n\r\n    var status = {\r\n          success: (oOptions && oOptions.ignoreInit ? sm2.ok() : !disabled)\r\n        },\r\n\r\n        // queue specified by type, or none\r\n        srcQueue = (oOptions && oOptions.type ? on_queue[oOptions.type] || [] : []),\r\n\r\n        queue = [], i, j,\r\n        args = [status],\r\n        canRetry = (needsFlash && !sm2.ok());\r\n\r\n    if (oOptions.error) {\r\n      args[0].error = oOptions.error;\r\n    }\r\n\r\n    for (i = 0, j = srcQueue.length; i < j; i++) {\r\n      if (srcQueue[i].fired !== true) {\r\n        queue.push(srcQueue[i]);\r\n      }\r\n    }\r\n\r\n    if (queue.length) {\r\n\r\n      // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));\r\n      for (i = 0, j = queue.length; i < j; i++) {\r\n\r\n        if (queue[i].scope) {\r\n          queue[i].method.apply(queue[i].scope, args);\r\n        } else {\r\n          queue[i].method.apply(this, args);\r\n        }\r\n\r\n        if (!canRetry) {\r\n          // useFlashBlock and SWF timeout case doesn't count here.\r\n          queue[i].fired = true;\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  initUserOnload = function() {\r\n\r\n    window.setTimeout(function() {\r\n\r\n      if (sm2.useFlashBlock) {\r\n        flashBlockHandler();\r\n      }\r\n\r\n      processOnEvents();\r\n\r\n      // call user-defined \"onload\", scoped to window\r\n\r\n      if (typeof sm2.onload === 'function') {\r\n        _wDS('onload', 1);\r\n        sm2.onload.apply(window);\r\n        _wDS('onloadOK', 1);\r\n      }\r\n\r\n      if (sm2.waitForWindowLoad) {\r\n        event.add(window, 'load', initUserOnload);\r\n      }\r\n\r\n    }, 1);\r\n\r\n  };\r\n\r\n  detectFlash = function() {\r\n\r\n    /**\r\n     * Hat tip: Flash Detect library (BSD, (C) 2007) by Carl \"DocYes\" S. Yestrau\r\n     * http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt\r\n     */\r\n\r\n    // this work has already been done.\r\n    if (hasFlash !== _undefined) return hasFlash;\r\n\r\n    var hasPlugin = false, n = navigator, obj, type, types, AX = window.ActiveXObject;\r\n\r\n    // MS Edge 14 throws an \"Unspecified Error\" because n.plugins is inaccessible due to permissions\r\n    var nP;\r\n\r\n    try {\r\n      nP = n.plugins;\r\n    } catch(e) {\r\n      nP = undefined;\r\n    }\r\n\r\n    if (nP && nP.length) {\r\n\r\n      type = 'application/x-shockwave-flash';\r\n      types = n.mimeTypes;\r\n\r\n      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {\r\n        hasPlugin = true;\r\n      }\r\n\r\n    } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {\r\n\r\n      // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.\r\n      try {\r\n        obj = new AX('ShockwaveFlash.ShockwaveFlash');\r\n      } catch(e) {\r\n        // oh well\r\n        obj = null;\r\n      }\r\n\r\n      hasPlugin = (!!obj);\r\n\r\n      // cleanup, because it is ActiveX after all\r\n      obj = null;\r\n\r\n    }\r\n\r\n    hasFlash = hasPlugin;\r\n\r\n    return hasPlugin;\r\n\r\n  };\r\n\r\n  featureCheck = function() {\r\n\r\n    var flashNeeded,\r\n        item,\r\n        formats = sm2.audioFormats,\r\n        // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.\r\n        isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)\\s/i)));\r\n\r\n    if (isSpecial) {\r\n\r\n      // has Audio(), but is broken; let it load links directly.\r\n      sm2.hasHTML5 = false;\r\n\r\n      // ignore flash case, however\r\n      sm2.html5Only = true;\r\n\r\n      // hide the SWF, if present\r\n      if (sm2.oMC) {\r\n        sm2.oMC.style.display = 'none';\r\n      }\r\n\r\n    } else if (sm2.useHTML5Audio) {\r\n\r\n        if (!sm2.html5 || !sm2.html5.canPlayType) {\r\n          sm2._wD('SoundManager: No HTML5 Audio() support detected.');\r\n          sm2.hasHTML5 = false;\r\n        }\r\n\r\n        // <d>\r\n        if (isBadSafari) {\r\n          sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ? ' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);\r\n        }\r\n        // </d>\r\n\r\n      }\r\n\r\n    if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n\r\n      // sort out whether flash is optional, required or can be ignored.\r\n\r\n      // innocent until proven guilty.\r\n      canIgnoreFlash = true;\r\n\r\n      for (item in formats) {\r\n\r\n        if (formats.hasOwnProperty(item)) {\r\n\r\n          if (formats[item].required) {\r\n\r\n            if (!sm2.html5.canPlayType(formats[item].type)) {\r\n\r\n              // 100% HTML5 mode is not possible.\r\n              canIgnoreFlash = false;\r\n              flashNeeded = true;\r\n\r\n            } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {\r\n\r\n              // flash may be required, or preferred for this format.\r\n              flashNeeded = true;\r\n\r\n            }\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // sanity check...\r\n    if (sm2.ignoreFlash) {\r\n      flashNeeded = false;\r\n      canIgnoreFlash = true;\r\n    }\r\n\r\n    sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);\r\n\r\n    return (!sm2.html5Only);\r\n\r\n  };\r\n\r\n  parseURL = function(url) {\r\n\r\n    /**\r\n     * Internal: Finds and returns the first playable URL (or failing that, the first URL.)\r\n     * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.\r\n     */\r\n\r\n    var i, j, urlResult = 0, result;\r\n\r\n    if (url instanceof Array) {\r\n\r\n      // find the first good one\r\n      for (i = 0, j = url.length; i < j; i++) {\r\n\r\n        if (url[i] instanceof Object) {\r\n\r\n          // MIME check\r\n          if (sm2.canPlayMIME(url[i].type)) {\r\n            urlResult = i;\r\n            break;\r\n          }\r\n\r\n        } else if (sm2.canPlayURL(url[i])) {\r\n\r\n          // URL string check\r\n          urlResult = i;\r\n          break;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      // normalize to string\r\n      if (url[urlResult].url) {\r\n        url[urlResult] = url[urlResult].url;\r\n      }\r\n\r\n      result = url[urlResult];\r\n\r\n    } else {\r\n\r\n      // single URL case\r\n      result = url;\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n\r\n  startTimer = function(oSound) {\r\n\r\n    /**\r\n     * attach a timer to this sound, and start an interval if needed\r\n     */\r\n\r\n    if (!oSound._hasTimer) {\r\n\r\n      oSound._hasTimer = true;\r\n\r\n      if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n        if (h5IntervalTimer === null && h5TimerCount === 0) {\r\n\r\n          h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);\r\n\r\n        }\r\n\r\n        h5TimerCount++;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  stopTimer = function(oSound) {\r\n\r\n    /**\r\n     * detach a timer\r\n     */\r\n\r\n    if (oSound._hasTimer) {\r\n\r\n      oSound._hasTimer = false;\r\n\r\n      if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n        // interval will stop itself at next execution.\r\n\r\n        h5TimerCount--;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  timerExecute = function() {\r\n\r\n    /**\r\n     * manual polling for HTML5 progress events, ie., whileplaying()\r\n     * (can achieve greater precision than conservative default HTML5 interval)\r\n     */\r\n\r\n    var i;\r\n\r\n    if (h5IntervalTimer !== null && !h5TimerCount) {\r\n\r\n      // no active timers, stop polling interval.\r\n\r\n      clearInterval(h5IntervalTimer);\r\n\r\n      h5IntervalTimer = null;\r\n\r\n      return;\r\n\r\n    }\r\n\r\n    // check all HTML5 sounds with timers\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n\r\n      if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {\r\n        sm2.sounds[sm2.soundIDs[i]]._onTimer();\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  catchError = function(options) {\r\n\r\n    options = (options !== _undefined ? options : {});\r\n\r\n    if (typeof sm2.onerror === 'function') {\r\n      sm2.onerror.apply(window, [{\r\n        type: (options.type !== _undefined ? options.type : null)\r\n      }]);\r\n    }\r\n\r\n    if (options.fatal !== _undefined && options.fatal) {\r\n      sm2.disable();\r\n    }\r\n\r\n  };\r\n\r\n  badSafariFix = function() {\r\n\r\n    // special case: \"bad\" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4\r\n    if (!isBadSafari || !detectFlash()) {\r\n      // doesn't apply\r\n      return;\r\n    }\r\n\r\n    var aF = sm2.audioFormats, i, item;\r\n\r\n    for (item in aF) {\r\n\r\n      if (aF.hasOwnProperty(item)) {\r\n\r\n        if (item === 'mp3' || item === 'mp4') {\r\n\r\n          sm2._wD(sm + ': Using flash fallback for ' + item + ' format');\r\n          sm2.html5[item] = false;\r\n\r\n          // assign result to related formats, too\r\n          if (aF[item] && aF[item].related) {\r\n            for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n              sm2.html5[aF[item].related[i]] = false;\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   * Pseudo-private flash/ExternalInterface methods\r\n   * ----------------------------------------------\r\n   */\r\n\r\n  this._setSandboxType = function(sandboxType) {\r\n\r\n    // <d>\r\n    // Security sandbox according to Flash plugin\r\n    var sb = sm2.sandbox;\r\n\r\n    sb.type = sandboxType;\r\n    sb.description = sb.types[(sb.types[sandboxType] !== _undefined ? sandboxType : 'unknown')];\r\n\r\n    if (sb.type === 'localWithFile') {\r\n\r\n      sb.noRemote = true;\r\n      sb.noLocal = false;\r\n      _wDS('secNote', 2);\r\n\r\n    } else if (sb.type === 'localWithNetwork') {\r\n\r\n      sb.noRemote = false;\r\n      sb.noLocal = true;\r\n\r\n    } else if (sb.type === 'localTrusted') {\r\n\r\n      sb.noRemote = false;\r\n      sb.noLocal = false;\r\n\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  this._externalInterfaceOK = function(swfVersion) {\r\n\r\n    // flash callback confirming flash loaded, EI working etc.\r\n    // swfVersion: SWF build string\r\n\r\n    if (sm2.swfLoaded) {\r\n      return;\r\n    }\r\n\r\n    var e;\r\n\r\n    debugTS('swf', true);\r\n    debugTS('flashtojs', true);\r\n    sm2.swfLoaded = true;\r\n    tryInitOnFocus = false;\r\n\r\n    if (isBadSafari) {\r\n      badSafariFix();\r\n    }\r\n\r\n    // complain if JS + SWF build/version strings don't match, excluding +DEV builds\r\n    // <d>\r\n    if (!swfVersion || swfVersion.replace(/\\+dev/i, '') !== sm2.versionNumber.replace(/\\+dev/i, '')) {\r\n\r\n      e = sm + ': Fatal: JavaScript file build \"' + sm2.versionNumber + '\" does not match Flash SWF build \"' + swfVersion + '\" at ' + sm2.url + '. Ensure both are up-to-date.';\r\n\r\n      // escape flash -> JS stack so this error fires in window.\r\n      setTimeout(function() {\r\n        throw new Error(e);\r\n      }, 0);\r\n\r\n      // exit, init will fail with timeout\r\n      return;\r\n\r\n    }\r\n    // </d>\r\n\r\n    // IE needs a larger timeout\r\n    setTimeout(init, isIE ? 100 : 1);\r\n\r\n  };\r\n\r\n  /**\r\n   * Private initialization helpers\r\n   * ------------------------------\r\n   */\r\n\r\n  createMovie = function(movieID, movieURL) {\r\n\r\n    // ignore if already connected\r\n    if (didAppend && appendSuccess) return false;\r\n\r\n    function initMsg() {\r\n\r\n      // <d>\r\n\r\n      var options = [],\r\n          title,\r\n          msg = [],\r\n          delimiter = ' + ';\r\n\r\n      title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');\r\n\r\n      if (!sm2.html5Only) {\r\n\r\n        if (sm2.preferFlash) {\r\n          options.push('preferFlash');\r\n        }\r\n\r\n        if (sm2.useHighPerformance) {\r\n          options.push('useHighPerformance');\r\n        }\r\n\r\n        if (sm2.flashPollingInterval) {\r\n          options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');\r\n        }\r\n\r\n        if (sm2.html5PollingInterval) {\r\n          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n        }\r\n\r\n        if (sm2.wmode) {\r\n          options.push('wmode (' + sm2.wmode + ')');\r\n        }\r\n\r\n        if (sm2.debugFlash) {\r\n          options.push('debugFlash');\r\n        }\r\n\r\n        if (sm2.useFlashBlock) {\r\n          options.push('flashBlock');\r\n        }\r\n\r\n      } else if (sm2.html5PollingInterval) {\r\n          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n        }\r\n\r\n      if (options.length) {\r\n        msg = msg.concat([options.join(delimiter)]);\r\n      }\r\n\r\n      sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);\r\n\r\n      showSupport();\r\n\r\n      // </d>\r\n\r\n    }\r\n\r\n    if (sm2.html5Only) {\r\n\r\n      // 100% HTML5 mode\r\n      setVersionInfo();\r\n\r\n      initMsg();\r\n      sm2.oMC = id(sm2.movieID);\r\n      init();\r\n\r\n      // prevent multiple init attempts\r\n      didAppend = true;\r\n\r\n      appendSuccess = true;\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // flash path\r\n    var remoteURL = (movieURL || sm2.url),\r\n    localURL = (sm2.altURL || remoteURL),\r\n    swfTitle = 'JS/Flash audio component (SoundManager 2)',\r\n    oTarget = getDocument(),\r\n    extraClass = getSWFCSS(),\r\n    isRTL = null,\r\n    html = doc.getElementsByTagName('html')[0],\r\n    oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;\r\n\r\n    isRTL = (html && html.dir && html.dir.match(/rtl/i));\r\n    movieID = (movieID === _undefined ? sm2.id : movieID);\r\n\r\n    function param(name, value) {\r\n      return '<param name=\"' + name + '\" value=\"' + value + '\" />';\r\n    }\r\n\r\n    // safety check for legacy (change to Flash 9 URL)\r\n    setVersionInfo();\r\n    sm2.url = normalizeMovieURL(overHTTP ? remoteURL : localURL);\r\n    movieURL = sm2.url;\r\n\r\n    sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);\r\n\r\n    if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {\r\n      /**\r\n       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here\r\n       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout\r\n       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)\r\n       */\r\n      messages.push(strings.spcWmode);\r\n      sm2.wmode = null;\r\n    }\r\n\r\n    oEmbed = {\r\n      name: movieID,\r\n      id: movieID,\r\n      src: movieURL,\r\n      quality: 'high',\r\n      allowScriptAccess: sm2.allowScriptAccess,\r\n      bgcolor: sm2.bgColor,\r\n      pluginspage: http + 'www.macromedia.com/go/getflashplayer',\r\n      title: swfTitle,\r\n      type: 'application/x-shockwave-flash',\r\n      wmode: sm2.wmode,\r\n      // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\r\n      hasPriority: 'true'\r\n    };\r\n\r\n    if (sm2.debugFlash) {\r\n      oEmbed.FlashVars = 'debug=1';\r\n    }\r\n\r\n    if (!sm2.wmode) {\r\n      // don't write empty attribute\r\n      delete oEmbed.wmode;\r\n    }\r\n\r\n    if (isIE) {\r\n\r\n      // IE is \"special\".\r\n      oMovie = doc.createElement('div');\r\n      movieHTML = [\r\n        '<object id=\"' + movieID + '\" data=\"' + movieURL + '\" type=\"' + oEmbed.type + '\" title=\"' + oEmbed.title + '\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">',\r\n        param('movie', movieURL),\r\n        param('AllowScriptAccess', sm2.allowScriptAccess),\r\n        param('quality', oEmbed.quality),\r\n        (sm2.wmode ? param('wmode', sm2.wmode) : ''),\r\n        param('bgcolor', sm2.bgColor),\r\n        param('hasPriority', 'true'),\r\n        (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),\r\n        '</object>'\r\n      ].join('');\r\n\r\n    } else {\r\n\r\n      oMovie = doc.createElement('embed');\r\n      for (tmp in oEmbed) {\r\n        if (oEmbed.hasOwnProperty(tmp)) {\r\n          oMovie.setAttribute(tmp, oEmbed[tmp]);\r\n        }\r\n      }\r\n\r\n    }\r\n\r\n    initDebug();\r\n    extraClass = getSWFCSS();\r\n    oTarget = getDocument();\r\n\r\n    if (oTarget) {\r\n\r\n      sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));\r\n\r\n      if (!sm2.oMC.id) {\r\n\r\n        sm2.oMC.id = sm2.movieID;\r\n        sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;\r\n        s = null;\r\n        oEl = null;\r\n\r\n        if (!sm2.useFlashBlock) {\r\n          if (sm2.useHighPerformance) {\r\n            // on-screen at all times\r\n            s = {\r\n              position: 'fixed',\r\n              width: '8px',\r\n              height: '8px',\r\n              // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.\r\n              bottom: '0px',\r\n              left: '0px',\r\n              overflow: 'hidden'\r\n            };\r\n          } else {\r\n            // hide off-screen, lower priority\r\n            s = {\r\n              position: 'absolute',\r\n              width: '6px',\r\n              height: '6px',\r\n              top: '-9999px',\r\n              left: '-9999px'\r\n            };\r\n            if (isRTL) {\r\n              s.left = Math.abs(parseInt(s.left, 10)) + 'px';\r\n            }\r\n          }\r\n        }\r\n\r\n        if (isWebkit) {\r\n          // soundcloud-reported render/crash fix, safari 5\r\n          sm2.oMC.style.zIndex = 10000;\r\n        }\r\n\r\n        if (!sm2.debugFlash) {\r\n          for (x in s) {\r\n            if (s.hasOwnProperty(x)) {\r\n              sm2.oMC.style[x] = s[x];\r\n            }\r\n          }\r\n        }\r\n\r\n        try {\r\n\r\n          if (!isIE) {\r\n            sm2.oMC.appendChild(oMovie);\r\n          }\r\n\r\n          oTarget.appendChild(sm2.oMC);\r\n\r\n          if (isIE) {\r\n            oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n            oEl.className = swfCSS.swfBox;\r\n            oEl.innerHTML = movieHTML;\r\n          }\r\n\r\n          appendSuccess = true;\r\n\r\n        } catch(e) {\r\n\r\n          throw new Error(str('domError') + ' \\n' + e.toString());\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        // SM2 container is already in the document (eg. flashblock use case)\r\n        sClass = sm2.oMC.className;\r\n        sm2.oMC.className = (sClass ? sClass + ' ' : swfCSS.swfDefault) + (extraClass ? ' ' + extraClass : '');\r\n        sm2.oMC.appendChild(oMovie);\r\n\r\n        if (isIE) {\r\n          oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n          oEl.className = swfCSS.swfBox;\r\n          oEl.innerHTML = movieHTML;\r\n        }\r\n\r\n        appendSuccess = true;\r\n\r\n      }\r\n\r\n    }\r\n\r\n    didAppend = true;\r\n\r\n    initMsg();\r\n\r\n    // sm2._wD(sm + ': Trying to load ' + movieURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  initMovie = function() {\r\n\r\n    if (sm2.html5Only) {\r\n      createMovie();\r\n      return false;\r\n    }\r\n\r\n    // attempt to get, or create, movie (may already exist)\r\n    if (flash) return false;\r\n\r\n    if (!sm2.url) {\r\n\r\n      /**\r\n       * Something isn't right - we've reached init, but the soundManager url property has not been set.\r\n       * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.\r\n       * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.\r\n       */\r\n\r\n       _wDS('noURL');\r\n       return false;\r\n\r\n    }\r\n\r\n    // inline markup case\r\n    flash = sm2.getMovie(sm2.id);\r\n\r\n    if (!flash) {\r\n\r\n      if (!oRemoved) {\r\n\r\n        // try to create\r\n        createMovie(sm2.id, sm2.url);\r\n\r\n      } else {\r\n\r\n        // try to re-append removed movie after reboot()\r\n        if (!isIE) {\r\n          sm2.oMC.appendChild(oRemoved);\r\n        } else {\r\n          sm2.oMC.innerHTML = oRemovedHTML;\r\n        }\r\n\r\n        oRemoved = null;\r\n        didAppend = true;\r\n\r\n      }\r\n\r\n      flash = sm2.getMovie(sm2.id);\r\n\r\n    }\r\n\r\n    if (typeof sm2.oninitmovie === 'function') {\r\n      setTimeout(sm2.oninitmovie, 1);\r\n    }\r\n\r\n    // <d>\r\n    flushMessages();\r\n    // </d>\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  delayWaitForEI = function() {\r\n\r\n    setTimeout(waitForEI, 1000);\r\n\r\n  };\r\n\r\n  rebootIntoHTML5 = function() {\r\n\r\n    // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.\r\n\r\n    window.setTimeout(function() {\r\n\r\n      complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');\r\n\r\n      sm2.setup({\r\n        preferFlash: false\r\n      }).reboot();\r\n\r\n      // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.\r\n      sm2.didFlashBlock = true;\r\n\r\n      sm2.beginDelayedInit();\r\n\r\n    }, 1);\r\n\r\n  };\r\n\r\n  waitForEI = function() {\r\n\r\n    var p,\r\n        loadIncomplete = false;\r\n\r\n    if (!sm2.url) {\r\n      // No SWF url to load (noURL case) - exit for now. Will be retried when url is set.\r\n      return;\r\n    }\r\n\r\n    if (waitingForEI) {\r\n      return;\r\n    }\r\n\r\n    waitingForEI = true;\r\n    event.remove(window, 'load', delayWaitForEI);\r\n\r\n    if (hasFlash && tryInitOnFocus && !isFocused) {\r\n      // Safari won't load flash in background tabs, only when focused.\r\n      _wDS('waitFocus');\r\n      return;\r\n    }\r\n\r\n    if (!didInit) {\r\n      p = sm2.getMoviePercent();\r\n      if (p > 0 && p < 100) {\r\n        loadIncomplete = true;\r\n      }\r\n    }\r\n\r\n    setTimeout(function() {\r\n\r\n      p = sm2.getMoviePercent();\r\n\r\n      if (loadIncomplete) {\r\n        // special case: if movie *partially* loaded, retry until it's 100% before assuming failure.\r\n        waitingForEI = false;\r\n        sm2._wD(str('waitSWF'));\r\n        window.setTimeout(delayWaitForEI, 1);\r\n        return;\r\n      }\r\n\r\n      // <d>\r\n      if (!didInit) {\r\n\r\n        sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ' : '') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash ? ' ' + str('checkSWF') : ''), 2);\r\n\r\n        if (!overHTTP && p) {\r\n\r\n          _wDS('localFail', 2);\r\n\r\n          if (!sm2.debugFlash) {\r\n            _wDS('tryDebug', 2);\r\n          }\r\n\r\n        }\r\n\r\n        if (p === 0) {\r\n\r\n          // if 0 (not null), probably a 404.\r\n          sm2._wD(str('swf404', sm2.url), 1);\r\n\r\n        }\r\n\r\n        debugTS('flashtojs', false, ': Timed out' + (overHTTP ? ' (Check flash security or flash blockers)' : ' (No plugin/missing SWF?)'));\r\n\r\n      }\r\n      // </d>\r\n\r\n      // give up / time-out, depending\r\n\r\n      if (!didInit && okToDisable) {\r\n\r\n        if (p === null) {\r\n\r\n          // SWF failed to report load progress. Possibly blocked.\r\n\r\n          if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {\r\n\r\n            if (sm2.useFlashBlock) {\r\n\r\n              flashBlockHandler();\r\n\r\n            }\r\n\r\n            _wDS('waitForever');\r\n\r\n          } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n            // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.\r\n            rebootIntoHTML5();\r\n\r\n          } else {\r\n\r\n            _wDS('waitForever');\r\n\r\n            // fire any regular registered ontimeout() listeners.\r\n            processOnEvents({\r\n              type: 'ontimeout',\r\n              ignoreInit: true,\r\n              error: {\r\n                type: 'INIT_FLASHBLOCK'\r\n              }\r\n            });\r\n\r\n          }\r\n\r\n        } else if (sm2.flashLoadTimeout === 0) {\r\n\r\n          // SWF loaded? Shouldn't be a blocking issue, then.\r\n\r\n          _wDS('waitForever');\r\n\r\n        } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n          rebootIntoHTML5();\r\n\r\n        } else {\r\n\r\n          failSafely(true);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }, sm2.flashLoadTimeout);\r\n\r\n  };\r\n\r\n  handleFocus = function() {\r\n\r\n    function cleanup() {\r\n      event.remove(window, 'focus', handleFocus);\r\n    }\r\n\r\n    if (isFocused || !tryInitOnFocus) {\r\n      // already focused, or not special Safari background tab case\r\n      cleanup();\r\n      return true;\r\n    }\r\n\r\n    okToDisable = true;\r\n    isFocused = true;\r\n    _wDS('gotFocus');\r\n\r\n    // allow init to restart\r\n    waitingForEI = false;\r\n\r\n    // kick off ExternalInterface timeout, now that the SWF has started\r\n    delayWaitForEI();\r\n\r\n    cleanup();\r\n    return true;\r\n\r\n  };\r\n\r\n  flushMessages = function() {\r\n\r\n    // <d>\r\n\r\n    // SM2 pre-init debug messages\r\n    if (messages.length) {\r\n      sm2._wD('SoundManager 2: ' + messages.join(' '), 1);\r\n      messages = [];\r\n    }\r\n\r\n    // </d>\r\n\r\n  };\r\n\r\n  showSupport = function() {\r\n\r\n    // <d>\r\n\r\n    flushMessages();\r\n\r\n    var item, tests = [];\r\n\r\n    if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n      for (item in sm2.audioFormats) {\r\n        if (sm2.audioFormats.hasOwnProperty(item)) {\r\n          tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)' : (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ' : '') + 'and no flash support)' : ''))));\r\n        }\r\n      }\r\n      sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);\r\n    }\r\n\r\n    // </d>\r\n\r\n  };\r\n\r\n  initComplete = function(bNoDisable) {\r\n\r\n    if (didInit) return false;\r\n\r\n    if (sm2.html5Only) {\r\n      // all good.\r\n      _wDS('sm2Loaded', 1);\r\n      didInit = true;\r\n      initUserOnload();\r\n      debugTS('onload', true);\r\n      return true;\r\n    }\r\n\r\n    var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),\r\n        result = true,\r\n        error;\r\n\r\n    if (!wasTimeout) {\r\n      didInit = true;\r\n    }\r\n\r\n    error = {\r\n      type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')\r\n    };\r\n\r\n    sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ') ' + String.fromCharCode(disabled ? 10006 : 10003), disabled ? 2 : 1);\r\n\r\n    if (disabled || bNoDisable) {\r\n\r\n      if (sm2.useFlashBlock && sm2.oMC) {\r\n        sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null ? swfCSS.swfTimedout : swfCSS.swfError);\r\n      }\r\n\r\n      processOnEvents({\r\n        type: 'ontimeout',\r\n        error: error,\r\n        ignoreInit: true\r\n      });\r\n\r\n      debugTS('onload', false);\r\n      catchError(error);\r\n\r\n      result = false;\r\n\r\n    } else {\r\n\r\n      debugTS('onload', true);\r\n\r\n    }\r\n\r\n    if (!disabled) {\r\n\r\n      if (sm2.waitForWindowLoad && !windowLoaded) {\r\n\r\n        _wDS('waitOnload');\r\n        event.add(window, 'load', initUserOnload);\r\n\r\n      } else {\r\n\r\n        // <d>\r\n        if (sm2.waitForWindowLoad && windowLoaded) {\r\n          _wDS('docLoaded');\r\n        }\r\n        // </d>\r\n\r\n        initUserOnload();\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)\r\n   * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().\r\n   */\r\n\r\n  setProperties = function() {\r\n\r\n    var i,\r\n        o = sm2.setupOptions;\r\n\r\n    for (i in o) {\r\n\r\n      if (o.hasOwnProperty(i)) {\r\n\r\n        // assign local property if not already defined\r\n\r\n        if (sm2[i] === _undefined) {\r\n\r\n          sm2[i] = o[i];\r\n\r\n        } else if (sm2[i] !== o[i]) {\r\n\r\n          // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync\r\n          sm2.setupOptions[i] = sm2[i];\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n\r\n  init = function() {\r\n\r\n    // called after onload()\r\n\r\n    if (didInit) {\r\n      _wDS('didInit');\r\n      return false;\r\n    }\r\n\r\n    function cleanup() {\r\n      event.remove(window, 'load', sm2.beginDelayedInit);\r\n    }\r\n\r\n    if (sm2.html5Only) {\r\n\r\n      if (!didInit) {\r\n        // we don't need no steenking flash!\r\n        cleanup();\r\n        sm2.enabled = true;\r\n        initComplete();\r\n      }\r\n\r\n      return true;\r\n\r\n    }\r\n\r\n    // flash path\r\n    initMovie();\r\n\r\n    try {\r\n\r\n      // attempt to talk to Flash\r\n      flash._externalInterfaceTest(false);\r\n\r\n      /**\r\n       * Apply user-specified polling interval, OR, if \"high performance\" set, faster vs. default polling\r\n       * (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)\r\n       */\r\n      setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));\r\n\r\n      if (!sm2.debugMode) {\r\n        // stop the SWF from making debug output calls to JS\r\n        flash._disableDebug();\r\n      }\r\n\r\n      sm2.enabled = true;\r\n      debugTS('jstoflash', true);\r\n\r\n      if (!sm2.html5Only) {\r\n        // prevent browser from showing cached page state (or rather, restoring \"suspended\" page state) via back button, because flash may be dead\r\n        // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/\r\n        event.add(window, 'unload', doNothing);\r\n      }\r\n\r\n    } catch(e) {\r\n\r\n      sm2._wD('js/flash exception: ' + e.toString());\r\n\r\n      debugTS('jstoflash', false);\r\n\r\n      catchError({\r\n        type: 'JS_TO_FLASH_EXCEPTION',\r\n        fatal: true\r\n      });\r\n\r\n      // don't disable, for reboot()\r\n      failSafely(true);\r\n\r\n      initComplete();\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    initComplete();\r\n\r\n    // disconnect events\r\n    cleanup();\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  domContentLoaded = function() {\r\n\r\n    if (didDCLoaded) return false;\r\n\r\n    didDCLoaded = true;\r\n\r\n    // assign top-level soundManager properties eg. soundManager.url\r\n    setProperties();\r\n\r\n    initDebug();\r\n\r\n    if (!hasFlash && sm2.hasHTML5) {\r\n\r\n      sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);\r\n\r\n      sm2.setup({\r\n        useHTML5Audio: true,\r\n        // make sure we aren't preferring flash, either\r\n        // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.\r\n        preferFlash: false\r\n      });\r\n\r\n    }\r\n\r\n    testHTML5();\r\n\r\n    if (!hasFlash && needsFlash) {\r\n\r\n      messages.push(strings.needFlash);\r\n\r\n      // TODO: Fatal here vs. timeout approach, etc.\r\n      // hack: fail sooner.\r\n      sm2.setup({\r\n        flashLoadTimeout: 1\r\n      });\r\n\r\n    }\r\n\r\n    if (doc.removeEventListener) {\r\n      doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);\r\n    }\r\n\r\n    initMovie();\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  domContentLoadedIE = function() {\r\n\r\n    if (doc.readyState === 'complete') {\r\n      domContentLoaded();\r\n      doc.detachEvent('onreadystatechange', domContentLoadedIE);\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  winOnLoad = function() {\r\n\r\n    // catch edge case of initComplete() firing after window.load()\r\n    windowLoaded = true;\r\n\r\n    // catch case where DOMContentLoaded has been sent, but we're still in doc.readyState = 'interactive'\r\n    domContentLoaded();\r\n\r\n    event.remove(window, 'load', winOnLoad);\r\n\r\n  };\r\n\r\n  // sniff up-front\r\n  detectFlash();\r\n\r\n  // focus and window load, init (primarily flash-driven)\r\n  event.add(window, 'focus', handleFocus);\r\n  event.add(window, 'load', delayWaitForEI);\r\n  event.add(window, 'load', winOnLoad);\r\n\r\n  if (doc.addEventListener) {\r\n\r\n    doc.addEventListener('DOMContentLoaded', domContentLoaded, false);\r\n\r\n  } else if (doc.attachEvent) {\r\n\r\n    doc.attachEvent('onreadystatechange', domContentLoadedIE);\r\n\r\n  } else {\r\n\r\n    // no add/attachevent support - safe to assume no JS -> Flash either\r\n    debugTS('onload', false);\r\n    catchError({\r\n      type: 'NO_DOM2_EVENTS',\r\n      fatal: true\r\n    });\r\n\r\n  }\r\n\r\n} // SoundManager()\r\n\r\n// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading\r\n\r\nif (window.SM2_DEFER === _undefined || !SM2_DEFER) {\r\n  soundManager = new SoundManager();\r\n}\r\n\r\n/**\r\n * SoundManager public interfaces\r\n * ------------------------------\r\n */\r\n\r\nif ( true && module && typeof module.exports === 'object') {\r\n\r\n  /**\r\n   * commonJS module\r\n   */\r\n\r\n  module.exports.SoundManager = SoundManager;\r\n  module.exports.soundManager = soundManager;\r\n\r\n} else if (true) {\r\n\r\n  /**\r\n   * AMD - requireJS\r\n   * basic usage:\r\n   * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n   *   SoundManager.getInstance().setup({\r\n   *     url: '/swf/',\r\n   *     onready: function() { ... }\r\n   *   })\r\n   * });\r\n   *\r\n   * SM2_DEFER usage:\r\n   * window.SM2_DEFER = true;\r\n   * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n   *   SoundManager.getInstance(function() {\r\n   *     var soundManager = new SoundManager.constructor();\r\n   *     soundManager.setup({\r\n   *       url: '/swf/',\r\n   *       ...\r\n   *     });\r\n   *     ...\r\n   *     soundManager.beginDelayedInit();\r\n   *     return soundManager;\r\n   *   })\r\n   * });\r\n   */\r\n\r\n  !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n    /**\r\n     * Retrieve the global instance of SoundManager.\r\n     * If a global instance does not exist it can be created using a callback.\r\n     *\r\n     * @param {Function} smBuilder Optional: Callback used to create a new SoundManager instance\r\n     * @return {SoundManager} The global SoundManager instance\r\n     */\r\n    function getInstance(smBuilder) {\r\n      if (!window.soundManager && smBuilder instanceof Function) {\r\n        var instance = smBuilder(SoundManager);\r\n        if (instance instanceof SoundManager) {\r\n          window.soundManager = instance;\r\n        }\r\n      }\r\n      return window.soundManager;\r\n    }\r\n    return {\r\n      constructor: SoundManager,\r\n      getInstance: getInstance\r\n    };\r\n  }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n}\r\n\r\n// standard browser case\r\n\r\n// constructor\r\nwindow.SoundManager = SoundManager;\r\n\r\n/**\r\n * note: SM2 requires a window global due to Flash, which makes calls to window.soundManager.\r\n * Flash may not always be needed, but this is not known until async init and SM2 may even \"reboot\" into Flash mode.\r\n */\r\n\r\n// public API, flash callbacks etc.\r\nwindow.soundManager = soundManager;\r\n\r\n}(window));\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/soundmanager2/script/soundmanager2.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js":
-/*!****************************************************************************!*\
-  !*** ./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js ***!
-  \****************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar isProduction = \"development\" === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n    if (condition) {\n        return;\n    }\n    if (isProduction) {\n        throw new Error(prefix);\n    }\n    throw new Error(prefix + \": \" + (message || ''));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (invariant);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js":
-/*!************************************************************************!*\
-  !*** ./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js ***!
-  \************************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nvar isProduction = \"development\" === 'production';\nfunction warning(condition, message) {\n  if (!isProduction) {\n    if (condition) {\n      return;\n    }\n\n    var text = \"Warning: \" + message;\n\n    if (typeof console !== 'undefined') {\n      console.warn(text);\n    }\n\n    try {\n      throw Error(text);\n    } catch (x) {}\n  }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (warning);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/to-array/index.js":
-/*!****************************************************!*\
-  !*** ./jaas-client/node_modules/to-array/index.js ***!
-  \****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/to-array/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/value-equal/esm/value-equal.js":
-/*!*****************************************************************!*\
-  !*** ./jaas-client/node_modules/value-equal/esm/value-equal.js ***!
-  \*****************************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\nfunction valueOf(obj) {\n  return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);\n}\n\nfunction valueEqual(a, b) {\n  // Test for strict equality first.\n  if (a === b) return true;\n\n  // Otherwise, if either of them == null they are not equal.\n  if (a == null || b == null) return false;\n\n  if (Array.isArray(a)) {\n    return (\n      Array.isArray(b) &&\n      a.length === b.length &&\n      a.every(function(item, index) {\n        return valueEqual(item, b[index]);\n      })\n    );\n  }\n\n  if (typeof a === 'object' || typeof b === 'object') {\n    var aValue = valueOf(a);\n    var bValue = valueOf(b);\n\n    if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);\n\n    return Object.keys(Object.assign({}, a, b)).every(function(key) {\n      return valueEqual(a[key], b[key]);\n    });\n  }\n\n  return false;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (valueEqual);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/value-equal/esm/value-equal.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/node_modules/yeast/index.js":
-/*!*************************************************!*\
-  !*** ./jaas-client/node_modules/yeast/index.js ***!
-  \*************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/yeast/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/App.css":
-/*!*********************************!*\
-  !*** ./jaas-client/src/App.css ***!
-  \*********************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("var api = __webpack_require__(/*! ../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n            var content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js!./App.css */ \"./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css\");\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};\n\n//# sourceURL=webpack:///./jaas-client/src/App.css?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/App.js":
-/*!********************************!*\
-  !*** ./jaas-client/src/App.js ***!
-  \********************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.css */ \"./jaas-client/src/App.css\");\n/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_App_css__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var _pages_index_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pages/index.jsx */ \"./jaas-client/src/pages/index.jsx\");\n/* harmony import */ var _pages_jaas_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pages/jaas.jsx */ \"./jaas-client/src/pages/jaas.jsx\");\n/* harmony import */ var _pages_404_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pages/404.jsx */ \"./jaas-client/src/pages/404.jsx\");\n/*\n  Company: Savoir-faire Linux\n  Author: Larbi Gharib <larbi.gharib@savoirfairelinux.com>\n  UI Project inspired from https://scrimba.com/p/pbNpTv/cbZBmfV\n  License: AGPL-3\n*/\n //import logo from './logo.svg';\n\n\n\n\n\n\n\nclass App extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"BrowserRouter\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Switch\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      exact: true,\n      path: \"/\",\n      component: _pages_index_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      to: \"/Jaas\",\n      component: _pages_jaas_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      exact: true,\n      path: \"/404\",\n      component: _pages_404_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Redirect\"], {\n      to: \"/404\"\n    })));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (App);\n\n//# sourceURL=webpack:///./jaas-client/src/App.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/ContactList.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/src/components/ContactList.js ***!
-  \***************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nclass ContactList extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"rooms-list\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"h3\", null, \"Liste de contacts\")));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ContactList);\n\n//# sourceURL=webpack:///./jaas-client/src/components/ContactList.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/Header.js":
-/*!**********************************************!*\
-  !*** ./jaas-client/src/components/Header.js ***!
-  \**********************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Header; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _material_ui_core_Button__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/core/Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/index.js\");\n/* harmony import */ var _material_ui_core_Menu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/core/Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js\");\n/* harmony import */ var _material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/core/MenuItem */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n\n\n\n\n\nfunction Header() {\n  const history = Object(react_router_dom__WEBPACK_IMPORTED_MODULE_4__[\"useHistory\"])();\n  const [anchorEl, setAnchorEl] = react__WEBPACK_IMPORTED_MODULE_0___default.a.useState(null);\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const disconnect = () => {\n    let path = `/`;\n    history.push(path);\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Button__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n    \"aria-controls\": \"simple-menu\",\n    \"aria-haspopup\": \"true\",\n    onClick: handleClick\n  }, \"Menu\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Menu__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n    id: \"simple-menu\",\n    anchorEl: anchorEl,\n    keepMounted: true,\n    open: Boolean(anchorEl),\n    onClose: handleClose\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: handleClose\n  }, \"Profile\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: handleClose\n  }, \"Mon compte\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: disconnect\n  }, \"D\\xE9connexion\")));\n}\n\n//# sourceURL=webpack:///./jaas-client/src/components/Header.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/Message.js":
-/*!***********************************************!*\
-  !*** ./jaas-client/src/components/Message.js ***!
-  \***********************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nfunction Message(props) {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message\"\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message-username\"\n  }, props.username), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message-text\"\n  }, props.text));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Message);\n\n//# sourceURL=webpack:///./jaas-client/src/components/Message.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/MessageList.js":
-/*!***************************************************!*\
-  !*** ./jaas-client/src/components/MessageList.js ***!
-  \***************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Message */ \"./jaas-client/src/components/Message.js\");\n\n\n\nclass MessageList extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"message-list\"\n    }, this.props.messages.map((message, index) => {\n      /*DUMMY_DATA.map((message, index) => {*/\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Message__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n        key: index,\n        username: message.senderId,\n        text: message.text\n      });\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (MessageList);\n\n//# sourceURL=webpack:///./jaas-client/src/components/MessageList.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/NewContactForm.js":
-/*!******************************************************!*\
-  !*** ./jaas-client/src/components/NewContactForm.js ***!
-  \******************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nclass NewContactForm extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"new-room-form\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"form\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n      type: \"text\",\n      placeholder: \"Ajouter un contact\",\n      required: true\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n      id: \"create-room-btn\",\n      type: \"submit\"\n    }, \"+\")));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (NewContactForm);\n\n//# sourceURL=webpack:///./jaas-client/src/components/NewContactForm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/components/SendMessageForm.js":
-/*!*******************************************************!*\
-  !*** ./jaas-client/src/components/SendMessageForm.js ***!
-  \*******************************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_input_emoji__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-input-emoji */ \"./jaas-client/node_modules/react-input-emoji/dist/index.es.js\");\n\n\n\nclass SendMessageForm extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      message: ''\n    };\n    this.handleChange = this.handleChange.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleChange(e) {\n    this.setState({\n      message: e\n    });\n  }\n\n  handleSubmit(e) {\n    //e.preventDefault()\n    this.props.sendMessage(this.state.message); //this.props.sendMessage(this.state.message)\n\n    this.setState({\n      message: ''\n    });\n  }\n\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      //onSubmit={this.handleSubmit}\n      className: \"send-message-form\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_input_emoji__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n      disabled: this.props.disabled,\n      onChange: this.handleChange,\n      value: this.state.message,\n      cleanOnEnter: true,\n      onEnter: this.handleSubmit,\n      placeholder: \"\\xC9cris ton message et cliques sur Entrer\",\n      height: \"35\"\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SendMessageForm);\n\n//# sourceURL=webpack:///./jaas-client/src/components/SendMessageForm.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/index.css":
-/*!***********************************!*\
-  !*** ./jaas-client/src/index.css ***!
-  \***********************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("var api = __webpack_require__(/*! ../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n            var content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js!./index.css */ \"./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css\");\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};\n\n//# sourceURL=webpack:///./jaas-client/src/index.css?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/index.js":
-/*!**********************************!*\
-  !*** ./jaas-client/src/index.js ***!
-  \**********************************/
-/*! no exports provided */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.css */ \"./jaas-client/src/index.css\");\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_index_css__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./App */ \"./jaas-client/src/App.js\");\n/* harmony import */ var _serviceWorker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./serviceWorker */ \"./jaas-client/src/serviceWorker.js\");\n\n\n\n\n\nreact_dom__WEBPACK_IMPORTED_MODULE_1___default.a.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.StrictMode, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_App__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null)), document.getElementById('root')); // If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n\n_serviceWorker__WEBPACK_IMPORTED_MODULE_4__[\"unregister\"]();\n\n//# sourceURL=webpack:///./jaas-client/src/index.js?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/pages/404.jsx":
-/*!***************************************!*\
-  !*** ./jaas-client/src/pages/404.jsx ***!
-  \***************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst NotFoundPage = () => {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"h3\", null, \"404 Page not found\"));\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (NotFoundPage);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/404.jsx?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/pages/index.jsx":
-/*!*****************************************!*\
-  !*** ./jaas-client/src/pages/index.jsx ***!
-  \*****************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _material_ui_core_Avatar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/core/Avatar */ \"./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js\");\n/* harmony import */ var _material_ui_core_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/core/Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/index.js\");\n/* harmony import */ var _material_ui_core_CssBaseline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/core/CssBaseline */ \"./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js\");\n/* harmony import */ var _material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/core/TextField */ \"./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js\");\n/* harmony import */ var _material_ui_core_FormControlLabel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/core/FormControlLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js\");\n/* harmony import */ var _material_ui_core_Checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/core/Checkbox */ \"./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js\");\n/* harmony import */ var _material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @material-ui/core/Link */ \"./jaas-client/node_modules/@material-ui/core/esm/Link/index.js\");\n/* harmony import */ var _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @material-ui/core/Grid */ \"./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js\");\n/* harmony import */ var _material_ui_core_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @material-ui/core/Box */ \"./jaas-client/node_modules/@material-ui/core/esm/Box/index.js\");\n/* harmony import */ var _material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @material-ui/icons/LockOutlined */ \"./jaas-client/node_modules/@material-ui/icons/LockOutlined.js\");\n/* harmony import */ var _material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @material-ui/core/Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n/* harmony import */ var _material_ui_core_Container__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @material-ui/core/Container */ \"./jaas-client/node_modules/@material-ui/core/esm/Container/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var _material_ui_core_CircularProgress__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @material-ui/core/CircularProgress */ \"./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js\");\n/* harmony import */ var _material_ui_core_DialogTitle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @material-ui/core/DialogTitle */ \"./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js\");\n/* harmony import */ var _material_ui_core_Dialog__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @material-ui/core/Dialog */ \"./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n //import { makeStyles } from '@material-ui/core/styles';\n\n\n\n\n\n\n\nfunction Copyright() {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n    variant: \"body2\",\n    color: \"textSecondary\",\n    align: \"center\"\n  }, 'Copyright © 2016-', new Date().getFullYear(), ' Savoir-faire Linux Inc. GNU ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n    color: \"inherit\",\n    href: \"https://jami.net/\"\n  }, \"Jami.net\"), ' ', '.');\n}\n/*const useStyles = makeStyles((theme) => ({\n    paper: {\n        marginTop: theme.spacing(8),\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n    },\n    avatar: {\n        margin: theme.spacing(1),\n        backgroundColor: theme.palette.secondary.main,\n    },\n    form: {\n        width: '100%', // Fix IE 11 issue.\n        marginTop: theme.spacing(1),\n    },\n    submit: {\n        margin: theme.spacing(3, 0, 2),\n    },\n}));*/\n\n/*function SignIn() {\n    const classes = useStyles();\n\n\n}*/\n\n/* \n    TODO:\n    Use useState to handle username password and redirect states to render this page to \n    comply with material-ui usage of useStyles\n    Src: https://blog.logrocket.com/a-guide-to-usestate-in-react-ecb9952e406c/\n*/\n\n\nclass SignInPage extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      username: '',\n      password: '',\n      redirect: false,\n      session: null,\n      submitted: false,\n      loading: false,\n      error: false,\n      open: false,\n      errorMessage: ''\n    };\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleusername(text) {\n    this.setState({\n      username: text.target.value\n    });\n  }\n\n  handlePassword(text) {\n    this.setState({\n      password: text.target.value\n    });\n  }\n\n  handleSubmit(event) {\n    event.preventDefault();\n    let obj = {};\n    obj.username = this.state.username;\n    obj.password = this.state.password;\n    this.setState({\n      submitted: true,\n      loading: true\n    });\n    fetch('/api/login?username=' + obj.username + '&password=' + obj.password, {\n      header: {\n        \"Content-Type\": \"application/json\"\n      },\n      method: \"POST\",\n      credentials: 'same-origin' //body: JSON.stringify({ obj })\n\n    }).then(res => {\n      if (res.status == '200') {\n        this.setState({\n          redirect: true\n        });\n      } else if (res.status == '401') {\n        this.setState({\n          loading: false,\n          error: true,\n          open: true,\n          errorMessage: \"Wrong credentials! Your are not allowed to connect\"\n        });\n      } //this.setState({ session: res });\n\n    }).catch(e => {\n      this.setState({\n        loading: false,\n        error: true,\n        open: true,\n        errorMessage: e.toString()\n      });\n    });\n  }\n\n  render() {\n    if (this.state.redirect) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_13__[\"Redirect\"], {\n        to: \"/jaas\"\n      });\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Container__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n      component: \"main\",\n      maxWidth: \"xs\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_CssBaseline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"\"\n      /*{classes.paper}*/\n\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n      component: \"h1\",\n      variant: \"h5\"\n    }, \"Se connecter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"form\", {\n      className: \"\"\n      /*{classes.form}*/\n      ,\n      onSubmit: this.handleSubmit\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      variant: \"outlined\",\n      margin: \"normal\",\n      required: true,\n      fullWidth: true,\n      id: \"username\",\n      label: \"LDAP Savoir-faire Linux\",\n      name: \"username\",\n      autoComplete: \"email\",\n      autoFocus: true,\n      onChange: text => {\n        this.handleusername(text);\n      }\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      variant: \"outlined\",\n      margin: \"normal\",\n      required: true,\n      fullWidth: true,\n      name: \"password\",\n      label: \"Mot de passe\",\n      type: \"password\",\n      id: \"password\",\n      autoComplete: \"current-password\",\n      onChange: text => {\n        this.handlePassword(text);\n      }\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_FormControlLabel__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n      control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Checkbox__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n        value: \"remember\",\n        color: \"primary\"\n      }),\n      label: \"Se rapeller de moi\"\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n      type: \"submit\",\n      fullWidth: true,\n      variant: \"contained\",\n      color: \"primary\",\n      className: \"\"\n      /*{classes.submit}*/\n      // onClick={() => { this.login() }}\n\n    }, \"Se connecter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      container: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      item: true,\n      xs: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n      href: \"#\",\n      variant: \"body2\"\n    }, \"Mot de passe oubli\\xE9 ?\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      item: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n      href: \"#\",\n      variant: \"body2\"\n    }, \"Tu n'as pas de compte? Inscris-toi\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n      mt: 8\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Copyright, null)), this.state.submitted && this.state.loading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_CircularProgress__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n      style: {\n        position: 'relative'\n      },\n      size: 40,\n      top: 10,\n      style: {\n        marginLeft: '50%'\n      }\n    }), this.state.error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Dialog__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n      \"aria-labelledby\": \"simple-dialog-title\",\n      open: this.state.open\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_DialogTitle__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n      id: \"simple-dialog-title\"\n    }, this.state.errorMessage)));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SignInPage);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/index.jsx?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/pages/jaas.jsx":
-/*!****************************************!*\
-  !*** ./jaas-client/src/pages/jaas.jsx ***!
-  \****************************************/
-/*! exports provided: default */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/Header */ \"./jaas-client/src/components/Header.js\");\n/* harmony import */ var _components_ContactList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ContactList */ \"./jaas-client/src/components/ContactList.js\");\n/* harmony import */ var _components_MessageList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/MessageList */ \"./jaas-client/src/components/MessageList.js\");\n/* harmony import */ var _components_SendMessageForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/SendMessageForm */ \"./jaas-client/src/components/SendMessageForm.js\");\n/* harmony import */ var _components_NewContactForm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/NewContactForm */ \"./jaas-client/src/components/NewContactForm.js\");\n/* harmony import */ var react_sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-sound */ \"./jaas-client/node_modules/react-sound/lib/index.js\");\n/* harmony import */ var react_sound__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_sound__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! socket.io-client */ \"./jaas-client/node_modules/socket.io-client/lib/index.js\");\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(socket_io_client__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\nvar socket = socket_io_client__WEBPACK_IMPORTED_MODULE_7___default.a.connect('http://localhost:3000');\n\nclass Jaas extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      messages: [],\n      sound: false\n    };\n    socket.on('connect', () => {\n      console.log(\"Success !\");\n    }); //import io from 'socket.io-client';\n    //this.socket = socketIOClient(ENDPOINT);\n    //this.socket.on(\"FromAPI\", data => {\n    //  this.setState({\n    //    messages: [...this.state.messages, data]\n    //  })\n    //});\n\n    this.sendMessage = this.sendMessage.bind(this);\n  }\n\n  componentDidMount() {\n    socket.on('receivedMessage', data => {\n      var message = {\n        senderId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',\n        text: data\n      };\n      this.setState({\n        messages: [...this.state.messages, message],\n        sound: true\n      });\n    });\n  }\n\n  sendMessage(text) {\n    var data = {\n      senderId: 'Me',\n      destinationId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',\n      text: text\n    };\n    socket.emit(\"SendMessage\", data);\n    console.log(data.text);\n    this.setState({\n      messages: [...this.state.messages, data],\n      sound: false\n    });\n  }\n\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"app\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Header__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContactList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_MessageList__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n      messages: this.state.messages\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_SendMessageForm__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      sendMessage: this.sendMessage\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_NewContactForm__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), this.state.sound && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_sound__WEBPACK_IMPORTED_MODULE_6___default.a, {\n      url: \"stairs.mp3\"\n      /*https://notificationsounds.com/message-tones/stairs-567*/\n      ,\n      playStatus: react_sound__WEBPACK_IMPORTED_MODULE_6___default.a.status.PLAYING,\n      playFromPosition: 0\n      /* in milliseconds */\n      ,\n      onLoading: this.handleSongLoading,\n      onPlaying: this.handleSongPlaying,\n      onFinishedPlaying: this.handleSongFinishedPlaying\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Jaas);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/jaas.jsx?");
-
-/***/ }),
-
-/***/ "./jaas-client/src/serviceWorker.js":
-/*!******************************************!*\
-  !*** ./jaas-client/src/serviceWorker.js ***!
-  \******************************************/
-/*! exports provided: register, unregister */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"register\", function() { return register; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unregister\", function() { return unregister; });\n// This optional code is used to register a service worker.\n// register() is not called by default.\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\nconst isLocalhost = Boolean(window.location.hostname === 'localhost' || // [::1] is the IPv6 localhost address.\nwindow.location.hostname === '[::1]' || // 127.0.0.0/8 are considered localhost for IPv4.\nwindow.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));\nfunction register(config) {\n  if (false) {}\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker.register(swUrl).then(registration => {\n    registration.onupdatefound = () => {\n      const installingWorker = registration.installing;\n\n      if (installingWorker == null) {\n        return;\n      }\n\n      installingWorker.onstatechange = () => {\n        if (installingWorker.state === 'installed') {\n          if (navigator.serviceWorker.controller) {\n            // At this point, the updated precached content has been fetched,\n            // but the previous service worker will still serve the older\n            // content until all client tabs are closed.\n            console.log('New content is available and will be used when all ' + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'); // Execute callback\n\n            if (config && config.onUpdate) {\n              config.onUpdate(registration);\n            }\n          } else {\n            // At this point, everything has been precached.\n            // It's the perfect time to display a\n            // \"Content is cached for offline use.\" message.\n            console.log('Content is cached for offline use.'); // Execute callback\n\n            if (config && config.onSuccess) {\n              config.onSuccess(registration);\n            }\n          }\n        }\n      };\n    };\n  }).catch(error => {\n    console.error('Error during service worker registration:', error);\n  });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: {\n      'Service-Worker': 'script'\n    }\n  }).then(response => {\n    // Ensure service worker exists, and that we really are getting a JS file.\n    const contentType = response.headers.get('content-type');\n\n    if (response.status === 404 || contentType != null && contentType.indexOf('javascript') === -1) {\n      // No service worker found. Probably a different app. Reload the page.\n      navigator.serviceWorker.ready.then(registration => {\n        registration.unregister().then(() => {\n          window.location.reload();\n        });\n      });\n    } else {\n      // Service worker found. Proceed as normal.\n      registerValidSW(swUrl, config);\n    }\n  }).catch(() => {\n    console.log('No internet connection found. App is running in offline mode.');\n  });\n}\n\nfunction unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    }).catch(error => {\n      console.error(error.message);\n    });\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/src/serviceWorker.js?");
-
-/***/ }),
-
-/***/ "./node_modules/base64-js/index.js":
-/*!*****************************************!*\
-  !*** ./node_modules/base64-js/index.js ***!
-  \*****************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n\n\n//# sourceURL=webpack:///./node_modules/base64-js/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/buffer/index.js":
-/*!**************************************!*\
-  !*** ./node_modules/buffer/index.js ***!
-  \**************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n\n\nvar base64 = __webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\")\nvar ieee754 = __webpack_require__(/*! ieee754 */ \"./node_modules/ieee754/index.js\")\nvar isArray = __webpack_require__(/*! isarray */ \"./node_modules/isarray/index.js\")\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./node_modules/buffer/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css":
-/*!***********************************************************************!*\
-  !*** ./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css ***!
-  \***********************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \".App {\\n  text-align: center;\\n}\\n\\n.App-logo {\\n  height: 40vmin;\\n  pointer-events: none;\\n}\\n\\n@media (prefers-reduced-motion: no-preference) {\\n  .App-logo {\\n    animation: App-logo-spin infinite 20s linear;\\n  }\\n}\\n\\n.App-header {\\n  background-color: #282c34;\\n  min-height: 100vh;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  font-size: calc(10px + 2vmin);\\n  color: white;\\n}\\n\\n.App-link {\\n  color: #61dafb;\\n}\\n\\n@keyframes App-logo-spin {\\n  from {\\n    transform: rotate(0deg);\\n  }\\n  to {\\n    transform: rotate(360deg);\\n  }\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./jaas-client/src/App.css?./node_modules/css-loader/dist/cjs.js");
-
-/***/ }),
-
-/***/ "./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css":
-/*!*************************************************************************!*\
-  !*** ./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css ***!
-  \*************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \":root {\\n  --main-color: #1F1F1F;\\n  --secondary-color: white;\\n  --third-color: #2F2F2F;\\n  --main-text-color: #3e5869;\\n  --secondary-text-color: #b0c7d6;\\n  --send-message-form: #F5F5F5;\\n}\\n\\nhtml, body {\\n  height: 100%;\\n  margin: 0;\\n  padding: 0;\\n  font-family: 'Open Sans', sans-serif;\\n  font-weight: 200;\\n  color: #3e5869; \\n}\\n\\n#root {\\n  height: 100%;\\n}\\n\\n.app {\\n  display: grid;\\n  height: 100%;\\n  grid-template-columns: repeat(6, 1fr);\\n  grid-template-rows: 40px 1fr 1fr 1fr 1fr 1fr 60px;\\n  grid-template-areas: \\n      \\\"h h h h h h\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"n s s s s s\\\";\\n}\\n\\n.login {\\n  background-color: var(--main-color);\\n}\\n\\n.header-section {\\n  grid-area: h;\\n}\\n\\n.new-room-form {\\n  grid-area: n;\\n}\\n\\n.rooms-list {\\n  grid-area: r;\\n}\\n\\n.message-list {\\n  grid-area: m;\\n}\\n\\n.send-message-form {\\n  grid-area: s;\\n}\\n\\n/* REST OF CSS */\\n\\n.header-section {\\n  background-color: var(--main-color);\\n\\n}\\n\\n.simple-menu {\\n  color: var(--send-message-form);\\n}\\n\\n.rooms-list {\\n  box-sizing: border-box;\\n  padding: 10px;\\n  background-color: var(--main-color);\\n  overflow: scroll;\\n  height: 100%;\\n}\\n\\n.rooms-list ul {\\n  list-style-type: none;    \\n  padding: 0;\\n  overflow: scoll;\\n}\\n\\n.rooms-list li {\\n  margin: 10px 0;\\n}\\n\\n.rooms-list h3 {\\n  margin: 5px 0;\\n  color: var(--secondary-color);\\n}\\n\\n.rooms-list .room a {\\n  color: var(--secondary-text-color);\\n  font-weight: 600;\\n  text-decoration: none;\\n  \\n}\\n\\n.rooms-list .room.active a {\\n  color: var(--secondary-color);\\n}\\n\\n.new-room-form {\\n  padding: 0 5px;\\n  background: var(--secondary-color);\\n  color: var(--main-text-color);\\n}\\n\\n.new-room-form form {\\n  height: 100%;\\n  display: flex;\\n  justify-content: space-between;\\n  align-items: center;\\n}\\n\\n.new-room-form input {\\n  width: 135px;\\n  background: var(--secondary-color);\\n}\\n\\n.new-room-form button {\\n  background: var(--secondary-color);\\n  color: var(--main-text-color);\\n  border: 0;\\n} \\n\\n.new-room-form input::placeholder {\\n  color: var(--main-text-color);\\n  font-weight: 200;\\n}\\n\\n.new-room-form input:focus {\\n  outline-width: 0;\\n}\\n\\n.new-room-form input {\\n  border: 0;\\n}\\n\\n.new-room-form button {\\n  border: 0;\\n}\\n\\n.message {\\n  margin: 15px 0;\\n}\\n\\n.message .message-username {\\n  font-size: 11px;\\n  font-weight: bold;\\n  color: var(--secondary-color);\\n  opacity: 0.9;\\n  margin-bottom: 6px;\\n}\\n.message .message-text {\\n  background: var(--third-color);\\n  color: var(--secondary-color);\\n  display: inline;\\n  padding: 4px 8px;\\n  border-radius: 8px;\\n}\\n\\n.message-list {\\n  box-sizing: border-box;\\n  padding-left: 6px;\\n  width: 100%;\\n  height: 100%;\\n  overflow: scroll;\\n  background: var(--third-color);\\n}\\n\\n.message-list .join-room {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n  height: 100%;\\n  font-size: 34px;\\n  font-weight: 300;\\n}\\n\\n.send-message-form {\\n  background: var(--send-message-form);\\n  display: flex;\\n}\\n\\n.send-message-form input {\\n  width: 100%;\\n  padding: 15px 10px;\\n  margin: 0;\\n  border-style: none;\\n  background: var(--send-message-form);\\n  font-weight: 200;\\n\\n}\\n\\n.send-message-form input:focus {\\n  outline-width: 0;\\n}\\n\\n.send-message-form input::placeholder {\\n  color: var(--main-text-color);\\n}\\n\\n.help-text {\\n  position: absolute;\\n  top: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./jaas-client/src/index.css?./node_modules/css-loader/dist/cjs.js");
-
-/***/ }),
-
-/***/ "./node_modules/css-loader/dist/runtime/api.js":
-/*!*****************************************************!*\
-  !*** ./node_modules/css-loader/dist/runtime/api.js ***!
-  \*****************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item, useSourceMap);\n\n      if (item[2]) {\n        return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n      }\n\n      return content;\n    }).join('');\n  }; // import a list of modules into the list\n  // eslint-disable-next-line func-names\n\n\n  list.i = function (modules, mediaQuery, dedupe) {\n    if (typeof modules === 'string') {\n      // eslint-disable-next-line no-param-reassign\n      modules = [[null, modules, '']];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var i = 0; i < this.length; i++) {\n        // eslint-disable-next-line prefer-destructuring\n        var id = this[i][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _i = 0; _i < modules.length; _i++) {\n      var item = [].concat(modules[_i]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      if (mediaQuery) {\n        if (!item[2]) {\n          item[2] = mediaQuery;\n        } else {\n          item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n  var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n  var cssMapping = item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (useSourceMap && typeof btoa === 'function') {\n    var sourceMapping = toComment(cssMapping);\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n  }\n\n  return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n  // eslint-disable-next-line no-undef\n  var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n  var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n  return \"/*# \".concat(data, \" */\");\n}\n\n//# sourceURL=webpack:///./node_modules/css-loader/dist/runtime/api.js?");
-
-/***/ }),
-
-/***/ "./node_modules/ieee754/index.js":
-/*!***************************************!*\
-  !*** ./node_modules/ieee754/index.js ***!
-  \***************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n\n//# sourceURL=webpack:///./node_modules/ieee754/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/isarray/index.js":
-/*!***************************************!*\
-  !*** ./node_modules/isarray/index.js ***!
-  \***************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./node_modules/isarray/index.js?");
-
-/***/ }),
-
-/***/ "./node_modules/process/browser.js":
-/*!*****************************************!*\
-  !*** ./node_modules/process/browser.js ***!
-  \*****************************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n//# sourceURL=webpack:///./node_modules/process/browser.js?");
-
-/***/ }),
-
-/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
-/*!****************************************************************************!*\
-  !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
-  \****************************************************************************/
-/*! no static exports found */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-eval("\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce =  true ? __webpack_require__.nc : undefined;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && btoa) {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};\n\n//# sourceURL=webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js?");
-
-/***/ }),
-
-/***/ "./node_modules/webpack/buildin/global.js":
-/*!***********************************!*\
-  !*** (webpack)/buildin/global.js ***!
-  \***********************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?");
-
-/***/ }),
-
-/***/ "./node_modules/webpack/buildin/module.js":
-/*!***********************************!*\
-  !*** (webpack)/buildin/module.js ***!
-  \***********************************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/module.js?");
-
-/***/ }),
-
-/***/ 0:
-/*!********************!*\
-  !*** ws (ignored) ***!
-  \********************/
-/*! no static exports found */
-/***/ (function(module, exports) {
-
-eval("/* (ignored) */\n\n//# sourceURL=webpack:///ws_(ignored)?");
-
-/***/ })
-
-/******/ });
\ No newline at end of file
